C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataGridViewに連動するComboBox列でエラー


(過去ログ 22 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■9584 / inTopicNo.1)  DataGridViewに連動するComboBox列でエラー
  
□投稿者/ plodder (1回)-(2007/10/31(Wed) 11:31:43)

分類:[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上で検索も掛けてみたつもりですが
めぼしい情報にはたどりつけず、途方にくれています。
上記のような操作をしてもうまく動作するには
どのようにすれば良いでしょうか?

長文な上、拙い文章でわかり辛い点もあると思いますが
どうかご教示下さい。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -