ComboBoxにDataTableの内容を表示し、コードで項目選択し、選択された項目のDataRow値を取得する方法の解説とサンプルプログラムです。
データテーブルの内容をコンボボックスに表示
ComboBoxのDataSourceプロパティにDataTableをセットし、DisplayMemberプロパティに画面に表示する列名、ValueMemberプロパティに内部データ用の列名を指定します。-
C#
// DataTableを作成 DataTable dataTable = new DataTable(); dataTable.Columns.Add("表示列"); dataTable.Columns.Add("データ列"); // DataTableにデータを追加 DataRow row = dataTable.NewRow(); row["表示列"] = "みかん"; row["データ列"] = "ID001"; dataTable.Rows.Add(row); row = dataTable.NewRow(); row["表示列"] = "りんご"; row["データ列"] = "ID002"; dataTable.Rows.Add(row); // コンボボックスにデータテーブルをセット this.comboBox1.DataSource = dataTable; // 表示用の列を設定 this.comboBox1.DisplayMember = "表示列"; // データ用の列を設定 this.comboBox1.ValueMember = "データ列";
-
VB.NET
' DataTableを作成 Dim dataTable As New DataTable dataTable.Columns.Add("表示列") dataTable.Columns.Add("データ列") ' DataTableにデータを追加 Dim row As DataRow = dataTable.NewRow row("表示列") = "みかん" row("データ列") = "ID001" dataTable.Rows.Add(row) row = dataTable.NewRow row("表示列") = "りんご" row("データ列") = "ID002" dataTable.Rows.Add(row) ' コンボボックスにデータテーブルをセット Me.ComboBox1.DataSource = dataTable ' 表示用の列を設定 Me.ComboBox1.DisplayMember = "表示列" ' データ用の列を設定 Me.ComboBox1.ValueMember = "データ列"
選択された項目を取得
選択中項目に対応するデータを取得するにはSelectedItemプロパティまたはSelectedValueプロパティを使用します。 SelectedItemプロパティでDataRow、SelectedValueプロパティで内部データ値(ValueMemberプロパティで指定した列の値)が取得できます。-
C#
// 選択中のDataRowを取得 DataRowView selectedDataRow = (DataRowView)this.comboBox1.SelectedItem; // 選択中の内部値(データ列の値)を取得 String selectedValue = (String)this.comboBox1.SelectedValue;
-
VB.NET
' 選択中のDataRowを取得 Dim selectedDataRow As DataRowView = CType(Me.ComboBox1.SelectedItem, DataRowView) ' 選択中の内部値(データ列の値)を取得 Dim selectedValue As String = CStr(Me.ComboBox1.SelectedValue)
項目の選択と解除
SelectedValueプロパティに選択したい項目のインデックス番号を指定します。先頭項目はゼロで、-1を指定すると選択が解除されます。-
C#
// 先頭行を選択 this.comboBox1.SelectedValue = 0; // 選択を解除 this.comboBox1.SelectedValue = -1;
-
VB.NET
' 先頭行を選択 Me.ComboBox1.SelectedValue = 0 ' 選択を解除 Me.ComboBox1.SelectedValue = -1
データ列の値を指定して選択
データ列の値を指定して選択を行うメソッドは用意されていないため、自力でインデックス番号(SelectedValueプロパティに渡す番号)を調べる必要があります。 次のサンプルはデータ値(ValueMemberプロパティで指定した列の値)を渡すと対応するコンボボックス項目を選択するクラスと、その使用方法です。-
C#
class ComboBoxUtil { /// <summary> /// コンボボックスのValueMemberと一致する行を選択 /// </summary> public static void SelectFromValue<t>(ComboBox comboBox, t value) { if (comboBox.Items.Count == 0) { // データなし return; } // 未選択にしておく comboBox.SelectedIndex = -1; DataTable dt = (DataTable)comboBox.DataSource; for (int i = 0; i < dt.Rows.Count; i++) { DataRow row = dt.Rows[i]; if (row[comboBox.ValueMember] == DBNull.Value) { if (value == null) { // NULL同士なので選択して終了 comboBox.SelectedIndex = i; break; } else { // 一致しないのでループ続行 continue; } } if (row[comboBox.ValueMember].Equals(value)) { // 値が一致したので選択して終了 comboBox.SelectedIndex = i; break; } } } }
使い方
// データ列と一致する行を選択 ComboBoxUtil.SelectFromValue(this.comboBox1, "ID002");
-
VB.NET
Class ComboBoxUtil ''' <summary> ''' コンボボックスのValueMemberと一致する行を選択 ''' </summary> Public Shared Sub SelectFromValue(Of t As IEquatable(Of t))(ByVal comboBox As ComboBox, ByVal value As t) If comboBox.Items.Count = 0 Then ' データなし Return End If ' 未選択にしておく comboBox.SelectedIndex = -1 Dim dt As DataTable = CType(comboBox.DataSource, DataTable) For i As Integer = 0 To dt.Rows.Count - 1 Dim row As DataRow = dt.Rows(i) If row(comboBox.ValueMember) Is DBNull.Value Then If value Is Nothing Then ' NULL同士なので選択して終了 comboBox.SelectedIndex = i Exit For Else ' 一致しないのでループ続行 Continue For End If End If If CType(row(comboBox.ValueMember), t).Equals(value) Then ' 値が一致したので選択して終了 comboBox.SelectedIndex = i Exit For End If Next End Sub End Class
使い方
' データ列と一致する行を選択 ComboBoxUtil.SelectFromValue(Of String)(Me.ComboBox1, "ID002")
サンプルコードのダウンロード
サンプルコードの実行には Microsoft Visual Studio 2008 以上のバージョンが必要です。 2008以外のバージョンではプロジェクトを開いた際にファイルの変換が必要な場合があります。その場合は変換後に実行してください。検証環境
- Microsoft Visual Studio 2008 Version 9.0.30729.4462 QFE Edition: Professional
- Microsoft .NET Framework Version 3.5 SP1
- Microsoft Windows 7 Professional Service Pack 1 (Microsoft Windows NT 6.1 (7601))