반응형

보통 데이터베이스에서 가져온 데이터를 Grid Control에 보여주게 된다.

WANIGrid Control의 DataSource Property에 DataTable을 할당할 수 있도록 기능을 추가하도록 하겠다.

Oracle 또는 MS SQL 등에서 쿼리나 프로시저 등을 이용해서 데이터를 가져올 때 DataTable 또는 DataSet으로 결과 값을 할당해서 반환하게 된다.

데이터베이스에서 가져온 값, 즉 DataTable을 바로 WANIGrid Control의 Property인 DataSource에 할당함으로써 DB에서 가져온 값을 WANIGrid Control에 Display할 수 있게 된다.

 

먼저 Header.cs 파일에서 컬럼(Column)에 대한 수정 여부를 설정할 수 있는 변수와 Property를 추가하도록 한다.

    private bool editable = true;   //컬럼 편집여부

      :

    public bool Editable
    {
        get { return editable; }
        set { editable = value; }
    }

 

그리고 DefaultHeader.cs 파일에 Editable 값을 파라미터 받는 생성자를 하나 더 추가하도록 한다.

    public DefaultHeader(string fieldName, string title, int width, HorizontalAlignment headAlign, HorizontalAlignment txtAlign, 

                               bool visible, bool editable)
    {
        this.ColumnId = fieldName;
        this.Title = title;
        this.Width = width;
        this.HeadAlign = headAlign;
        this.TextAlign = txtAlign;
        this.Visible = visible;
        this.Editable = editable;
    }

 

WANIGrid.Method.cs 파일을 열어서 기능 추가 및 보완을 하도록 한다.

먼저 앞서 추가한 Editable Property의 값에 따라 특정 컬럼(Column)의 값을 변경할 수 있게 또는 변경할 수 없도록 체크 로직을 BeginEdit 메소드에 추가하도록 한다.

아래의 파란색 부분이 새롭게 추가된 영역이다.

    private void BeginEdit()
    {
        if (readOnly) return;
        if (grid.GridHeaderList[ActiveCell.Col].Editable == false) return;
        if (ActiveCell.Col != -1 && ActiveCell.Row != -1)
        {
            string tempStr = "";
            if (rows[ActiveCell.Row].DataRow[grid.GridHeaderList[ActiveCell.Col].ColumnId] != null)
            {
                tempStr = rows[ActiveCell.Row].DataRow[grid.GridHeaderList[ActiveCell.Col].ColumnId].ToString();
            }
            //TextBox에 입력된 값을 설정하고 TextBox 속성의 값을 설정한다.
            editBox.Text = tempStr;
            Rectangle r = GetSelectedCellRect(ActiveCell.Row, ActiveCell.Col);
            editBox.Left = r.Left + 3;
            editBox.Top = r.Top + 3;
            editBox.Height = r.Height;
            editBox.Width = r.Width - 3;
            editBox.Visible = true;
            editBox.TextAlign = grid.GridHeaderList[ActiveCell.Col].TextAlign;  //컬럼의 정렬형태에 따라 Text를 정렬
            editBox.Focus();
            ActiveCell_ActvieCol = ActiveCell.Col; //ActivieCell_ActiveCol 값을 설정   
        }
    }

 

DataBase에서 가져온 DataTable을 WANIGrid Control의 DataSource Property에 설정하는 메소드를 추가한다.

    public void SetDataTable(DataTable dt)
    {
        if (dt == null) return;
        if (dataSource.Rows.Count > 0)
        {             
            rows.Clear();
            allRowsHeight = 0;
        }
        int count = 0;
        foreach (DataRow row in dt.Rows)
        {
            Row r = new Row(row);
            rows.Insert(count, r);
            if (rowHeight == 0) rowHeight = Font.Height + 4;
            allRowsHeight += rowHeight;
            count++;
        }
        Invalidate();
    }

 

WINIGrid.cs파일을 열어서 SetDataTable 메소드를 호출해야 하는 DataSource Propery의 set 메소드에 아래와 같이 코드를 추가하도록 한다.

    public DataTable DataSource
    {
        get { return dataSource; }
        set {                
            dataSource = value;
            SetDataTable(dataSource);
        }
    }

 

DataTable 가져오기 기능을 통해서 WANIGrid Control에 실제 값들이 보여지도록 하고 보니 세로 스크롤바의 로직을 추가로 보완하게 되었다.

WANIGrid.Event.cs파일을 열어서 VScrollBar_Scroll 메소드를 아래와 같이 변경한다.

아래의 파란색 부분이 변경된 영역이다.

    private void VScrollBar_Scroll(object sender, ScrollEventArgs e)
    {
        EndEdit();
        firstVisibleRow = e.NewValue / rowHeight;            

        if (firstVisibleRow > (allRowsHeight / rowHeight) - (Height / rowHeight) + 5)
        {
            firstVisibleRow = (allRowsHeight / rowHeight) - (Height / rowHeight) + 5;
            grid.FirstVisibleRow = firstVisibleRow;
            vScrollBar.Value = vScrollBar.Maximum;
        }
        else
        {
            grid.FirstVisibleRow = firstVisibleRow;
            vScrollBar.Value = firstVisibleRow * rowHeight;                
        }

        CalcVisibleRange();
        ReCalcScrollBars();
        Invalidate();
    }

 

추가로 Mouse_Wheel 메소드 또한 아래의 파란색 부분과 같이 변경하도록 한다

    private void Mouse_Wheel(object sender, MouseEventArgs e)
    {
        EndEdit();
        //Control Key를 누르고 Wheel을 돌렸을 경우는 HScrollBar와 동일
        if (ModifierKeys == Keys.Control)
        {
            if ((e.Delta / 120) > 0)  //업의 경우에는 좌측으로 이동
            {
                firstVisibleCol -= 2;
                if (firstVisibleCol < 0) firstVisibleCol = 0;
                grid.FirstVisibleCol = firstVisibleCol;
                hScrollBar.Value = firstVisibleCol;
            }
            else //다운의 경우에는 우측으로 이동
            {
                firstVisibleCol += 2;
                if (firstVisibleCol >= (grid.GridHeaderList.Count - 1)) firstVisibleCol = grid.GridHeaderList.Count - 3;
                grid.FirstVisibleCol = firstVisibleCol;
                hScrollBar.Value = hScrollBar.Maximum;
            }
        }
        else //Wheel만 움직였을 경우에는 VScrollBar와 동일
        {
            if (firstVisibleRow < 0) return;

            if ((e.Delta / 120) > 0) //업의 경우 위쪽으로 이동
            {
                firstVisibleRow -= 2;
                if (firstVisibleRow < 0)
                {
                    firstVisibleRow = 0;
                    grid.FirstVisibleRow = firstVisibleRow;
                    vScrollBar.Value = 0;
                }
                else
                {
                    grid.FirstVisibleRow = firstVisibleRow;
                    vScrollBar.Value = firstVisibleRow * rowHeight;
                }
            }
            else //다운의 경우에는 아래쪽으로 이동
            {
                if (rowsCount == 0) return; // rowsCount가 0일 경우는 Row의 Height가 Control Height를 넘지 않았음
                firstVisibleRow += 2;
                if (firstVisibleRow > (allRowsHeight / rowHeight) - (Height / rowHeight) + 5)
                {
                    firstVisibleRow = rowsCount - (Height / rowHeight) + 5;
                    grid.FirstVisibleRow = firstVisibleRow;
                    vScrollBar.Value = vScrollBar.Maximum;
                }
                else
                {
                    grid.FirstVisibleRow = firstVisibleRow;
                    vScrollBar.Value = firstVisibleRow * rowHeight;
                }
            }
        }
        CalcVisibleRange();
        ReCalcScrollBars();
        Invalidate();
    }

 

WANIGridTest 프로젝트의 WANIGridTest.cs 파일을 열어서 DataTable에 데이터를 생성하기 위한 makeDataTable() 메소드를 추가하고, [DataTable 가져오기] 버튼을 추가한다.

WANIGridTest.cs 의 소스는 아래에 첨부한 소스를 참조하도록 하자.

[DataTable 가져오기] 버튼을 클릭하면 아래와 같이 WANIGrid Control에 데이터를 보여주게 된다.

[그림 21-1] DataTable 가져오기

지금까지의 소스는 아래의 파일을 참조하자.

WANI Grid_20190916.zip
0.49MB

 

반응형

+ Recent posts