3

我想覆盖鼠标单击 DataGridView 标题/列单元格(顶部,左侧单元格)的行为。该单元格会导致所有行都被选中。相反,我想阻止它选择所有行。我看到了 RowHeaderSelect 和 ColumnHeaderSelect 的事件,但没有看到左上角标题单元格的事件。

有任何想法吗?我只是瞎了吗?

4

4 回答 4

5

这是单击该单元格时发生的反汇编代码:

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 个解决方案:

  1. 禁用多选(如果您的业务逻辑允许)
  2. 继承您自己的数据网格并覆盖OnCellMouseDown(类似这样)

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    {
        if (e.RowIndex == -1 && e.ColumnIndex == -1) return;
        base.OnCellMouseDown(e);
    }
    
于 2009-10-28T19:04:37.197 回答
2

我知道这已经晚了,但希望它会对某人有所帮助。下面的代码在类似的情况下对我有用。

    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();
        }
     }
于 2015-09-01T16:16:02.533 回答
0

您可以使用此 hack 获得对点击事件的一些控制 :)

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
    }
}
于 2009-11-16T19:36:10.347 回答
0

覆盖OnCellMouseDown方法:

if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
return;
}
else
{
base.OnCellMouseDown(e);
}
于 2020-11-28T11:55:05.687 回答