|
分類:[VB.NET/VB2005]
お世話になります。
DataSourceにDBより取得したDataTableを設定したDataGridViewに
コンボボックス(DataGridViewComboBoxEditingControl)同士で
連動して値が設定される列を2列作成しました。
その2列(DataGridViewComboBoxColumn)にも
DataSourceにDBより取得したDataTableを設定しています。
(2列共同じ内容のDataTable)
2列とも同じデータを利用し、
1方はコード、一方は名称で選択できる様にしました。
下記のような感じです。
−−−−−−−−−−−−−
|ユーザーID |ユーザー名 |
−−−−−−−−−−−−−
|111A|▽||山田太郎|▽|
−−−−−−−−−−−−−
|111B|▽||田中次郎|▽|
−−−−−−−−−−−−−
「ユーザーID」列
ValueMember :コード
DisplayMember:コード
「ユーザー名」列
ValueMember :コード
DisplayMember:名称
この状態でどちらの列の値を変えられても
もう一方の列の値も変わるように、以下の様な処理を組み込みました。
・イベントの設定
Private objComboEdit As DataGridViewComboBoxEditingControl
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
objComboEdit = DirectCast(e.Control, DataGridViewComboBoxEditingControl)
AddHandler objComboEdit.SelectedValueChanged, New EventHandler(AddressOf dgvComboBoxEditingControl_SelectedValueChanged)
End Sub
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
If Not objComboEdit Is Nothing Then
RemoveHandler objComboEdit.SelectedValueChanged, AddressOf dgvComboBoxEditingControl_SelectedValueChanged
objComboEdit = Nothing
End If
End Sub
・値の同期
Private Sub dgvComboBoxEditingControl_SelectedValueChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim objCombo As DataGridViewComboBoxEditingControl = DirectCast(sender, DataGridViewComboBoxEditingControl)
If objCombo.DataSource Is Nothing Then Return
Dim objView As DataGridView = objCombo.EditingControlDataGridView
'変更行取得
Dim objRow As DataRowView = DirectCast(objView.CurrentRow.DataBoundItem, DataRowView)
objRow(0) = objCombo.SelectedValue.ToString
objRow(1) = objCombo.SelectedValue.ToString
objView.InvalidateRow(objView.CurrentRow.Index)
End Sub
これでしばらくは想定どおり動いていたのですが、
次のような操作を行なうとエラーが発生してしまいます。
@どちらの列でも良いのでセルを編集状態にする(リストは表示されておらず、へこんでいる状態)
A「Esc」キーを押下で編集状態解除
B再度同じセルを編集状態にしてコンボで選ばれている値を変更
Cどこか違うセルを押下(アクティブセル変更)
ここのCでフォーカスが外れる前にエラーが発生しましました。
「System.ArgumentException:
DataGridViewComboBoxCellの値が有効ではありません。」
そこでソースを追ってみると
上記のCの時点、コンボで選ばれている値を変更した時とは別に
そのセルからフォーカスが外れる際に、
「dgvComboBoxEditingControl_SelectedValueChanged」のイベントが何度も走り、
何回かは
If objCombo.DataSource Is Nothing Then Return の行で抜けているのですが、
(この1行は実験中にいれてそのまま残っていたものです。。。)
途中で
objCombo.SelectedValue.ToStringの中身が "System.Data.DataRowView" となっており、
それをもう一方の列に設定しようとしてエラーが発生していました。
※ objCombo.SelectedValue.Item(0) でコードが出てきます。。。
かなりWeb上で検索も掛けてみたつもりですが
めぼしい情報にはたどりつけず、途方にくれています。
上記のような操作をしてもうまく動作するには
どのようにすれば良いでしょうか?
長文な上、拙い文章でわかり辛い点もあると思いますが
どうかご教示下さい。
|