|
■No90272 (sakamoto さん) に返信 > SelectionChangedイベントは発生させないようにしたいのですが、
DataGridView の OnSelectionChanged をオーバーライドして、
protected override void OnSelectionChanged(EventArgs e) { if(発生させても良い) { base.OnSelectionChanged(e); } }
のように実装すれば OK です。ただし、イベントが発生しなくなるだけ。
選択セル、アクティブセル、アンカーセル、フォーカスセルなどの管理は 別途実装する必要があります。
既定の設定だと、Ctrl+ドラッグによる「複数の非連続範囲を選択」が可能ですし、 「全てのセルを選択」することもできる点にも注意してください。
> dataGridViewの選択処理について質問があります。
「最初の 3 行」までは普通に選択できるが、 それ以降は 1 行おきにしか選択できない DataGridView の実装例。
class SakamotoGrid : DataGridView { protected override void SetSelectedRowCore(int rowIndex, bool selected) { if (rowIndex % 2 == 0 || rowIndex < 3) { base.SetSelectedRowCore(rowIndex, selected); } } protected override void SetSelectedColumnCore(int columnIndex, bool selected) { // base.SetSelectedColumnCore(columnIndex, selected); } protected override void SetSelectedCellCore(int columnIndex, int rowIndex, bool selected) { if (rowIndex % 2 == 0 || rowIndex < 3) { base.SetSelectedCellCore(columnIndex, rowIndex, selected); } } protected override bool SetCurrentCellAddressCore(int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick) { if (rowIndex % 2 == 0 || rowIndex < 3) { return base.SetCurrentCellAddressCore(columnIndex, rowIndex, setAnchorCellAddress, validateCurrentCell, throughMouseClick); } else { return false; } } };
> datagridviewの行が選択されている状態で、別の行を選択をした際、
DataGridView の場合、 (1) 現在のセル(行ヘッダ列に三角マークがつく) (2) 選択されているセル(選択色で反転表示されているセル) (3) フォーカスのあるセル(Tab キーを押すと移動するセルを囲む破線) はそれぞれ別物として管理されていますが、その点は大丈夫でしょうか?
1 は CellEnter イベントや CurrentCellAddress プロパティなど 2 は SelectionChanged イベントや SelectedCells プロパティなど
たとえば Shift キーを押しながら他の行をクリックした場合、 1 にあたるセル(アンカーセル)は変化しないまま、 2 の状態が変更されます。
> 特定の行の場合は選択をキャンセルし、元々選択されていた行に選択を戻し、
この仕様だと、キーボード(矢印キーなど)での移動が阻害されてしまうのが難点ですね。
|