- - PR -
DataGridView内ComboBoxから移動時に発生するエラーについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-25 16:17
こんにちは。
いつもこちらではお世話になっています。 現在、以下の環境で開発を行っています。 OS :Windows XP 言語:C# DataGridView内でComboBoxを使用しているのですが、難解な不具合が発生していて、困り果てています。 本来は「ComboBoxでコードを選択→DataGridView内のComboBoxの横のセルに名称を表示」といった単純な処理をしたいと考えているのですが、不具合が生じております。 不具合の内容は何パターンか確認しており、以下のように処理を行うとエラーが発生します。 以下掲示板に、続きます。 (社内のフィルターの関係で一度に書ききれませんでした・・・申し訳ありません。) | ||||||||
|
投稿日時: 2007-04-25 16:18
@DataGridView内のComboBoxを展開
AComboBox内のリストをどれも選択せず、DataGridView以外のコントロールをクリック B再度@のComboBoxをクリック CComboBox欄は空白であるが、名称表示セルにはComboBoxの最上部にあるコードに対応する名称がされてしまう DComboBox内のリストからコードを選択 ETabキーで移動 Gエラーメッセージを表示 「DataTableの内部インデックスが破損しています」 【パターン2】 @DataGridView内のComboBoxを展開 AComboBox内のリストをどれも選択せず、DataGridView以外のコントロールをクリック B再度@のComboBoxをクリック CComboBox欄は空白であるが、名称表示セルにはComboBoxの最上部にあるコードに対応する名称がされてしまう DComboBox内のリストからコードを選択 Eマウスで移動 FComboBoxが空白となってしまう(未選択?) さらに続きます | ||||||||
|
投稿日時: 2007-04-25 16:19
【パターン3】
@DataGridView内のComboBoxを展開 AComboBox内のリストをどれも選択せず、DataGridView以外のコントロールをクリック B再度@のComboBoxをクリック CComboBox欄は空白であるが、名称表示セルにはComboBoxの最上部にあるコードに対応する名称がされてしまう A再度ComboBox内のリストをどれも選択せず、DataGridView以外のコントロールをクリック B再度@のComboBoxをクリック。また最上部の名称が表示される。 DComboBox内のリストからコードを選択 ETabで移動。DataGridVIewの最終行の最終列まで移動。 Fエラートラップで以下のメッセージをキャッチし、異常終了 「指定された引数は、有効な値の範囲内にありません。\r\nパラメータ名: rowIndex」 上記のCでComboBoxは空白であっても名称が表示されて(残って)しまっているのが、原因かとも思いますが・・・ また、コードから名称を取得→表示する処理は、本来SelectIndexChangedで行うものかもしれませんが、現在はComboBocのLeaveイベントで行っています。 それが悪いのでしょうか・・・ | ||||||||
|
投稿日時: 2007-04-25 16:20
参考までに、以下がLeaveの処理です。
private void lincdComboBox_Leave(object sender, EventArgs e) { DataGridViewComboBoxEditingControl combocon = (DataGridViewComboBoxEditingControl)sender; //入力コントロールを取得 DataGridView grid = combocon.EditingControlDataGridView; //入力コントロールからDataGridViewを取得 DataGridViewRow dataGridViewRow = grid.CurrentRow; //カレント行を取得 dataGridViewRow.Cells["LINNM"].Value = DBNull.Value; if (combocon.SelectedIndex == -1) return; DataRowView rowview = ((DataRowView)((ComboBox)sender).SelectedItem); if (rowview == null) return; dataGridViewRow.Cells["LINNM"].Value = rowview["LINNM"].ToString(); } 以上です。 色々試してみましたが、どうにもわかりません。 大変お忙しいところ申し訳ございませんが、どなたかお解かりになる方、ご教授下さい。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-04-25 17:06
何点かお聞きしたいのですが・・・。
1:データバインディングしているのかアンバウンドなのか 2:DataGridViewComboBoxColumnのItemへ設定しているのは文字列かそれ以外か 「選択していないものが表示される」、というのは気になりますね。 ところで名称を表示するとなると、DataGridViewのCellValueChangedイベントあたりで 処理を行うのがベターな気がしています。 | ||||||||
|
投稿日時: 2007-04-25 17:17
Ahf様
こんにちは。 返答ありがとうございます。
上記ですが、 1:ComboBoxはデータバインディングしています。 2:すみません。 "DataGridViewComboBoxColumnのItem"とは、GridViewの列の設定のItemのことでしょうか? それでしたら、特に設定しておらず、"(コレクション)"となっています。 ComboBoxへ表示する内容は文字列です・・・
そうなんですか・・・ そちらへ変更してやってみます。 | ||||||||
|
投稿日時: 2007-04-25 17:40
不具合の原因は、はっきりしませんが、
少なくとも DataGridViewComboBoxEditingControl の Leave でやるのは何か違う気がします。 (1) DataGridViewComboBoxEditingControl の SelectedIndexChanged で行う方法 (2) DataGridView の CellValueChanged で行う方法 の2つがあると思いますが、この2つでは動きが異なります。 (1)では、コンボボックスの選択を変更した瞬間に名称が変更されます。 (2)では、コンボボックスの選択を変更しただけでは変わらず、 コンボボックスのセルが編集モードから抜けたときに名称が変更されます。 ですので、編集モードから抜けたときに変更でよいのであれば、 DataGridView の CellValueChanged で行ってください。 選択した瞬間に変えたいならDataGridViewComboBoxEditingControl の SelectedIndexChanged を 使ってください。 あえて Leave に変えたのは何か理由があったのでしょうか? | ||||||||
|
投稿日時: 2007-04-26 09:54
KIさん、こんにちは。
アドバイス、ありがとうございます。
以前はSelectedIndexChangedで名称表示処理を行っていたのですが、今回の処理と同様のエラーが発生した為、Leaveに処理を移したという経緯があります・・・ 以下続きます。 |