- - PR -
WinForm上のDataGridで最後の行を削除するとIndexOutOfRangeExceptionが発生
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-12-16 17:19
Windows Form上にDataGridを配置して、ボタンをクリックされたら
現在の行を削除するプログラムを作成しています。 この際、最後の行を選択してボタンをクリックするとIndexOutOfRangeExceptionが発生します。 データソースにはArrayListを使用しています。 なにか回避策がございましたら教えてください。 再現する最小のサンプルを作成しました。 private ArrayList ar = new ArrayList(); private void Form1_Load(object sender, System.EventArgs e) { ar.Add(new c(0,"a")); ar.Add(new c(1,"b")); ar.Add(new c(2,"c")); BindToGrid(); } private class c { int _i; string _s; public int i{get{return _i;}} public string s{get{return _s;}} public c(int i, string s) { _i = i; _s = s; } } private void BindToGrid() { dataGrid1.DataSource = null; dataGrid1.Refresh(); dataGrid1.Update(); dataGrid1.DataSource = ar; dataGrid1.Refresh(); dataGrid1.Update(); } private void button1_Click(object sender, System.EventArgs e) { c myc; myc = (c)ar[dataGrid1.CurrentCell.RowNumber]; ar.Remove(myc); BindToGrid(); } | ||||||||
|
投稿日時: 2003-12-16 17:54
こんにちわ。諸農です。
dataGrid1.CurrentCell.RowNumberと ArrayListの要素数との同期が取れていないのではないですか? というか、NULL行はまだArrayListには反映されていないんですよね?? 回避策として考えられるのは、選択されているセルのRowNumberが 配列範囲外かどうかをチェックすることだと思いますが。。 論点が違っているようでしたら、ご容赦をm(__)m ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2003-12-16 18:09
こんにちはYOSHIです。
ちょっと違います。 ArrayListの最後のアイテムを削除してそれをDataGridにバインドしています。 なので、普通に考えるとArrayListとDataGridの同期は取れていると思います。 ところが、(たぶん)DataGridの内部に持っているRowNumberが以前の値を 保持していて、この例外が発生しているのだと思います。 | ||||||||
|
投稿日時: 2003-12-17 16:39
こんにちわ。諸農です。
アップされていたコードを試してみました。 思いっきりはずしていましたですね。すみません。 対応は次のようなコードになると思います。
CurrencyManagerを使って、Refresh()するところがミソかもしれません。 ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2003-12-17 19:03
諸農さん。うまくいきました!ありがとうございます!
CurrencyManager。未知のクラスでした。 |
1