DataGridView覆盖顶部,左侧标题单元格单击(全选)
我想覆盖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); } }
为了防止这种行为,您有两种解决方案:
- 禁用多选(如果您的业务逻辑允许)
-
inheritance自己的数据网格并覆盖
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(eX, eY); if (hitInfo.Type == DataGridViewHitTestType.TopLeftHeader) { MyDataGridView.ClearSelection(); } }
您可以使用此hack获得对click事件的一些控制:)
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 } }