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); } } 

为了防止这种行为,您有两种解决方案:

  1. 禁用多选(如果您的业务逻辑允许)
  2. 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 } }