다음을 통해 공유


방법: Pocket PC에서 DataGrid 사용

업데이트: 2007년 11월

이 예제에서는 DataGrid 컨트롤을 폼과 함께 사용하여 DataGrid 컨트롤에서 선택된 레코드를 보고 편집하며 새 레코드를 데이터베이스에 추가하는 방법을 보여 줍니다. .NET Compact Framework에서는 DataGrid 셀 편집이 지원되지 않으므로 DataGrid 값을 편집할 수 있도록 사용자 인터페이스가 제공되어야 합니다. 이 예제에서는 Visual Studio와 함께 설치되는 Northwind 데이터베이스를 사용합니다.

참고:

.NET Compact Framework 버전 2.0을 사용하는 경우 DataGrid 컨트롤을 사용하려면 프로젝트에 System.Windows.Forms.DataGrid.dll에 대한 참조를 추가해야 합니다.

BindingSource 개체는 데이터베이스에서 현재 선택된 레코드에 대한 액세스를 제공하고, 이 레코드는 요약 및 편집 폼의 생성자로 전달되어 모든 폼에서 동일한 바인딩 소스가 사용되도록 합니다. 데이터 바인딩 컨트롤 외에도 BindingSource 개체는 현재 행의 DataRowView 개체를 반환할 수 있습니다. DataRowView를 사용하여 열의 현재 값을 확인하는 등 여러 가지 목적으로 데이터에 액세스할 수 있습니다. 요약 및 편집 폼에 대한 이 예제에서는 데모용으로 두 개의 열만 사용합니다.

또는 DataGrid 컨트롤의 스마트 태그에 대한 바로 가기 메뉴에서 데이터 폼 생성을 선택하여 Visual Studio가 요약 및 편집 폼을 자동으로 생성하도록 할 수 있습니다. 이 기능에 대한 자세한 내용은 방법: 데이터 응용 프로그램에 대한 요약 및 편집 뷰 생성(장치)을 참조하십시오.

이 응용 프로그램에는 다음 표에 설명된 폼이 있습니다. 이 표에는 또한 해당 메뉴 옵션도 나열되어 있습니다.

기능

메뉴 옵션

기본 폼

(Form1)

DataGrid 컨트롤을 표시합니다.

New

데이터베이스에 새 레코드를 추가하고 EditView 폼을 표시합니다.

Edit

EditView 폼을 표시합니다.

SummaryView

보기 편하도록 최적화하여 현재 레코드의 열 값을 표시합니다.

(없음)

EditView

편집하기 편하도록 최적화하여 현재 레코드의 열 값을 표시합니다.

Done

대화 상자에서 확인을 눌러 데이터베이스를 업데이트한 다음 기본 폼을 표시합니다.

Cancel

대화 상자를 취소하고 기본 폼을 표시합니다.

프로젝트를 만들고 기본 폼을 디자인하려면

  1. Visual Studio에서 스마트 장치 프로젝트를 만들고 대상 플랫폼을 Windows Mobile 5.0 Pocket PC SDK 또는 Windows Mobile 6 Professional SDK로 설정합니다.

  2. 데이터 메뉴에서 새 데이터 소스 추가를 클릭합니다.

  3. 데이터 소스 구성 마법사에서 Microsoft SQL Server Compact Edition(.NET Framework Data Provider for SQL Server CE)을 사용하여 Northwind 데이터베이스에 연결합니다. Northwind 데이터베이스인 Northwind.sdf는 \Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples 폴더에 설치되어 있습니다.

    참고:

    Windows Vista에서 Northwind 데이터베이스에 액세스하려면 관리자로 Visual Studio를 실행해야 합니다. 데이터베이스를 추가하는 방법에 대한 자세한 내용은 방법: 장치 프로젝트에 데이터베이스 추가를 참조하십시오.

  4. 마법사의 데이터베이스 개체 선택 페이지에서 Products 테이블과 이 테이블의 모든 열을 선택합니다.

  5. 도구 상자에서 DataGrid 컨트롤을 폼에 추가합니다. 원하는 대로 해당 크기와 레이아웃 속성을 설정합니다.

  6. DataSource 속성을 Products 테이블로 설정합니다. Visual Studio에서 프로젝트에 NorthwindDataSet, ProductsBindingSource 및 ProductsTableAdapter 개체를 추가합니다.

  7. DataGridTableStyle 개체를 TableStyles 컬렉션에 추가하여 DataGrid 컨트롤이 테이블의 한두 열을 표시하도록 합니다. 속성 창에서 TableStyles 속성을 클릭합니다. 이 작업으로 DataGridTableStyle 컬렉션 편집기 대화 상자가 표시됩니다. 그런 후 다음 작업을 수행합니다.

    1. TableStyles 컬렉션에 DataGridTableStyle 개체를 추가합니다.

    2. MappingName 속성으로 "Products"를 지정합니다.

    3. GridColumnStyle 속성을 클릭합니다. 이 작업으로 DataGridColumnStyle 컬렉션 편집기 대화 상자가 표시됩니다.

    4. GridColumnStyles 컬렉션에 DataGridTextBoxColumn 개체를 추가합니다.

    5. MappingName 속성을 클릭하고 Product Name을 선택합니다.

    6. 원하는 머리글 텍스트와 너비를 설정합니다.

    7. 추가 열에 대해 반복합니다.

    8. 대화 상자를 닫습니다.

  8. 각각 요약 뷰와 편집 뷰로 사용할 두 개의 폼을 프로젝트에 추가합니다. 각각의 이름을 SummaryView와 EditView로 지정합니다.

  9. SummaryView 및 EditView 폼의 생성자에 BindingSource 개체를 가져오는 매개 변수를 추가합니다. 이러한 폼에서 CurrentBindingSouce라는 전역 변수를 선언하여 생성자에 전달된 BindingSource 개체로 설정합니다. 이것은 InitializeComponent 메서드가 호출되기 전에 설정되어야 합니다.

    Visual Basic 개발자는 코드 창의 오른쪽 위에 있는 메서드 이름 목록에서 New 메서드를 추가하여 폼에 Sub New를 추가해야 합니다.

    Dim CurrentBindingSource As BindingSource
    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
        InitializeComponent()
    End Sub
    
    private BindingSource CurrentBindingSource;
    public SummaryView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
        InitializeComponent();
    }
    
  10. 기본 폼에서 New라는 MenuItem 개체(MenuItem1)와 Edit라는 다른 개체(MenuItem2)를 추가합니다. New 및 Edit의 Click 이벤트에 대해 다음 코드를 추가합니다.

    ' Add new record.
    Private Sub MenuItem1_Click(ByVal sender As System.Object,_
      ByVal e As System.EventArgs) Handles MenuItem1.Click
        ProductsBindingSource.AllowNew = True
        ProductsBindingSource.AddNew()
    
        ' Pass the binding source to the form.
        Dim EditViewDialog As New EditView(ProductsBindingSource)
        If EditViewDialog.ShowDialog() <> DialogResult.OK Then
            ProductsBindingSource.CancelEdit()
        Else
            ProductsBindingSource.EndEdit()
            Me.ProductsTableAdapter.Update(Me.NorthwindDataSet)
        End If
    End Sub
    
    ' Edit record.
    Private Sub MenuItem2_Click(ByVal sender As System.Object,_
      ByVal e As System.EventArgs) Handles MenuItem2.Click
    
        ' Pass the binding source to the form.
        Dim EditViewDialog As New EditView(ProductsBindingSource)
        If EditViewDialog.ShowDialog() <> DialogResult.OK Then
            ProductsBindingSource.CancelEdit()
        Else
            ProductsBindingSource.EndEdit()
            Me.ProductsTableAdapter.Update(Me.NorthwindDataSet)
        End If
    End Sub
    
    // Add new record.
    private void menuItem1_Click(object sender, EventArgs e)
    {
        productsBindingSource.AllowNew = true;
        productsBindingSource.AddNew();
        EditView EditViewDialog = new EditView(productsBindingSource);
        if (EditViewDialog.ShowDialog() != DialogResult.OK)
        {
            productsBindingSource.CancelEdit();
        }
        else
        {
            ProductsBindingSource.EndEdit();
            this.productsTableAdapter.Update(this.northwindDataSet);
         }
    }
    // Edit record (Edit).
    private void menuItem2_Click(object sender, EventArgs e)
    {
        EditView EditViewDialog = new EditView(productsBindingSource);
        if (EditViewDialog.ShowDialog() != DialogResult.OK)
        {
            productsBindingSource.CancelEdit();
        }
        else
        {
            productsBindingSource.EndEdit();
            this.productsTableAdapter.Update(this.northwindDataSet);
        }
    }
    
  11. 기본 폼에서 DataGrid 컨트롤에 대해, Pocket PC에서 작업 키를 누르면 발생하는 KeyDown 이벤트에 대한 코드를 추가합니다. 이 작업으로 SummaryView 폼이 표시됩니다.

    ' Action button pressed.
    Private Sub DataGrid1_KeyDown(ByVal sender As System.Object, _
      ByVal e As System.Windows.Forms.KeyEventArgs) _
      Handles DataGrid1.KeyDown
        If (e.KeyCode = Keys.Enter) Then
            Dim SummaryViewDialog As New SummaryView(ProductsBindingSource)
            SummaryViewDialog.ShowDialog()
        End If
    End Sub
    
    // Action button pressed.
    private void dataGrid1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            SummaryView SummaryViewDialog = 
              new SummaryView(productsBindingSource);
            SummaryViewDialog.ShowDialog();
         }
    }
    

요약 뷰를 만들려면

  1. SummaryView 폼에 다음 컨트롤을 추가합니다.

    • Product Name 제목(예: "Product Name:")에 대한 Label 컨트롤

    • Product Name 값에 대한 Label 컨트롤

    • Discontinued 값에 대한 Label 컨트롤. 이 컨트롤은 Products 테이블의 Discontinued 열 값이 true인 경우에만 표시됩니다. 이 레이블을 빨간 글꼴로 "DISCONTINUED"라고 지정합니다.

  2. SummaryView 폼에 대한 생성자에 다음 코드를 추가하여 데이터 바인딩을 설정합니다. CurrentBindingSource라는 폼 변수를 선언하여 폼의 생성자에서 전달된 BindingSource 인스턴스로 설정되도록 합니다. DataRowView 개체는 Discontinued 열이 true이고 Discontinued 레이블이 표시되는지 여부를 결정합니다.

    'Dim CurrentBindingSource As BindingSource
    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
        ' This call is required by the Windows Forms Designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        ' Bind the label that shows the product name.
        ProductNameLabelVal.DataBindings.Add("Text", _
          CurrentBindingSource, "Product Name")
    
            ' Show the Discontinued label if
            ' that value is true in the database.
            Dim drView As DataRowView
            drView = CurrentBindingSource.Current
            If drView.Item("Discontinued") = True Then
                DiscontinuedLabel.Visible = True
            Else
                DiscontinuedLabel.Visible = False
            End If
    End Sub
    
    private BindingSource CurrentBindingSource;
    public SummaryView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
        InitializeComponent();
        // Bind the label that shows the product name.
        ProductNameLabelVal.DataBindings.Add("Text",
          CurrentBindingSource, "Product Name");
        // Show the Discontinued label if
        // that value is true in the database.
        DataRowView drView;
        drView = (DataRowView) CurrentBindingSource.Current;
        if (drView["Discontinued"] == true)
        {
            DiscontinuedLabel.Visible = true;
        }
        else
        {
            DiscontinuedLabel.Visible = false;
        }
    }
    

편집 뷰를 만들려면

  1. Microsoft.WindowsCE.Forms 네임스페이스에 대한 참조를 프로젝트에 추가합니다.

  2. InputPanel 구성 요소를 도구 상자에서 EditView 폼으로 끌어 옵니다. 텍스트 상자에 텍스트를 입력할 수 있는 SIP(Soft Input Panel)를 사용자에게 제공하는 데는 하나의 인스턴스만 필요합니다.

  3. 폼에 다음 컨트롤을 추가합니다.

    • Product Name 텍스트 상자에 대한 Label 컨트롤

    • Pruduct Name 열에 대한 TextBox 컨트롤

    • Discontinued 열에 대한 CheckBox 컨트롤. 이 컨트롤의 ThreeState 속성을 true로 설정합니다.

  4. 데이터 바인딩을 설정하려면 폼의 생성자에서 InitializeComponent 호출 뒤에 다음 코드를 추가합니다. 이 코드는 새 레코드를 추가하거나 기존 레코드를 편집하는 작업을 수행합니다. 새 레코드가 추가되면 DataRowView 개체는 Discontinued 열의 값이 null인지 확인하고 바인딩의 NullValue 속성을 CheckState 속성의 Indeterminate 값으로 설정합니다.

    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
        InitializeComponent()
        ' Add the bindings.
        ProductNameTextBox.DataBindings.Add("Text",_
      CurrentBindingSource, "Product Name")
        Dim drView As DataRowView
        drView = CurrentBindingSource.Current
        If IsDBNull(drView("Discontinued")) Then
            DiscontinuedCheckBox.DataBindings.Add("CheckState",_
              CurrentBindingSource, "Discontinued", True,_
              DataSourceUpdateMode.OnValidation, _
              CheckState.Indeterminate)
        Else
            DiscontinuedCheckBox.DataBindings.Add("Checked",_
             CurrentBindingSource, "Discontinued")
        End If
    End Sub
    
    public EditView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
         InitializeComponent();
         CurrentBindingSource = bsource;
         InitializeComponent();
         //  Add the bindings.
         productNameTextBox.DataBindings.Add("Text",
           CurrentBindingSource, "Product Name");
         DataRowView drView;
         drView = (DataRowView) CurrentBindingSource.Current;
         if (drView("Discontinued") == null)
         {
             DiscontinuedCheckBox.DataBindings.Add("CheckState",
               CurrentBindingSource, "Discontinued", true,
               DataSourceUpdateMode.OnValidation,
               CheckState.Indeterminate);
         }
         else
         {
              DiscontinuedCheckBox.DataBindings.Add("Checked",
                CurrentBindingSource, "Discontinued");
         }
    }
    
  5. Done이라는 MenuItem 개체를 추가하여 데이터베이스를 변경 내용으로 업데이트하고 기본 폼으로 돌아갑니다.

    ' Done
    Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
        Me.DialogResult = DialogResult.OK
        Me.Close()
    End Sub
    // Done
    private void menuItem1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.OK;
        this.Close();
    }
    
  6. Cancel이라는 MenuItem 개체를 Done과 같은 수준에 추가하여 변경 내용을 취소하고 기본 폼으로 돌아갑니다.

    ' Cancel
    Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
        Me.DialogResult = DialogResult.Cancel
        Me.Close()
    End Sub
    
    // Cancel
    private void menuItem1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
        this.Close();
    }
    

코드 컴파일

이 예제에는 다음과 같은 네임스페이스에 대한 참조가 필요합니다.

참고 항목

작업

방법: Smartphone에서 DataGrid 사용

개념

강력한 형식의 DataSets 생성(ADO.NET)

기타 리소스

.NET Compact Framework의 데이터 액세스 및 XML 지원