方法 : Smartphone で DataGrid を使用する
更新 : 2007 年 11 月
Smartphone の Contacts プログラムのような Smartphone アプリケーションの作成方法を説明します。
メモ : |
---|
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 入力内容をキャンセルし、メイン フォームに戻ります。 |
プロジェクトを作成し、メイン フォームをデザインするには
Visual Studio で、スマート デバイス プロジェクトを作成し、対象のプラットフォームを Windows Mobile 5.0 for Smartphone SDK または Windows Mobile 6 Standard 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 コントロールを追加します。
DataGrid コントロールを、Smartphone の Contacts リストのように表示するには、このコントロールのプロパティを次の表のように設定します。
DataGrid のプロパティ
設定する値
False
False
Point 構造体。x および y には -2 を設定。
Size 構造体。width には 184 を、height には 190 を設定。
DataSource プロパティを Orders テーブルに設定します。Visual Studio により、NorthwindDataSet、ProductsBindingSource、および ProductsTableAdapter の各オブジェクトがプロジェクトに追加されます。
[プロパティ] ペインの TableStyles プロパティをクリックします。[DataGridTableStyle コレクション エディタ] ダイアログ ボックスが表示されます。その後、以下の作業を行います。
TableStyles コレクションに DataGridTableStyle オブジェクトを追加します。
MappingName プロパティに "Products" を指定します。
GridColumnStyle プロパティをクリックします。[DataGridColumnStyle コレクション エディタ] ダイアログ ボックスが表示されます。
GridColumnStyles コレクションに DataGridTextBoxColumn オブジェクトを追加します。
MappingName プロパティをクリックし、Product Name を選択します。
[ヘッダー テキスト] ボックスおよび [幅] ボックスに目的の値を入力します。
他の列についても同様に設定します。
ダイアログ ボックスを閉じます。
プロジェクトにフォームを 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 オブジェクトをメイン フォームに追加します。これらのメニューは、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); } }
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(); } }
サマリ ビューを作成するには
次のコントロールをフォームに追加します。
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; } }
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(); }
編集ビューを作成するには
Microsoft.WindowsCE.Forms 名前空間への参照をプロジェクトに追加します。この処理は、テキスト ボックス コントロールに Smartphone の InputMode を設定するために必要です。
次のコントロールをフォームに追加します。
データ バインディングを設定するには、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"); } }
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(); }
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)