새 데이터 표 소개
기본적인 데이터 바인딩
DataGridView에 익숙해지는 가장 효과적인 방법은 속성을 하나도 구성하지 않고 직접 사용해 보는 것입니다. DataGrid와 마찬가지로 DataSource 속성을 사용하여 DataTable 개체(또는 DataTable에서 파생된 개체)를 바인딩할 수 있습니다.
Dim ds As DataSet = GetDataSet()
DataGridView1.DataSource = ds.Tables("Customers")
DataGridView1.DataSource = ds
DataGridView1.DataMember = "Customers"
- 데이터 원본의 각 필드에 대해 한 열씩 만듭니다.
- 필드 이름을 사용하여 열 헤더를 만듭니다. 열 헤더는 고정되어 있어 사용자가 목록 아래로 이동해도 계속 볼 수 있습니다.
- Windows XP 방식의 표시 스타일을 지원합니다. 열 헤더는 세련된 평면 모양이며 사용자가 헤더 위로 마우스를 이동하면 강조 표시됩니다.
- 현재 위치 내 편집이 가능합니다. 사용자는 셀을 두 번 클릭하거나 F2 키를 눌러 현재 값을 수정할 수 있습니다. 유일한 예외는 필드의 DataColumn.ReadOnly가 true로 설정되어 있는 경우입니다(예: 현재 예제의 OrderID 필드).
- 자동 정렬을 지원합니다. 사용자는 열 헤더를 한 번 또는 두 번 클릭하여 해당 필드의 값을 기반으로 값 순서를 오름차순 또는 내림차순으로 정할 수 있습니다. 기본적으로 정렬은 데이터 형식을 고려하며 사전순 또는 숫자 순서대로 이루어집니다. 사전순 정렬은 대/소문자를 구분합니다.
- 다양한 형식을 선택할 수 있습니다. 사용자는 클릭하여 끌어 오는 방식으로 하나 이상의 셀 또는 여러 행을 강조 표시할 수 있습니다. DataGridView 왼쪽 위에 있는 사각형을 클릭하면 전체 테이블이 선택됩니다.
- 자동 크기 조정 기능을 지원합니다. 사용자가 헤더 사이의 열 구분선을 두 번 클릭하면 왼쪽 열이 셀 내용에 맞게 자동으로 확장 또는 축소됩니다.
멋진 모양의 DataGridView 만들기
DataGridView의 기본 모양은 DataGrid에 비해 약간 개선되었습니다. 하지만 몇 가지 간단한 세부 작업을 통해 모양을 멋지게 다듬을 수 있습니다.
' 헤더에서 가장 큰 텍스트의 너비
' 또는 이 열의 행 중 하나에 대해
' 열 크기를 조정합니다.
DataGridView1.AutoSizeColumns( _
DataGridViewAutoSizeColumnCriteria.HeaderAndRows)
'자동 셀 크기 조정
dv1.AutoResizeColumns()
dv1.AutoResizeRows()
(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)
DataGridView.Columns("Descript-xion").Width *= 4
DataGridView.AutoSizeRows( _
DataGridViewAutoSizeRowsMode.HeaderAndColumnsAllRows)
DataGridView.Columns("OrderID").HeaderText = "Order ID"
DataGridView를 사용하여 셀 선택
- CellSelect 셀은 선택할 수 있지만 전체 행 또는 헤더는 선택할 수 없습니다. DataGridView.MultiSelect가 True이면 여러 개의 셀을 선택할 수 있습니다.
- FullColumnSelect 열 헤더를 클릭하여 전체 열만 선택할 수 있습니다. DataGridView.MultiSelect가 True이면 여러 개의 열을 선택할 수 있습니다. 이 모드를 사용하면 열 헤더를 클릭해도 표가 정렬되지 않습니다.
- FullRowSelect 행 헤더를 클릭하여 전체 행만 선택할 수 있습니다. DataGridView.MultiSelect가 True이면 여러 개의 행을 선택할 수 있습니다.
- ColumnHeaderSelect CellSelect 또는 FullColumnSelect 선택 모드를 사용할 수 있습니다. 이 모드를 사용하면 열 헤더를 클릭해도 표가 정렬되지 않습니다.
- RowHeaderSelect CellSelect 또는 FullRowSelect 선택 모드를 사용할 수 있습니다. 이것이 기본 선택 모드입니다.
For Each SelectedRow As DataGridViewRow In _
DataGridView1.SelectedRows
MessageBox.Show( _
SelectedRow.Cells("CustomerID").Value)
Next
' 11번째 행의 네 번째 셀로 이동합니다.
DataGridView.CurrentCell = _
DataGridView.Rows(10).Cells(3)
지금까지는 현재 선택한 행, 셀 및 열 집합과 상호 작용하는 방법을 확인했습니다. DataGridView는 전체 데이터 집합을 작업할 수 있게 해주는 두 개의 주요 컬렉션을 제공합니다. 이들은 Columns(DataGridViewColumn 개체의 컬렉션) 및 Rows(각각 DataGridViewCell 개체의 컬렉션을 참조하는 DataGridViewRow 개체의 컬렉션)로 나타납니다. 그림 2는 개체 모델을 보여 줍니다.
For Each Row As DataGridViewRow In DataGridView1.Rows
If Row.Cells("OrderID").Value < 100 Then
Row.Selected = True
End If
Next
DataGridView 스타일
DataGridView를 디자인하는 데 발생하는 한 가지 문제는 서로 다른 수준의 서식 지정을 적용할 만큼 유연하면서 매우 큰 테이블에 대해서도 효과적인 서식 지정 시스템을 만드는 것이었습니다. 유연성을 고려할 경우 최상의 접근 방식은 개발자가 각 셀을 개별적으로 구성할 수 있게 하는 것입니다. 그러나 효율성 측면에서 보면 이 접근 방식은 매우 열악하다고 할 수 있습니다. 테이블에 행이 수천 개면 셀은 수만 개가 되므로 셀마다 개별적으로 서식 지정을 관리한다는 것은 보나마나 많은 양의 메모리만 낭비하는 헛수고가 될 것입니다.
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.Format = "C"
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.Font = _
New Font(DataGridView.Font, FontStyle.Bold)
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.BackColor = Color.LightYellow
사용자 지정 셀 서식 지정
셀의 서식을 지정하기 위해 첫 번째로 선택할 사항은 상위 DataGridView, DataGridViewColumn 및 DataGridViewRow 속성을 통해 작업하는 것입니다. 그러나 때로는 특정 개별 셀의 스타일을 설정해야 하는 경우도 있습니다. 예를 들어 열의 데이터가 특정 값보다 크거나 작으면 데이터를 플래그해야 하는 경우가 있습니다. 이에 대한 한 가지 예는 프로젝트 일정 목록에서 기한이 경과된 만기일 또는 매출 분석에서 마이너스 수익률을 강조 표시하는 것입니다. 위의 두 경우 모두 개별 셀의 서식을 지정해야 합니다.
Private Sub DataGridView1_CellFormatting( _
ByVal sender As System.Object, _
ByVal e As System.Windows.Forms. _
DataGridViewCellFormattingEventArgs) _
Handles DataGridView1.CellFormatting
' 맞는 열인지 확인합니다.
If DataGridView1.Columns(e.ColumnIndex).Name = _
"CustomerID" Then
' 맞는 값인지 확인합니다.
If e.Value = "ALFKI" Then
e.CellStyle.ForeColor = Color.Red
e.CellStyle.BackColor = Color.Yellow
End If
End If
End Sub
- DisplayIndex DataGridView에서 열이 표시되는 위치를 설정합니다. 예를 들어 DisplayIndex가 0인 열은 가장 왼쪽 열에 자동으로 표시됩니다. DisplayIndex가 동일한 열이 둘 이상이면 컬렉션의 첫 번째 열이 가장 먼저 표시됩니다. 따라서 DisplayIndex를 사용하여 열을 왼쪽으로 옮기는 경우 가장 왼쪽 열의 DisplayIndex도 오른쪽으로 옮기도록 설정해야 합니다. 처음에 DisplayIndex는 DataGridView.Columns 컬렉션의 DataGridViewColumn 개체의 인덱스와 일치합니다.
- Frozen True인 경우 사용자가 추가 열을 확인하기 위해 오른쪽으로 스크롤해도 테이블 왼쪽에 표시된 상태로 고정됩니다.
- HeaderText 열 헤더에 표시되는 텍스트를 설정합니다.
- Resizable 및 MinimumWidth Resizable을 False로 설정하여 사용자가 열 크기를 조정하지 못하게 하거나 MinimumWidth를 최소 허용 픽셀 수로 설정합니다.
- Visible False로 설정하여 열을 숨깁니다.
단추 열
DataGridView를 위해 제공되는 열 형식 중 하나는 모든 항목 옆에 단추를 표시하는 DataGridViewButtonColumn입니다. 이 단추의 클릭에 응답하는 것은 물론 이를 사용하여 다른 작업을 시작하거나 새 폼을 표시할 수도 있습니다.
' 단추 열을 만듭니다.
Dim Details As New DataGridViewButtonColumn()
Details.Name = "Details"
' 데이터 바인딩을 해제하고 정적 텍스트를 표시합니다.
' (대신 DataPropertyName 속성을 설정하여
' 테이블의 속성을 사용할 수도 있습니다.)
Details.DisplayTextAsFormattedValue = False
Details.Text = "Details..."
' 헤더를 지웁니다.
Details.HeaderText = ""
' 열을 추가합니다.
DataGridView1.Columns.Insert( _
DataGridView1.Columns.Count, Details)
Private Sub DataGridView1_CellClick( _
ByVal sender As System.Object, _
ByVal e As System.Windows.Forms. _
DataGridViewCellEventArgs) _
Handles DataGridView1.CellClick
If DataGridView1.Columns(e.ColumnIndex).Name = _
"Details" Then
MessageBox.Show("You picked " & _
DataGridView1.Rows(e.RowIndex). _
Cells("CustomerID").Value)
End If
End Sub
이미지 열
DataGridView를 위해 제공되는 또 다른 열 형식은 셀 범위에 그림을 표시하는 DataGridViewImageColumn입니다. DataGridViewImageColumn.Layout 속성을 설정하면 크기에 맞게 늘이든 너무 큰 경우 그냥 잘라내든 간에 셀에 그림이 표시되는 방법을 구성할 수 있습니다.
DataGridView를 사용하는 편집
DataGrid는 사용자 입력에 유연성이 떨어지기로 악명 높아 셀의 유효성을 검사하고 오류를 보고하는 방식을 사용자 지정하기가 거의 불가능했습니다. 반면 DataGridView를 사용하면 편집 프로세스의 모든 단계에서 발생하는 수많은 서로 다른 단계에 반응하여 동작을 제어할 수 있습니다.
오류 처리
기본적으로 DataGridViewTextBoxColumn을 사용하면 사용자가 현재 셀에 허용되지 않을 수 있는 문자를 포함하여 모든 문자를 입력할 수 있습니다. 예를 들어 사용자가 숫자 필드에 숫자가 아닌 문자를 입력하거나 DataSet에 정의된 ForeignKeyConstraint 또는 UniqueConstraint를 위반하는 값을 지정할 수도 있습니다. DataGridView는 이러한 문제를 다음과 같이 다양한 방식으로 처리합니다.
- 편집한 값을 필요한 데이터 형식으로 변환할 수 있으면(예: 사용자가 숫자 열에 텍스트를 입력한 경우) 사용자는 변경 내용을 커밋하거나 다른 행으로 이동할 수 없게 됩니다. 대신 변경 내용을 취소하거나 값을 편집해야 합니다.
- 편집한 값이 DataSet의 제약 조건을 위반하는 경우 사용자가 다른 행으로 이동하거나 Enter 키를 눌러 이를 커밋하고 나면 바로 변경 내용이 취소됩니다.
입력 유효성 검사
유효성 검사는 오류 처리와는 약간 다른 작업입니다. 오류 처리의 경우 DataSet를 통해 보고되는 문제를 처리합니다. 하지만 유효성 검사의 경우 DataSet에는 허용될 수 있지만 응용 프로그램에는 적절하지 않은 데이터 같은 고유한 사용자 지정 오류 조건을 찾아냅니다.
- DataGridViewCell.ErrorText를 설정하면 셀에 느낌표 아이콘이 표시됩니다. 마우스로 이 아이콘을 가리키면 오류 메시지가 표시됩니다.
- DataGridViewRow.ErrorText를 설정하면 행 왼쪽의 행 헤더에 느낌표 아이콘이 표시됩니다. 마우스로 이 아이콘을 가리키면 오류 메시지가 표시됩니다.
Private Sub DataGridView1_CellValidating( _
ByVal sender As System.Object, _
ByVal e As System.Windows.Forms. _
DataGridViewCellValidatingEventArgs) _
Handles DataGridView1.CellValidating
If DataGridView1.Columns(e.ColumnIndex).Name = _
"CompanyName" Then
If CType(e.FormattedValue, String).Length > _
50 Then
DataGridView1.Rows( _
e.RowIndex).Cells(e.ColumnIndex). _
ErrorText = _
"회사 이름이 너무 깁니다."
End If
End If
End Sub
유효성 검사를 사용하면 모든 오류 조건을 잡아낼 수 있습니다. 그러나 이 접근 방식을 사용하면 잘못된 내용을 입력한 다음 이를 사후에 수정할 수 있기 때문에 반드시 최선의 방법이라고 할 수는 없습니다. 보다 바람직한 방법은 우선 사용자가 잘못된 내용을 입력하지 못하도록 하는 것입니다.
' 자동으로 생성된 CategoryID 열을 제거합니다.
DataGridView1.Columns.Remove("CategoryID")
' CategoryID의 목록 열을 만듭니다.
Dim List As New DataGridViewComboBoxColumn()
List.DisplayIndex = 0
List.HeaderText = "Category"
' 이 열은
' Products.CategoryID 필드에 바인딩됩니다.
List.DataPropertyName = "CategoryID"
' Categories 테이블에서 목록을 채웁니다.
List.DataSource = ds.Tables("Categories")
List.DisplayMember = "CategoryName"
List.ValueMember = "CategoryID"
' 열을 추가합니다.
DataGridView1.Columns.Add(List)
'닷넷 프레임워크' 카테고리의 다른 글
C# Thread 이야기 (0) | 2009.09.22 |
---|---|
Creating a splash screen (0) | 2009.07.15 |
MySQL 5.1과 C# 연동 (0) | 2009.05.31 |
Thread 상태 전이도 (0) | 2009.05.20 |
wav 파일 재생하기 (0) | 2009.04.29 |