DataGridView ヘッダー/列セル (上、左のセル) でのマウス クリックの動作をオーバーライドしたいと考えています。そのセルにより、すべての行が選択されます。代わりに、すべての行を選択しないようにします。RowHeaderSelect と ColumnHeaderSelect のイベントが表示されますが、左上のヘッダー セルのイベントは表示されません。
何か案は?私は盲目なだけですか?
DataGridView ヘッダー/列セル (上、左のセル) でのマウス クリックの動作をオーバーライドしたいと考えています。そのセルにより、すべての行が選択されます。代わりに、すべての行を選択しないようにします。RowHeaderSelect と ColumnHeaderSelect のイベントが表示されますが、左上のヘッダー セルのイベントは表示されません。
何か案は?私は盲目なだけですか?
これは、そのセルをクリックしたときに何が起こるかを分解したコードです。
private void OnTopLeftHeaderMouseDown()
{
if (this.MultiSelect)
{
this.SelectAll();
if (-1 != this.ptCurrentCell.X)
{
this.SetCurrentCellAddressCore(this.ptCurrentCell.X, this.ptCurrentCell.Y, false, false, false);
}
}
この動作を防ぐために、2つの解決策があります。
独自のデータグリッドを継承してオーバーライドしますOnCellMouseDown
(このようなもの)
protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1 && e.ColumnIndex == -1) return;
base.OnCellMouseDown(e);
}
私はこれが遅れていることを知っていますが、うまくいけば誰かを助けるでしょう. 以下のコードは、同様のシナリオで機能しました。
private void MyDataGridView_MouseUp(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo hitInfo = this.MyDataGridView.HitTest(e.X, e.Y);
if (hitInfo.Type == DataGridViewHitTestType.TopLeftHeader)
{
MyDataGridView.ClearSelection();
}
}
このハックを使用して、クリックイベントをある程度制御できます:)
private void dataGridView1_Click(object sender, EventArgs e)
{
MouseEventArgs args = (MouseEventArgs)e;
DataGridView dgv = (DataGridView)sender;
DataGridView.HitTestInfo hit = dgv.HitTest(args.X, args.Y);
if (hit.Type == DataGridViewHitTestType.TopLeftHeader)
{
// do something here
}
}