方法 : Pocket PC で DataGrid を使用する

更新 : 2007 年 11 月

この例では、フォームで DataGrid を使用して、DataGrid コントロールで選択されているレコードを参照および編集するテクニックと、データベースに新しいレコードを追加するテクニックを示します。.NET Compact Framework では、DataGrid のセルの編集がサポートされていないため、DataGrid の値を編集するにはユーザー インターフェイスを用意する必要があります。この例では、Northwind データベースを使用します。このデータベースは、Visual Studio と一緒にインストールされています。

ms229684.alert_note(ja-jp,VS.90).gifメモ :

.NET Compact Framework Version 2.0 を使用している場合、DataGrid コントロールを使用するには、プロジェクト内に System.Windows.Forms.DataGrid.dll への参照を追加する必要があります。

BindingSource オブジェクトを使用すると、データベースで現在選択されているレコードにアクセスできます。このオブジェクトは、すべてのフォームで同じバインディング ソースを使用できるように、サマリ フォームおよび編集フォームのコンストラクタに渡されます。データ バインディング コントロールだけでなく、BindingSource オブジェクトによっても、現在の行の DataRowView オブジェクトを取得できます。DataRowView を使用すると、列の現在の値など、さまざまな目的に応じてデータにアクセスできます。この例では、参考用に表示してあるため、サマリ フォームおよび編集フォームの列は 2 列だけにしてあります。

また、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 SQL Server CE 用データ プロバイダ) を使用して Northwind データベースに接続します。Northwind データベース (Northwind.sdf) は、\Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples フォルダにインストールされています。

    ms229684.alert_note(ja-jp,VS.90).gifメモ :

    Windows Vista では、管理者として Visual Studio を実行し、Northwind データベースにアクセスする必要があります。データベースを追加する方法の詳細については、「方法 : デバイス プロジェクトにデータベースを追加する」を参照してください。

  4. このウィザードの [データベース オブジェクトの選択] ページで、Products テーブルとそのすべての列を選択します。

  5. ツールボックスからフォームに DataGrid コントロールを追加します。コントロールのサイズ プロパティおよびレイアウト プロパティに適切な値を設定します。

  6. DataSource プロパティを Products テーブルに設定します。Visual Studio により、NorthwindDataSet、ProductsBindingSource、および ProductsTableAdapter の各オブジェクトがプロジェクトに追加されます。

  7. DataGridTableStyle オブジェクトを TableStyles コレクションに追加して、DataGrid コントロールにテーブルの 1 列または 2 列が表示されるようにします。[プロパティ] ペインの TableStyles プロパティをクリックします。[DataGridTableStyle コレクション エディタ] ダイアログ ボックスが表示されます。その後、以下の作業を行います。

    1. TableStyles コレクションに DataGridTableStyle オブジェクトを追加します。

    2. MappingName プロパティに "Products" を指定します。

    3. GridColumnStyle プロパティをクリックします。[DataGridColumnStyle コレクション エディタ] ダイアログ ボックスが表示されます。

    4. GridColumnStyles コレクションに DataGridTextBoxColumn オブジェクトを追加します。

    5. MappingName プロパティをクリックし、[製品名] を選択します。

    6. [ヘッダー テキスト] ボックスおよび [幅] ボックスに目的の値を入力します。

    7. 他の列についても同様に設定します。

    8. ダイアログ ボックスを閉じます。

  8. プロジェクトにフォームを 2 つ追加します。1 つはサマリ ビュー用、もう 1 つは編集ビュー用です。フォームに SummaryView および EditView という名前を付けます。

  9. SummaryView フォームおよび EditView フォームのコンストラクタに、BindingSource オブジェクトを受け取るためのパラメータを追加します。これらのフォームで、グローバル変数 CurrentBindingSouce が、コンストラクタに渡される BindingSource オブジェクトに設定されるように宣言します。この変数は、InitializeComponent メソッドの呼び出しより前に設定する必要があります。

    Visual Basic で開発している場合には、フォームに Sub New メソッドを追加する必要があります。メソッドを追加するには、コード ペインの右上にある [メソッド名] ボックスの [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(MenuItem1) という名前および Edit (MenuItem2) という名前の MenuItem オブジェクトをメイン フォームに追加します。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 コントロールの KeyDown イベントにコードを追加します。このイベントは Pocket PC の Action キーを押したときに発生します。このアクションを実行すると、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:" など) 用の Label コントロール。

    • 製品名用の Label コントロール。

    • 製造中止フラグ用の Label コントロール。このコントロールは、Products テーブルの Discontinued 列の値が true の場合に表示されます。このラベルのタイトルには、赤で "DISCONTINUED" と設定します。

  2. SummaryView フォームのコンストラクタに次のコードを追加してデータをバインドします。フォームのコンストラクタに渡される BindingSource のインスタンスに設定するために、フォーム変数 CurrentBindingSource を宣言します。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. ツールボックスから EditView フォームに InputPanel コンポーネントをドラッグします。このインスタンスが 1 つだけあれば、ユーザーは、ソフト入力パネル (SIP: Soft Input Panel) を使用してテキスト ボックスにテキストを入力できます。

  3. 次のコントロールをフォームに追加します。

    • Product Name ボックス用の Label コントロール。

    • Product 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. 変更をデータベースに適用して更新し、メイン フォームに戻るための MenuItem オブジェクトを追加し、Done というタイトルを付けます。

    ' 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 を使用する

概念

厳密に型指定された DataSet の生成 (ADO.NET)

その他の技術情報

.NET Compact Framework でのデータ アクセスと XML サポート