- PR -

DataGridView内ComboBoxから移動時に発生するエラーについて

投稿者投稿内容
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-26 09:54
SelectedIndexChangedで名称表示を行っていた際も、コンボボックスを展開→リスト内を選択せずに他のコントロールへ移動→元のコンボボックスへ移動(クリックにて)すると、ComboBoxのコードは空白なのに、名称欄にはComboBoxリスト内の一番最初にある名称が表示されてしまうと言った現象が起きました。
この後セルを移動すると「指定された引数は、有効な値の範囲内にありません。
パラメータ名: rowIndex」で異常終了してしまいました。
現在CellValueChangedで処理をしようとコードを書き換えていますが、ComboBox内の名称の取得に苦労しています・・・

リスト内をクリックして選択したわけではないのに、なぜ名称が表示れるのかがわかりません。
ComboBoxは展開しただけで、選択したことになってしまうのでしょうか?
それともセルのCommitのタイミングの問題なのでしょうか・・・
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2007-04-26 10:23
こんにちは。
私も全く同じではありませんが、DataGridView内のComboBoxの先頭の項目が
勝手に表示された状態になる(ただし実際は選択されていない)という現象に
困っていました。
ComboBox.DataSourceにはDataTable型のインスタンスをバインドしています。

そこで、ComboBoxにデータバインドする前に、
バインドするDataTableの1行目に空の行を追加する処理を加えました。
※ValueMemberに対応する列に初期値(0や空文字)、DisplayMemberに対応する列に空文字をセット
そして、DataGridView.DataSourceにデータバインドしたときに、列の項目が未入力の場合はComboBoxの先頭の項目が選択されるようにしました。

つまり、「ComboBox内のリストをどれも選択せず」という状態をなくしてしまいました。

これで今のところエラーは出てきていません。
ただし試験を十分実施した状態ではないので、試験時に何か問題が出るかもしれません。
なのでいい方法かどうか全然自信はありませんが、何かの参考になればと思います。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-26 10:51
rainさん、こんにちは。

実は現在開発している画面はTab切替で、複数のDataGridViewが混在しています。
その中でもこのDataGridViewのみがうまく動きません。
rainさんの仰るとおり、処理の都合上、一番最初の行を空白行にしたComboBoxを使用しているDataGridViewもあり、それについては特に問題は起きていません。
今回エラーが起きているDataGridViewで使用しているComboBoxは直接データバインドしているのですが、同様にデータバインドしたComboBoxを使用しているのにエラーが起きないものもあり、混乱しています。

続きます(すみません・・・)
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-26 10:51
その2つの違いはComboBoxを展開し、リスト内からコード選択した後に何も処理をしないか、コードから名称を取得して他のセルにセットしているかの違いです。
他はほとんど変わりがないので、名称のセットの仕方が悪いような気もしていますが・・・まだ原因解明には至りません。

できれば空白行を入れない方法でやりたいと思いますが、このまま進まないようであれば、その方法でも考えてみようかと思います・・・

しかしすっきりしません(~_~
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2007-04-26 13:20
引用:

イナバさんの書き込み (2007-04-26 10:51) より:
その2つの違いはComboBoxを展開し、リスト内からコード選択した後に何も処理をしないか、コードから名称を取得して他のセルにセットしているかの違いです。
他はほとんど変わりがないので、名称のセットの仕方が悪いような気もしていますが・・・まだ原因解明には至りません。


ComboBoxの選択を他の列のセルに反映するような処理はしていないので、
こちらのほうはちとわかりません。ごめんなさい。

私も原因の解明には至っていないのですが、調べているうちに
「こうなったらまずい?」というようなものが予想できたので、
そうならないようにしたら、とりあえずうまくいっているというお話でした。

確かにしっくりはこないのですが、目の前の開発を滞らせないほうが私にとっては大事ですので...

当時調べたときに、似たような現象に関するBlogが見つかったので紹介しておきます。
ただ、私はこの内容をちゃんとは理解していません。
http://hongliang.seesaa.net/archives/20060125-1.html

※「こうなったらまずい?」と部分を具体的に書いてみると、
 普通のComboBoxでいうところのSelectedIndexが-1の状態です。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-26 14:54
rainさん。
参考になりました。ありがとうございました。

別件で質問させてください。
初歩の初歩かもしれませんが・・・

今回のエラーですがCellValueChangedに名称取得処理を移動させれば、なんとか回避できそうな感じがしてきました。
そこでDataGridViewのCellValueChangedイベント内で、DataGridView内にあるComboBoxのSelectedItemをDataRowViewにキャストして、選択したコードに対応するバインディングした内容を取得したいのですが、その記述でイマイチ要領を得ません。

ComboBoxのイベント内でしたら
 DataRowView rowview = ((DataRowView)((ComboBox)sender).SelectedItem);
上記で取得できるのですが。

もしわかる方がいらっしゃれば、お教え下さい。
よろしくお願いします。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-04-26 15:19
CellValueChangedイベントではsenderにはDataGridViewコントロールが設定されていますので、
そこからEditingControlプロパティを経由してあげれば、SelectedIndexも取得できます。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-26 16:55
Ahf様、ありがとうございましたm(__)m
以下のようなコードを記述しましたら、思ったとおりの動作ができました。
(Ahfさまが仰った事は以下のような内容でちゃんと理解できてますでしょう?)
コード:
private void line_dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == line_dataGridView.Columns["LINCD"].DisplayIndex)
    {
        if (e.ToString().Length > 0)
        {
            DataGridView dGridView = (DataGridView)sender;
            DataGridViewComboBoxEditingControl comboCon = (DataGridViewComboBoxEditingControl)dGridView.EditingControl;
            DataRowView dRowView = (DataRowView)comboCon.SelectedItem;
            if (dRowView == null)
                return;
            line_dataGridView.CurrentRow.Cells["LINNM"].Value = dRowView["LINNM"].ToString();
        }
    }
}


上記コードを記述した場合、ComboBoxのリストを選択しないで他のコントロールへ移動しても名称も残らず、エラーも発生しなくなりました。
ずっと困っていたので感激です!!
皆様、本当に本当に、ありがとうございましたm(__)m
これからも精進します。

スキルアップ/キャリアアップ(JOB@IT)