方法 : Smartphone で DataGrid を使用する

更新 : 2007 年 11 月

Smartphone の Contacts プログラムのような Smartphone アプリケーションの作成方法を説明します。

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

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

この例では、メイン フォームの DataGrid コントロールに、Visual Studio と一緒にインストールされる Northwind データベースから読み込んだ製品名の一覧を表示します。また、現在のレコードを表示するサマリ ビュー フォームと、データの編集と新しいレコードの追加を行う編集ビュー フォームもあります。BindingSource オブジェクトでは、データベースで現在選択されているレコードにアクセスできます。データ バインディング コントロールだけでなく、BindingSource オブジェクトでも、現在の行の DataRowView オブジェクトを取得できます。DataRowView を使用すると、列の現在の値など、さまざまな目的でデータにアクセスできます。

また、DataGrid コントロールのスマート タグで表示されるショートカット メニューの [データ フォームを生成します] をクリックして、サマリ フォームおよび編集フォームを Visual Studio で自動作成することもできます。この例では、参考用に表示してあるため、サマリ フォームおよび編集フォームの列は 2 列だけにしてあります。

次の表は、このアプリケーションで使用するフォームの説明です。また、Smartphone の左右のソフト キーに対応するメニュー オプションも示してあります。

フォーム

機能

左ソフト キー

右ソフト キー

メイン フォーム

(Form1)

テーブルの列の 1 つを、Smartphone の Contacts プログラムで採用されている一覧の形式で DataGrid コントロールに表示します。

Action キー (エミュレータの場合は Enter キー) を押すと、サマリ ビュー フォームが表示されます。

New

データベースに新しいレコードを追加し、EditView フォームを表示します。

Edit

EditView フォームを表示します。

SummaryView

現在のレコードの列の値を参照に適した形式にして表示します。

Done

メイン フォームに戻ります。

(なし)

EditView

現在のレコードの列の値を編集に適した形式にして表示します。

Done

入力内容を受け入れてデータベースを更新し、メイン フォームを表示します。

Cancel

入力内容をキャンセルし、メイン フォームに戻ります。

プロジェクトを作成し、メイン フォームをデザインするには

  1. Visual Studio で、スマート デバイス プロジェクトを作成し、対象のプラットフォームを Windows Mobile 5.0 for Smartphone SDK または Windows Mobile 6 Standard 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 フォルダにインストールされています。

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

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

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

  5. ツールボックスからフォームに DataGrid コントロールを追加します。

  6. DataGrid コントロールを、Smartphone の Contacts リストのように表示するには、このコントロールのプロパティを次の表のように設定します。

    DataGrid のプロパティ

    設定する値

    ColumnHeadersVisible

    False

    RowHeadersVisible

    False

    GridLineColor

    Window

    Location

    Point 構造体。x および y には -2 を設定。

    Size

    Size 構造体。width には 184 を、height には 190 を設定。

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

  8. [プロパティ] ペインの TableStyles プロパティをクリックします。[DataGridTableStyle コレクション エディタ] ダイアログ ボックスが表示されます。その後、以下の作業を行います。

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

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

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

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

    5. MappingName プロパティをクリックし、Product Name を選択します。

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

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

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

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

  10. 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();
    }
    
  11. New(MenuItem1) という名前および Edit (MenuItem2) という名前の MenuItem オブジェクトをメイン フォームに追加します。これらのメニューは、Smartphone の左右のソフト キーに対応しています。New メニューおよび Edit メニューの Click イベントに次のコードを追加します。

    ' Add new record.
    Private Sub MenuItem1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MenuItem1.Click
        ProductsBindingSource.AddNew()
        Dim EditViewDialog As New EditView(ProductsBindingSource)
        If EditViewDialog.ShowDialog() <> DialogResult.OK Then
            ProductsBindingSource.CancelEdit()
        Else
            ProductsBindingSource.EndEdit()
            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 MenuItem1.Click
        Dim EditViewDialog As New EditView(ProductsBindingSource)
        If EditViewDialog.ShowDialog() <> DialogResult.OK Then
            ProductsBindingSource.CancelEdit()
        Else
            ProductsBindingSource.EndEdit()
            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);
        }
    }
    
  12. Smartphone の Action キーを押したときに発生する、メイン フォームの KeyDown イベントにコードを追加します。このアクションを実行すると、SummaryView フォームが表示されます。

    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 SummaryView = New SummaryView(ProductsBindingSource)
            Cursor.Current = Cursors.Default
            SummaryView.ShowDialog()
        End If
    End Sub
    
    private void dataGrid1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            SummaryView SummaryViewDialog = 
              new SummaryView(productsBindingSource);
            SummaryViewDialog.ShowDialog();
         }
    }
    

サマリ ビューを作成するには

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

    • 製品名の見出し ("Product Name:" など) 用の Label コントロール。

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

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

  2. SummaryView フォームのコンストラクタに次のコードを追加してデータをバインドします。フォームのコンストラクタに渡された BindingSource のインスタンスを設定するために、フォーム変数 CurrentBindingSource を宣言します。DataRowView オブジェクトを使用して、Discontinued 列が true の場合に、Discontinued ラベルを表示するようにします。

    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
    
        ' This call is required by the Windows Forms Designer.
        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.
            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;
        }
    }
    
  3. Done というタイトルで、左ソフト キー用の MenuItem オブジェクトを追加し、左ソフト キーを押すと、フォームを終了してメイン フォームに戻るようにします。

    Private Sub MenuItem1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MenuItem1.Click
        Me.Close
    End Sub
    
    private void MenuItem1_Click(object sender, System.EventArgs e)
    {
        this.Close();
    }
    

編集ビューを作成するには

  1. Microsoft.WindowsCE.Forms 名前空間への参照をプロジェクトに追加します。この処理は、テキスト ボックス コントロールに Smartphone の InputMode を設定するために必要です。

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

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

    • Product Name 列に対応する TextBox コントロール。

    • Discontinued 列の値に対応する CheckBox コントロール。

  3. データ バインディングを設定するには、InitializeComponent 呼び出しの後に、次のコードをフォームのコンストラクタに追加します。このコードは、新しいレコードの追加や既存のレコードの編集に対応しています。新しいレコードが追加されるときには、DataRowView オブジェクトを使用して、Discontinued 列の値が null 値であるかどうかを判断していますオブジェクトの値が null の場合、このチェック ボックスには false が設定されます。

    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.
    
        ' Set the Smartphone input mode.
        InputModeEditor.SetInputMode(ProductNameTextBox,_
          InputMode.AlphaT9)
        ProductNameTextBox.DataBindings.Add("Text",_
          CurrentBindingSource, "Product Name")
    
        ' Determine the Discontinued value.
        ' If null, change to False.
        Dim drView As DataRowView
        drView = CurrentBindingSource.Current
        ' Set the bindings.
        If IsDBNull(drView("Discontinued")) Then
            DiscontinuedCheckBox.DataBindings.Add("CheckState",_
              CurrentBindingSource, "Discontinued", True,_
              DataSourceUpdateMode.OnValidation, False, "")
        Else
            DiscontinuedCheckBox.DataBindings.Add("Checked",_
              CurrentBindingSource, "Discontinued")
         End If
    End Sub
    
    public EditView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
        InitializeComponent();
        // Set the Smartphone input mode.
        InputModeEditor.SetInputMode(ProductNameTextBox,
          InputMode.AlphaT9);
        // Set the bindings.
        ProductNameTextBox.DataBindings.Add("Text",
          CurrentBindingSource,"Product Name");
        // Determine the Discontinued value.
        // If null, change to False.
        DataRowView drView;
        drView = (DataRowView) CurrentBindingSource.Current;
        if(drView("Discontinued")== null)
        {
            DiscontinuedCheckBox.DataBindings.Add("CheckState",
              CurrentBindingSource, "Discontinued",
              true,DataSourceUpdateMode.OnValidation,false,"");
        }
        else
        {
            DiscontinuedCheckBox.DataBindings.Add("Checked",
              CurrentBindingSource, "Discontinued");
        }
    }
    
  1. Done というタイトルで、左ソフト キー用の MenuItem オブジェクトを追加し、変更内容をデータベースに更新してメイン フォームに戻るようにします。

    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
    
    Private void MenuItem1_Click(object sender, System.EventArgs e)
    {
        this.DialogResult = DialogResult.OK;
        this.Close();
    }
    
  1. Cancel というタイトルで、右ソフト キー用の MenuItem オブジェクトを追加し、変更内容を破棄してメイン フォームに戻るようにします。

    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
    
    Private void MenuItem2_Click(object sender, System.EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
        this.Close();
    }
    

コードのコンパイル方法

この例では、次の名前空間への参照が必要です。

参照

処理手順

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

概念

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

その他の技術情報

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