【问题标题】:How to Disable Double Click on the Header of a DataGridView如何禁用双击 DataGridView 的标题
【发布时间】:2017-03-09 04:34:19
【问题描述】:

我想在双击 Gridview(行)而不是单个单元格时做一些事情。表示双击事件处理程序而不是 MouseDoubleClick 事件。但是我无法禁用标题列和行双击事件。当我双击 GridView 行时,我还想将数据加载到组合框(组合框在同一个表单上)。请帮帮我..!!!

private void gvLoadAllData_DoubleClick(object sender, EventArgs e)
{
    if()
    {
        //Do Something
    }
}

【问题讨论】:

  • 为什么不使用ColumnHeaderMouseDoubleClick
  • 你的意思是什么但是我无法禁用标题列和行双击事件
  • @RezaAghaei 双击事件有问题吗?
  • @RezaAghaei 意味着如果我不点击行并点击标题我会得到一个错误
  • 我没有检查DataGridViewDoubleClick 事件,但是当有ColumnHeaderMouseDoubleClick 事件时,这肯定是一个更好的选择,因为如果你处理DoubleClick,我想它也会触发当您单击标题时,您应该首先检查双击位置是否在列标题或其他位置。那么我为什么要离开ColumnHeaderMouseDoubleClick 并使用DoubleClick 来打扰自己呢?

标签: c# winforms datagridview


【解决方案1】:

我已经定义了CellDoubleClick 事件并正在做一些事情,我的问题是双击标题会触发该事件并因此导致应用程序崩溃。

Disaster's idea 为例,我刚刚添加了以下内容来绕过该事件。

if (e.RowIndex == -1) 
    return;

【讨论】:

    【解决方案2】:

    双击行标题

    要处理双击行标题,请处理DataGridViewRowHeaderMouseDoubleClick 事件:

    private void dataGridView1_RowHeaderMouseDoubleClick(object sender, 
        DataGridViewCellMouseEventArgs e)
    {
        var rowIndex = e.RowIndex;
        //You handled a double click on row header
        //Do what you need
    }
    

    双击列标题

    处理双击列标题句柄ColumnHeaderMouseDoubleClickDataGridView事件:

    private void dataGridView1_ColumnHeaderMouseDoubleClick(object sender, 
        DataGridViewCellMouseEventArgs e)
    {
        var columnIndex = e.ColumnIndex;
        //You handled a double click on column header
        //Do what you need
    }
    

    使用 DoubleClick

    此外,如果出于任何原因您想使用DoubleClick 事件,您应该写以下内容:

    private void dataGridView1_DoubleClick(object sender, EventArgs e)
    {
        var g = sender as DataGridView;
        if (g != null)
        {
            var p = g.PointToClient(MousePosition);
            var hti = g.HitTest(p.X, p.Y);
            if (hti.Type == DataGridViewHitTestType.ColumnHeader)
            {
                var columnIndex = hti.ColumnIndex;
                //You handled a double click on column header
                //Do what you need
            }
            else if (hti.Type == DataGridViewHitTestType.RowHeader)
            {
                var rowIndex = hti.RowIndex;
                //You handled a double click on row header
                //Do what you need
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      这样做:

      private void itemsList_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
      {
          if(e.RowIndex>-1)
              HereIsNotHeader();
      }
      

      并将其绑定到CellDoubleClick 事件

      【讨论】:

        【解决方案4】:

        这个怎么样?只有在 datagridcell 上触发双击事件时才会触发它,而不是标题或空白空间(滚动条)。

        private void gvLoadAllData_DoubleClick(object sender, MouseButtonEventArgs e)
            {
                if ((e.OriginalSource as FrameworkElement).Parent is DataGridCell) DoSomething();
            }
        

        【讨论】:

        • 简单而精彩。谢谢。
        猜你喜欢
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多