C# 在System.Windows.Forms.DataGrid中双击单元格时不会激发MouseDoubleClick事件

C# 在System.Windows.Forms.DataGrid中双击单元格时不会激发MouseDoubleClick事件,c#,.net,winforms,datagrid,double-click,C#,.net,Winforms,Datagrid,Double Click,我需要处理在只读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.Data

我需要处理在只读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;
仅当我双击单元格之间的边框时,才会发生此事件。当我点击一个单元格时,会出现一个只读文本框,它似乎会吞噬第二次点击事件:

我发现,在那里他们说了很多:

嗯,单击单元格时,双击事件不仅没有被捕获,datagrid消息队列也没有捕获到。我继承了一个datagrid并重写了wndproc,检查是否可以检测到双击。它捕获单击消息,但没有WM_lbuttondblck消息通过。我怀疑MS让子单元格控件(参见DataGridColumnStyle类和派生)钩住了网格控件,甚至阻止消息继续发送到网格。试图预先钩住那个孩子或网格可能会有相当混乱的结果,所以我避免了这一点

我真的不需要文本框控件,所以如果有一种方法可以抑制细胞“激活”或显示它,那对我来说也是一个足够好的解决方案


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

当鼠标在单元格上按下时,
文本框
编辑控件获得焦点并接收其他鼠标升降,因此的双击事件不会引发

由于
DataGrid
是只读的,因此可以更改为不显示编辑控件。这样,双击事件将引发。要做到这一点,只需覆盖
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!");
}

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