在System.Windows.Forms.DataGrid中双击单元格时,不会触发MouseDoubleClick事件

我需要处理在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文本框,它似乎吃掉了第二次单击事件:

在此处输入图像描述

我在专家交流中找到了一个旧线程 ,他们在那里说了很多:

好吧,不仅在单击一个单元格时没有捕获双击事件,它还没有被datagrid消息队列捕获。 我inheritance了一个数据网格并覆盖了wndproc,检查我是否能检测到双击。 它捕获单击消息,但没有WM_LBUTTONDBLCLK消息通过。 我怀疑MS具有子单元格控件(请参阅DataGridColumnStyle类和派生类)挂钩网格控件并防止消息甚至继续到网格。 试图预先挂钩那个孩子或网格可能会产生相当混乱的结果,所以我避免这样做。

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

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

当单元格上出现鼠标按下时, 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!"); }