DataGridView覆盖顶部,左侧标题单元格单击(全选)

时间:2009-10-01 15:25:18

标签: c# winforms datagridview header selectall

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

有什么想法吗?我只是在失明吗?

4 个答案:

答案 0 :(得分: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);
    }
    

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

使用此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
    }
}

答案 3 :(得分:0)

覆盖 OnCellMouseDown 方法:

if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
return;
}
else
{
base.OnCellMouseDown(e);
}