- PR -

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

投稿者投稿内容
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-25 16:17
こんにちは。
いつもこちらではお世話になっています。
現在、以下の環境で開発を行っています。
 OS :Windows XP
 言語:C#

DataGridView内でComboBoxを使用しているのですが、難解な不具合が発生していて、困り果てています。
本来は「ComboBoxでコードを選択→DataGridView内のComboBoxの横のセルに名称を表示」といった単純な処理をしたいと考えているのですが、不具合が生じております。
不具合の内容は何パターンか確認しており、以下のように処理を行うとエラーが発生します。
以下掲示板に、続きます。
(社内のフィルターの関係で一度に書ききれませんでした・・・申し訳ありません。)
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 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/01/31
投稿数: 37
投稿日時: 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/01/31
投稿数: 37
投稿日時: 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();
}

以上です。

色々試してみましたが、どうにもわかりません。
大変お忙しいところ申し訳ございませんが、どなたかお解かりになる方、ご教授下さい。
よろしくお願いいたします。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-04-25 17:06
何点かお聞きしたいのですが・・・。

1:データバインディングしているのかアンバウンドなのか
2:DataGridViewComboBoxColumnのItemへ設定しているのは文字列かそれ以外か

「選択していないものが表示される」、というのは気になりますね。

ところで名称を表示するとなると、DataGridViewのCellValueChangedイベントあたりで
処理を行うのがベターな気がしています。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-25 17:17
Ahf様
こんにちは。
返答ありがとうございます。

引用:

1:データバインディングしているのかアンバウンドなのか
2:DataGridViewComboBoxColumnのItemへ設定しているのは文字列かそれ以外か



上記ですが、
1:ComboBoxはデータバインディングしています。
2:すみません。
  "DataGridViewComboBoxColumnのItem"とは、GridViewの列の設定のItemのことでしょうか?
 それでしたら、特に設定しておらず、"(コレクション)"となっています。
 ComboBoxへ表示する内容は文字列です・・・

引用:

ところで名称を表示するとなると、DataGridViewのCellValueChangedイベントあたりで
処理を行うのがベターな気がしています。


そうなんですか・・・
そちらへ変更してやってみます。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-25 17:40
不具合の原因は、はっきりしませんが、
少なくとも DataGridViewComboBoxEditingControl の Leave でやるのは何か違う気がします。

(1) DataGridViewComboBoxEditingControl の SelectedIndexChanged で行う方法
(2) DataGridView の CellValueChanged で行う方法

の2つがあると思いますが、この2つでは動きが異なります。

(1)では、コンボボックスの選択を変更した瞬間に名称が変更されます。
(2)では、コンボボックスの選択を変更しただけでは変わらず、
コンボボックスのセルが編集モードから抜けたときに名称が変更されます。

ですので、編集モードから抜けたときに変更でよいのであれば、
DataGridView の CellValueChanged で行ってください。
選択した瞬間に変えたいならDataGridViewComboBoxEditingControl の SelectedIndexChanged を
使ってください。

あえて Leave に変えたのは何か理由があったのでしょうか?
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-04-26 09:54
KIさん、こんにちは。
アドバイス、ありがとうございます。
引用:

あえて Leave に変えたのは何か理由があったのでしょうか?


以前はSelectedIndexChangedで名称表示処理を行っていたのですが、今回の処理と同様のエラーが発生した為、Leaveに処理を移したという経緯があります・・・

以下続きます。

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