보통 데이터베이스에서 가져온 데이터를 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에 데이터를 보여주게 된다.
지금까지의 소스는 아래의 파일을 참조하자.
'WinForm > Grid Control 만들기' 카테고리의 다른 글
23. Calendar 일자별 Column Header 그리기 (0) | 2019.10.01 |
---|---|
22. 새로운 Grid 유형 추가를 위한 사전 작업 (0) | 2019.09.26 |
20. WANIGrid Control 디자인 모드 오류 및 보완 (0) | 2019.09.06 |
19. WANIGrid Control의 열(Column) 고정 기능 추가 및 보완 (0) | 2019.09.03 |
18. WinForm 소스 파일을 부분클래스(Partial Class)로 분할하기 (2) | 2019.08.26 |