2016-10-05 76 views
3

我需要在ReadOnly DataGrid(不幸地不是DataGridView)中双击单元格时处理该事件,但MouseDoubleClick事件不是被解雇。我怎样才能让事件火起来?在System.Windows.Forms.DataGrid中双击单元格时,未触发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; 

时,只有当我双击单元格之间的边界。当我点击细胞上的只读文本框看起来这似乎吃第二次点击事件:

enter image description here

我发现an old thread in Experts Exchange,他们说的那样多:

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

我并不真的需要TextBox控件所以如果从“激活”或显示其抑制细胞的一种方式,这将是对我来说是足够好的解决方案,以及。

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

+0

你能在一个细胞,而不是双击处理简单的单击事件? – Nofuzy

+0

如果你不需要网格激活,你可以在顶部放一个透明的控件来捕捉鼠标点击? – Equalsk

+0

@Equalsk有趣的想法。控件必须随着Grid一起调整大小,但也许我可以通过锚定实现。它必须在单元格之上,因为我确实希望能够单击标题行 - 调整列宽的大小,并更改排序。 – sashoalm

回答

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!"); 
} 
相关问题