2016-10-05 118 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!"); 
} 
相關問題