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

时间:2016-10-05 15:58:50

标签: c# winforms datagrid double-click

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

enter image description here

我找到an old thread in Experts Exchange,他们在那里说了多少:

  

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

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

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

1 个答案:

答案 0 :(得分: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!");
}