VB.NET 2008/VB - 데이터 그리드 뷰

데이터 표시 방법

본클라쓰 2012. 9. 23. 10:40

 

DataGridView 컨트롤은 바인딩된 모드, 바인딩되지 않은 모드 및 가상 모드의 세 가지 모드로 데이터를 표시할 수 있다.

 

 

 

바인딩되지 않은 모드

 

바인딩되지 않은 모드는 프로그래밍 방식으로 관리하는 적은 양의 데이터를 표시하는 경우 적합하다. 이 모드에서는 바인딩된 모드에서처럼 데이터 소스에 DataGridView 컨트롤을 직접 연결하지 않는다.

 

바인딩되지 않은 모드는 정적 데이터나 읽기 전용 데이터 또는 외부 데이터 저장소와 상호 작용하는 사용자 코드를 제공하려는 경우 특히 유용하다. 그러나 사용자가 외부 데이터 소스와 상호 작용하도록 하려는 경우에는 일반적으로 바인딩된 모드를 사용한다. 바인딩되지 않은 DataGridView 컨트롤을 사용하는 방법은 다음과 같다.

 

Private WithEvents songsDataGridView As New DataGridView

    ' ColumnCount 속성으로 열의 수를 지정해주어야 한다.

    songsDataGridView.ColumnCount = 5


    With songsDataGridView.ColumnHeadersDefaultCellStyle
        .BackColor = Color.Navy
        .ForeColor = Color.White
        .Font = New Font(songsDataGridView.Font, FontStyle.Bold)
    End With

    With songsDataGridView
        .Name = "songsDataGridView"
        .Location = New Point(8, 8)
        .Size = New Size(500, 250)
        .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
        .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
        .CellBorderStyle = DataGridViewCellBorderStyle.Single
        .GridColor = Color.Black
        .RowHeadersVisible = False

        .Columns(0).Name = "Release Date"
        .Columns(1).Name = "Track"
        .Columns(2).Name = "Title"
        .Columns(3).Name = "Artist"
        .Columns(4).Name = "Album"
        .Columns(4).DefaultCellStyle.Font = New Font(Me.songsDataGridView.DefaultCellStyle.Font, FontStyle.Italic)
        .SelectionMode = DataGridViewSelectionMode.FullRowSelect
        .MultiSelect = False
        .Dock = DockStyle.Fill

    End With

 

 

 

 

행을 DataGridView 컨트롤에 추가하는 PopulateDataGridView 메서드를 만든다.

 

Private Sub PopulateDataGridView()

    Dim row0 As String() = {"11/22/1968", "29", "Revolution 9", "Beatles", "The Beatles [White Album]"}
    Dim row1 As String() = {"1960", "6", "Fools Rush In", "Frank Sinatra", "Nice 'N' Easy"}
    Dim row2 As String() = {"11/11/1971", "1", one of These Days", "Pink Floyd", "Meddle"}
    Dim row3 As String() = {"1988", "7", "Where Is My Mind?", "Pixies", "Surfer Rosa"}
    Dim row4 As String() = {"5/1981", "9", "Can't Find My Mind", "Cramps", "Psychedelic Jungle"}
    Dim row5 As String() = {"6/10/2003", "13", "Scatterbrain. (As Dead As Leaves.)", "Radiohead", "Hail to the Thief"}
    Dim row6 As String() = {"6/30/1992", "3", "Dress", "P J Harvey", "Dry"}

    With Me.songsDataGridView.Rows
        .Add(row0)
        .Add(row1)
        .Add(row2)
        .Add(row3)
        .Add(row4)
        .Add(row5)
        .Add(row6)
    End With

    With Me.songsDataGridView
        .Columns(0).DisplayIndex = 3
        .Columns(1).DisplayIndex = 4
        .Columns(2).DisplayIndex = 0
        .Columns(3).DisplayIndex = 1
        .Columns(4).DisplayIndex = 2
    End With

End Sub

 

 

 

 

 

바인딩된 모드

 

바인딩된 모드는 데이터 저장소와의 자동 상호 작용을 사용하여 데이터를 관리하는 경우 적합하다. DataSource 속성을 설정하여 DataGridView 컨트롤을 해당 데이터 소스에 직접 연결할 수 있다. 데이터 바인딩된 컨트롤의 경우 명시적으로 직접 관리하지 않아도 데이터 행을 푸시하거나 가져올 수 있다. AutoGenerateColumns 속성이 true인 경우 데이터 소스의 각 열에 해당하는 경이 컨트롤에 만들어진다. 사용자 열을 만들려면 이 속성을 false로 설정하고 DataPropertyName 속성을 사용하여 각 열을 구성할 때 해당 열을 바인딩한다. 이는 기본적으로 생성되는 형식 이외의 열 형식을 사용하려는 경우 유용하다.

 

바인딩된 DataGridView 컨트롤을 사용하는 방법은 다음과 같다.

 

이 코드에서는 DataTable 개체를 반환하는 GetDate 메서드를 사용한다. connectionString 변수르르 데이터베이스에 해당하는 값으로 설정해야 한다.

 

Private Shared Function GetData(ByVal selectCommand As String) As DataTable

    Dim connectionString As String = _
    "Integrated Security=SSPI;Persist Security Info=False;" + _
    "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096"

    ' Connect to the database and fill a data table.
    Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
    Dim data As New DataTable()
    data.Locale = System.Globalization.CultureInfo.InvariantCulture
    adapter.Fill(data)

    Return data
End Function


 

 

 

DataGridView 및 BindingSource를 초기화하고 데이터 바인딩을 설정하도록 폼의 Load 이벤트에 대한 처리기를 구현한다.

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load

    ' Initialize the BindingSource and bind the DataGridView to it.
    bindingSource1.DataSource = GetData("select * from Customers")
    Me.dataGridView1.DataSource = bindingSource1
    Me.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)

End Sub

 

 

 

바인딩 된 데이터그리드뷰에 행을 추가하는 방법

 

바인딩 된 데이터그리드뷰에 행을 추가하고자 할 때 데이터그리드뷰의 Rows 컬렉션의 Add 메서드를 사용하여 추가하려 하면 '컨트롤에 데이터 바인딩된 경우 DataGridView의 행 컬렉션에 프로그래밍 방식으로 행을 추가할 수 없습니다.'라는 오류를 출력한다. 즉 바인딩된 데이터그리드뷰에 직접적으로 행을 추가하는 방법을 사용할 수 없다. 이 때는 DataSource에 접근해 DataSource를 변경하는 방법으로 해결해야 한다. 

 

 

Dim bs As New BindingSource

bs = DataGridView1.DataSource

Dim dt As New DataTable

dt = bs.DataSource

 

' 추가할 새로운 행을 만든다.

Dim row As DataRow = dt.NewRow

row.Item(2) = "합 계"

row.Item(9) = sum

dt.Rows.Add(row)

 

 

 

 

 

가상 모드

 

가상 모드에서는 사용자 데이터 관리 작업을 구현할 수 있다. 이는 컨트롤이 바인딩된 열별로 정렬될 때 바인딩된 모드에서 바인딩되지 않은 열의 값을 유지 관리하는 경우 필요하다. 그러나 가상 모드의 주 용도는 대량의 데이터와 상호 작용할 때 성능을 최적화하는 것이다.

 

관리하는 캐시에 DataGridView 컨트롤을 연결하면 코드가 데이터 행을 푸시하고 가져올 시기를 제어한다. 캐시가 메모리에서 차지하는 공간 크기를 최소한으로 유지하려면 캐시가 현재 표시된 행 수와 비슷한 크기여야 한다. 사용자가 새 행을 뷰로 스크롤하면 코드는 캐시에서 새 데이터를 요청하고 필요한 경우 메모리에서 이전 데이터를 플러시한다.

 

가상 모드를 구현할 때는 데이터 모델에 새 행이 필요한 경우 새 행 추가를 롤백하는 경우 추적을 수행해야 한다. 이 기능의 정확한 구현은 데이터 모델의 구현 및 데이터 모델의 트랜잭션 의미, 커밋 범위가 셀 수준인지, 아니면 행 수준인지에 따라 달라진다.