- PR -

DataGridで、フィルタ有効時にデータ変更を行うと'System.IndexOutOfRangeException' が発生

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-04-11 06:32
なんか、サンプルいうてもひどいなぁ、参照先のコード。ほんまにDAさんが書いた記事?
http://www.atmarkit.co.jp/fdotnet/dotnettips/099dgchgcell/dgchgcell.html

 「100以上の値は設定させない」とかコメントに書いてあるけど、コードは1000個以上やし。
 Form_Load で、データを初期化したらあかんやろ。まぁ、サンプルやで、不要な説明は端折って、コードは短くすませたいもんな。
 Exception クラスをスローしたらあかんやろ。せめて ApplicationException にして欲しいなぁ。あ、tokeiさんは、ApplicationException クラスを継承したクラスを自作してや。

 まぁ、あれや。サンプルはあくまでも“見本”やから、そのまま使うたらあかんっちゅうこっちゃ。これは、MSDN のサンプルもそうやから、気ぃ付けや。


 それから、tokeiさんのコード。
 データの変更が確定してないのに this.dataTable1.AcceptChanges(); はあかんやろ。
 丸投げやないいうんやったら、ColumnChanging は
コード:
private void dataSet1_ColumnChanging(...)
{
    // 現象再現のため、必ずエラーとする
    e.Row.SetColumnError(e.Column,"error");
    throw new ApplicationException("error");
}


でええね。かつ、参照元と同じところなんか端折ってしもうたらええし。

 それからカラムの比較順序やけど、ID、個数、商品名の順やけど、ここって変えてええのは「個数」だけちゃうんかなぁ?あれれ?「ID」変えた時になってへん?個数だけしか変えたらあかんねんから、ID と商品名は、ReadOnly にできひんかったかなぁ?DataGridColumn.ReadOnly っていうプロパティあるよね。こういうところで“丸投げ”って評価されるわけやね。

引用:

選択を未選択にすると言うのは、どこの設定を替えればいいのでしょうか?


 うん、だから、リファレンス見ようよ。DataGrid クラスに SelectedIndex とか SelectedItem とか、それらしい名前のプロパティがあるよね。

引用:

基本的なことかと思いますが、呼び出し履歴と、スタックトレースは違うのでしょうか?
呼び出し履歴には、下記しか表示されていません。


 うん、そんなもん、見比べてみたらわかるよね。
 呼び出し履歴を、どこの時点でとったんかわからんけど、スタックトレースは“例外が発生したところの”呼び出し履歴が入っとう。せやから、呼び出し履歴を表示したところが例外発生箇所やなかったら、当然違うよね。

_________________
tokei
会議室デビュー日: 2007/04/09
投稿数: 13
お住まい・勤務地: 東京
投稿日時: 2007-04-21 15:18
この問題は解決しました。
下記HPを参照下さい。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1480947&SiteID=7
tokei
会議室デビュー日: 2007/04/09
投稿数: 13
お住まい・勤務地: 東京
投稿日時: 2007-04-21 15:25
To:Jitta様

返事が遅くなり申し訳ございません。
気が付きませんでした。
(ページが2ページになっていることに初めて気が付きました。)

> まぁ、あれや。サンプルはあくまでも“見本”やから、そのまま使うたらあかんっ
>ちゅうこっちゃ。これは、MSDN のサンプルもそうやから、気ぃ付けや。
はい。注意します。


>うん、そんなもん、見比べてみたらわかるよね。
> 呼び出し履歴を、どこの時点でとったんかわからんけど、スタックトレースは“例外
>が発生したところの”呼び出し履歴が入っとう。せやから、呼び出し履歴を表示したと
>ころが例外発生箇所やなかったら、当然違うよね。
理解できました。ありがとうございます。


[ メッセージ編集済み 編集者: tokei 編集日時 2007-04-21 15:27 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-04-22 21:07
引用:

>もう少し工夫するとすれば、DataGridのCurrentCellChangedイベントで、DataGridにフィルタを再設定することにより、

>DataGridにファイルタを即座に適用させることでしょうか? 

CurrentCellChangedの中でAcceptChanges();を呼ぶようにしたところ、エラーが発生しなくなりました。

ありがとうございました!



それでいいの?

 そうすると、変更したデータを取り出して、データベースへ渡せない、あるいは、渡すことが困難になるけど、本当にいいの?

 AcceptChanges をすることで、何がどうなるか、本当に理解してやっていますか?あなたがしなければならないことは、「エラーが出なくすること」ではなく、「バグを潰すこと」ですよ?「バグを潰すこと」は、「エラーが出なくなる」ことではないですよ?
_________________
tokei
会議室デビュー日: 2007/04/09
投稿数: 13
お住まい・勤務地: 東京
投稿日時: 2007-04-23 17:59
To:Jitta様

Microsoftフォーラムの方に返信を書きました。
申し訳ございませんが、そちらをご参照願います。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1480947&SiteID=7

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