2012/06/07

VB.NET データグリッドのコンボボックスにDBから選択した複数のデータを格納

データグリッドのセルをコンボボックスにして、そのコンボボックスに文字列だけではなく、複数の値を持たせたいときの処理

たとえば、TALBE_A に以下のようにデータが入っているとする。

TABLE_A: | Field_ID | Field_NAME | | 0001 | あああ | | 0002 | いいい | | 0003 | ううう | | 0004 | えええ | ...

このとき、TALBE_A からデータを取得してコンボボックスには以下のように「Field_NAME」の項目を表示させつつも、項目を選択時には「Field_ID」の値を取得するようにしたい。

コンボボックスのアイテム: | あああ | | いいい | | ううう | | えええ | ...

このとき、TABLE_A からSELECTしたデータを直接コンボボックスに渡して、かつ表示する値と、コンボボックス選択時に取得する値を以下のように設定することができる。

TABLE_A: Dim dt As DataTable 'データの取得 'SelectFromDB ...SQLを実行してDataTableを返す関数をどこかで定義 dt = SelectFromDB("select Field_ID, Field_NAME from TABLE_A order by Field_ID")  'ここでは、DataGridView1 の"ComboCell"という名前の列がコンボボックスになっている Dim comboCol As DataGridViewComboBoxColumn = Me.DataGridView1.Columns("ComboCell") 'データグリッドビューのコンボボックスにデータをバインド comboCol.DataSource = dt 'コンボボックスに表示されるのはTABLE_Aの「Field_NAME」のデータ comboCol.DisplayMember = "Field_NAME" 'コンボボックスの値として扱われるのは「Field_ID」のデータ comboCol.ValueMember = "Field_ID"

データを取得する際は、以下のようになる。

Dim dgvComboBox As DataGridViewComboBoxCell = _ DataGridView1.Rows(iRowNo).Cells("ComboCell") Dim iID As Integer = dgvComboBox.Value Dim strNAME As String = dgvComboBox.FormattedValue

valueとFormattedValueを利用する点に注意。