【问题标题】:MouseDoubleClick event is not fired when a cell is double-clicked in System.Windows.Forms.DataGrid在 System.Windows.Forms.DataGrid 中双击单元格时不会触发 MouseDoubleClick 事件
【发布时间】:2017-02-14 04:19:52
【问题描述】:

当在 ReadOnly DataGrid(不幸的是不是 DataGridView)中双击单元格时,我需要处理,但 MouseDoubleClick 事件没有被触发。如何让事件触发?

我正在创建 DataGrid 并订阅该事件:

var table = new DataTable();
table.Columns.Add("foo");
table.Rows.Add(new object[] { "foo" });
table.Rows.Add(new object[] { "foo" });
dataGrid1.DataSource = table;
dataGrid1.MouseDoubleClick += DataGrid1_MouseDoubleClick;
dataGrid1.ReadOnly = true;

只有当我双击单元格之间的边界时才会发生该事件。当我点击一个单元格时,会出现一个 ReadOnly 文本框,它似乎会占用第二次点击事件:

我找到了an old thread in Experts Exchange,他们说了这么多:

好吧,当单击一个单元格时,不仅没有捕获双击事件,数据网格消息队列也没有捕获它。我继承了一个数据网格并覆盖了 wndproc,检查是否可以检测到双击。它捕获点击消息,但没有 WM_LBUTTONDBLCLK 消息通过。我怀疑 MS 有子单元格控件(请参阅 DataGridColumnStyle 类和派生类)挂钩网格控件并阻止消息甚至继续到网格。尝试预先钩住那个孩子或网格可能会产生非常混乱的结果,所以我要避免这种情况。

我真的不需要 TextBox 控件,所以如果有办法抑制单元格“激活”或显示它,那对我来说也是一个足够好的解决方案。

注意:我知道 DataGrid 已经过时,但我正在处理遗留代码,请不要评论告诉我使用 DataGridView - 它对我没有帮助。

【问题讨论】:

  • 你能处理单元格上的简单点击事件而不是双击吗?
  • 如果您不需要激活网格,您能否在顶部放置一个透明控件以捕获鼠标点击?
  • @Equalsk 有趣的想法。控件必须与网格一起调整大小,但也许我可以通过锚定来实现。它只能在单元格上,因为我绝对希望能够单击标题行 - 调整列宽并更改排序。

标签: c# .net winforms datagrid double-click


【解决方案1】:

当一个单元格上发生鼠标按下时,TextBox编辑控件获得焦点并接收其他鼠标上下动作,所以DataGrid的双击事件不会引发。

由于您的DataGrid 是只读的,您可以将DataGridTextBoxColumn 更改为不显示编辑控件。这样会引发双击事件。为此,只需覆盖 Edit 方法的重载并且什么都不做:

public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
{
    protected override void Edit(CurrencyManager source, int rowNum,
        Rectangle bounds, bool readOnly, string displayText, bool cellIsVisible)
    {
    }
}

示例

private void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();
    dt.Columns.Add("A");
    dt.Columns.Add("B");
    dt.Rows.Add("1", "11");
    dt.Rows.Add("2", "22");
    var dg = new DataGrid();
    dg.Dock = DockStyle.Fill;
    this.Controls.Add(dg);
    dg.BringToFront();
    dg.DataSource = dt;
    var ts = new DataGridTableStyle();
    ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn() { MappingName = "A" });
    ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn() { MappingName = "B" });
    dg.TableStyles.Add(ts);
    dg.DoubleClick += dg_DoubleClick;
}
void dg_DoubleClick(object sender, EventArgs e)
{
    MessageBox.Show("DoubleClick!");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2012-01-25
    • 2014-07-31
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多