お世話になります。
何かいい案があればご教示ください。
VS.NET 2003 + C# でクラサバアプリを作っています。
忌まわしき DataGrid での悩みです。
DB から取ってきたデータを、ごにょごにょ加工して、
DataGrid にバインドしてあるテーブルに追加しています(※)
(DB から取ってきた生データを持っているテーブルを直接バインドしていません)。
DataGrid は実際には DataGrid 派生クラスでして、
行が選択されたことをイベントとして検出するために、
DataGrid.ListManager.CurrentChanged をハンドリングして、
自前で実装した SelectedItemChanged イベントを発生させています。
SelectedItemChanged イベントの中では、選択された行を
取得するために、やはり実装した SelectedItem プロパティを取得しています。
SelectedItem プロパティのコードはこんな感じです。
public object SelectedItem
{
get
{
if( this.ListManager == null )
{
return null;
}
if( this.ListManager.Count == 0 ||
this.ListManager.Position == -1 ||
! this.IsSelected( this.ListManager.Position ) )
{
return null;
}
return this.ListManager.Current;
}
}
で、※部分では、DBから取得した行を一行ずつループして、
表示用に加工しつつ、バインドしてある表示用テーブルに追加しています。
ここでは、表示用テーブル.Rows.Add を使っているのですが、
これをやると、一行追加するごとに、DataGrid 派生クラスの
ListManager.CurrentChanged が発生し、イベントハンドラ中で
SelectedItem が取得されます。
その際、バインドされているテーブルにはデータが追加されているが、
DataGrid 側にはまだ反映されていないタイミングで処理が走ると思われ、
ListManager.Count が 0 でないにもかかわらず、
IsSelected( 0 ) で OutOfRangeException が発生してしまいます。
IsSelected を使わなければ例外は出ないのですが、その場合、
選択色になっていないがアクティブな行(グリッドの左端に三角がついている行)
も取得してしまいます。
これを、選択状態になければ取得しないようにしたいので、IsSelected
で判定しています。
突っ込みどころがたくさんあるような気がして、あえて焦点をぼかした
質問にしてみました。
例外が出ないようにするにはどうしたらいいでしょう? 以前の問題として
おかしいところがあったらご指摘ください。
ただし、あまりに根本的過ぎる問題は対処できない可能性が大きいですorz