【问题标题】:DataGridView override top,left header cell click (select all)DataGridView 覆盖顶部,左侧标题单元格单击(全选)
【发布时间】:2009-10-01 15:25:18
【问题描述】:

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

有什么想法吗?我只是瞎了吗?

【问题讨论】:

    标签: c# winforms datagridview header selectall


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我需要全行选择。另一个很有趣,但不幸的是,当我之前尝试过这个时,gridview 仍然选择了所有列。我最终取消选择行作为一种解决方法,但不是一个非常漂亮的。
    • 所以你做了覆盖并且选择仍然发生?我自己做了一个快速测试,它似乎有效。
    【解决方案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();
            }
         }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        覆盖 OnCellMouseDown 方法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-04
          • 1970-01-01
          • 2020-12-20
          • 2019-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多