■No11736 (シャノン さん) に返信 > こちらにupしました。 > http://www.technoledge.info/DGMin.zip ちょっとずつ思い出してきました。 ・DataGridはCurrencyManagerのイベントを使って自分を更新している。 ・現在の位置が変わったときCurrencyManagerはCurrentChangedで通知する。 ・イベントハンドラは呼び出される順序が保証できない。 なので、CurrencyManagerのイベント処理をしてる最中に DataGridの関連するプロパティをいじると、おかしくなります。 イベントハンドラの追加順とかで動かなくなったり。 私のところではIsSelectedもちゃんと動きませんでした。 CurrentChangedやPositionChangedイベント終了後に呼ばれるイベントがあればいいのですが、 CurrencyManagerにはありません。 DataGrid自身が出すイベント、CurrentCellChangedを使うのが順当かと思いましたが、 CurrentCellChangedイベント終了後に行がSelectされるため、IsSelectedが使えません。 ならDataGridにそういったイベントがあるのかと探すと、MouseDownとかKeyDownとかを使うしかない。 ためしに作ったら一応動いてはいますが、 本当に全部うまく動くのか確信が持てない所が問題です。 結局、DataGridはSelectedが変わったときにイベントを投げない仕様なので、 SelectedItemChangedを自分で実装するのは困難であるということになります。 CurrentCellChangedはきちんと動くので、セル単位で処理せよということでしょう。 イベントドリブンで設計がダメだとこういうことになるんですよね。 やっぱりDataGridは嫌いだ。 一応、なんとなく動いてるものを書いときます。 class DataGridEx : DataGrid { private int _selectedindex = -1; public event EventHandler SelectedItemChanged; protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); CheckSelectedIndex(); } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); CheckSelectedIndex(); } protected override void OnKeyDown(KeyEventArgs ke) { base.OnKeyDown(ke); CheckSelectedIndex(); } protected override bool ProcessDialogKey(Keys keyData) { bool r = base.ProcessDialogKey(keyData); CheckSelectedIndex(); return r; } protected override bool ProcessKeyPreview(ref Message m) { bool r = base.ProcessKeyPreview(ref m); CheckSelectedIndex(); return r; } public object SelectedItem { get { if (_selectedindex < 0) return null; return this.ListManager.List[_selectedindex]; } } private void CheckSelectedIndex() { int newindex; if (this.ListManager == null) newindex = -1; else if (this.ListManager.Count == 0) newindex = -1; else if (this.ListManager.Position == -1) newindex = -1; else if (!this.IsSelected(this.ListManager.Position)) newindex = -1; else newindex = this.ListManager.Position; if (_selectedindex == newindex) return; _selectedindex = newindex; if (SelectedItemChanged != null) SelectedItemChanged(this, EventArgs.Empty); } }
- Child Tree -