DataGridView的覆盖顶部,左侧头部单元点击(全选)(DataGridView overri

2019-07-20 10:24发布

我要重写在DataGridView头/列单元格(顶部,左侧细胞)鼠标点击的行为。 这细胞导致选择所有行。 相反,我想从选择的所有行停止。 我看到RowHeaderSelect和ColumnHeaderSelect的事件却没有一个为顶部,左侧头部单元。

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

Answer 1:

这是当您单击该单元格会发生什么dissasembled代码:

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. 继承自己的DataGrid和覆盖OnCellMouseDown (像这样)

     protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) { if (e.RowIndex == -1 && e.ColumnIndex == -1) return; base.OnCellMouseDown(e); } 


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


Answer 3:

您可能获得对使用这个技巧的单击事件的一些控制:)

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


文章来源: DataGridView override top,left header cell click (select all)