方法 : Pocket PC で DataGrid を使用する
更新 : 2007 年 11 月
この例では、フォームで DataGrid を使用して、DataGrid コントロールで選択されているレコードを参照および編集するテクニックと、データベースに新しいレコードを追加するテクニックを示します。.NET Compact Framework では、DataGrid のセルの編集がサポートされていないため、DataGrid の値を編集するにはユーザー インターフェイスを用意する必要があります。この例では、Northwind データベースを使用します。このデータベースは、Visual Studio と一緒にインストールされています。
メモ : |
---|
.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 入力内容をキャンセルし、メイン フォームに戻ります。 |
プロジェクトを作成し、メイン フォームをデザインするには
Visual Studio で、スマート デバイス プロジェクトを作成し、対象のプラットフォームを Windows Mobile 5.0 Pocket PC SDK または Windows Mobile 6 Professional SDK に設定します。
[データ] メニューの [新しいデータ ソースの追加] をクリックします。
データ ソース構成ウィザードで、Microsoft SQL Server Compact Edition (.NET Framework SQL Server CE 用データ プロバイダ) を使用して Northwind データベースに接続します。Northwind データベース (Northwind.sdf) は、\Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples フォルダにインストールされています。
メモ : Windows Vista では、管理者として Visual Studio を実行し、Northwind データベースにアクセスする必要があります。データベースを追加する方法の詳細については、「方法 : デバイス プロジェクトにデータベースを追加する」を参照してください。
このウィザードの [データベース オブジェクトの選択] ページで、Products テーブルとそのすべての列を選択します。
ツールボックスからフォームに DataGrid コントロールを追加します。コントロールのサイズ プロパティおよびレイアウト プロパティに適切な値を設定します。
DataSource プロパティを Products テーブルに設定します。Visual Studio により、NorthwindDataSet、ProductsBindingSource、および ProductsTableAdapter の各オブジェクトがプロジェクトに追加されます。
DataGridTableStyle オブジェクトを TableStyles コレクションに追加して、DataGrid コントロールにテーブルの 1 列または 2 列が表示されるようにします。[プロパティ] ペインの TableStyles プロパティをクリックします。[DataGridTableStyle コレクション エディタ] ダイアログ ボックスが表示されます。その後、以下の作業を行います。
TableStyles コレクションに DataGridTableStyle オブジェクトを追加します。
MappingName プロパティに "Products" を指定します。
GridColumnStyle プロパティをクリックします。[DataGridColumnStyle コレクション エディタ] ダイアログ ボックスが表示されます。
GridColumnStyles コレクションに DataGridTextBoxColumn オブジェクトを追加します。
MappingName プロパティをクリックし、[製品名] を選択します。
[ヘッダー テキスト] ボックスおよび [幅] ボックスに目的の値を入力します。
他の列についても同様に設定します。
ダイアログ ボックスを閉じます。
プロジェクトにフォームを 2 つ追加します。1 つはサマリ ビュー用、もう 1 つは編集ビュー用です。フォームに SummaryView および EditView という名前を付けます。
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(); }
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); } }
メイン フォームの 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(); } }
サマリ ビューを作成するには
次のコントロールを SummaryView フォームに追加します。
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; } }
編集ビューを作成するには
Microsoft.WindowsCE.Forms 名前空間への参照をプロジェクトに追加します。
ツールボックスから EditView フォームに InputPanel コンポーネントをドラッグします。このインスタンスが 1 つだけあれば、ユーザーは、ソフト入力パネル (SIP: Soft Input Panel) を使用してテキスト ボックスにテキストを入力できます。
次のコントロールをフォームに追加します。
Product Name ボックス用の Label コントロール。
Product Name 列に対応する TextBox コントロール。
Discontinued 列に対応する CheckBox コントロール。コントロールの ThreeState プロパティに true を設定します。
データ バインディングを設定するには、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"); } }
変更をデータベースに適用して更新し、メイン フォームに戻るための 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(); }
変更を破棄してメイン フォームに戻るには、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)