- 題名: DataGridView内の2つのComboBoxを連携させたい
 - 日時: 2012/09/09 19:04:55
 - ID: 30915
 - この記事の返信元: 
- (なし)
 
 - この記事への返信: 
- [30916] Re[1]: DataGridView内の2つのComboBoxを連携させたい2012/09/09 23:24:47
 
 - ツリーを表示
 
■No30921に返信(おださとさんの記事)
> dgv_TBL_SUPPLEMENTARYINFO(w_X, w_Y).Value = DBNull.Value ←教えていただいた分
これはSelectedIndexChangedが発生したセルでこれからリストを設定するセルではない気がしますが、どうでしょう?
> Me.cmb_tab5_InfoType.DataSource = w_list1
> Me.cmb_tab5_InfoType.DisplayMember = "Value"
> Me.cmb_tab5_InfoType.ValueMember = "Key"
これのcmb_tab5_InfoTypeが何を表しているのか分かりませんがこれはもしかして列の情報(DataGridViewColumn)ではないですか?
以下、サンプルです。
2列(Column1,Column2)で両方ともコンボボックスのDataGridViewを配置してあります。
1列目は3項目固定で設定してあります。
★の箇所がDBNull.Valueに設定している箇所です。ここをコメントアウトして
1列目を選んで2列目を"a1"を選べば1列目を変更しても例外が発生しませんが
"a1"以外を選んでから1列目を変更すると例外が発生します。
☆の箇所をColumn2.DataSource =lstとすると該当行以外で"a1"が選ばれていると例外が発生します。例外が発生しない場合でも他の行のリストも変更されてしまいます。
Private dataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing
Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    '表示されているコントロールがDataGridViewComboBoxEditingControlか調べる
    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
        Dim dgv As DataGridView = CType(sender, DataGridView)
        '該当する列か調べる
        If dgv.CurrentCell.ColumnIndex = 0 Then
            '編集のために表示されているコントロールを取得
            Me.dataGridViewComboBox = _
                CType(e.Control, DataGridViewComboBoxEditingControl)
            'SelectedIndexChangedイベントハンドラを追加
            AddHandler Me.dataGridViewComboBox.SelectedIndexChanged, _
                AddressOf dataGridViewComboBox_SelectedIndexChanged
        End If
    End If
End Sub
'CellEndEditイベントハンドラ
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellEndEdit
    'SelectedIndexChangedイベントハンドラを削除
    If Not (Me.dataGridViewComboBox Is Nothing) Then
        RemoveHandler Me.dataGridViewComboBox.SelectedIndexChanged, _
            AddressOf dataGridViewComboBox_SelectedIndexChanged
        Me.dataGridViewComboBox = Nothing
    End If
End Sub
'DataGridViewに表示されているコンボボックスの
'SelectedIndexChangedイベントハンドラ
Private Sub dataGridViewComboBox_SelectedIndexChanged(ByVal sender As Object, _
        ByVal e As EventArgs)
    '選択されたアイテムを表示
    Dim cb As DataGridViewComboBoxEditingControl = _
        CType(sender, DataGridViewComboBoxEditingControl)
    Dim lst As New List(Of String)
    Select Case cb.SelectedIndex
        Case 0
            lst.AddRange({"a1", "a2", "a3"})
        Case 1
            lst.AddRange({"a1", "b2", "b3"})
        Case 2
            lst.AddRange({"a1", "c2", "c3"})
    End Select
    Dim cell = DirectCast(DataGridView1(1, cb.EditingControlRowIndex), DataGridViewComboBoxCell)
    cell.Value = DBNull.Value   '<--- ★
    cell.DataSource = lst    '<--- ☆
End Sub
分類:[.NET]
VB.net初心者です。よろしくお願いいたします。
《環境》SQLServer2008、VB2010
DataGridView内にコンボボックスを2つ配置し、
片方のコンボボックス(Combo_A)の値を変更されたら、
もう片方のコンボボックス(Combo_B)の選択肢を変更するような
プログラミングを行おうとしています。
こちらの掲示板を参考にし、
(http://dobon.net/vb/dotnet/datagridview/selectedindexchanged.html)
コンボボックスのイベントにてCombo_Bの選択肢が変更にできるよう
プログラミングすることができました。
しかし、いったんCombo_A、Combo_Bの入力を行った後、
再びCombo_Aの修正を行った際に、以下のエラーが発生しました。
「DataGridViewで次の例外が発生しました
System.ArgumentException: DataGridViewComboBoxCellの値が有効ではありません。」
エラーが発生した箇所は、フォームが表示される際に起こっています。
ちなみにF8などで、1行ずつステップさせてみましたが、
エラーが自分で書いたソース上で起こらないため、
どこが悪いのかさっぱりわかりません。
原因として考えられそうなことがあれば
教えていただけませんでしょうか?