2009-11-19 91 views
0

我有一個窗體。它有一個ComboBoxDataGrid取消Windows窗體事件

我有一個Leave事件對我ComboBox,我有一個DoubleClick事件對我DataGrid

的想法是,在離開ComboBox,如果ComboBox的價值再變使用新值重新加載DataGrid

假設ComboBox顯示值爲1,對於該值,在DataGrid中顯示5條記錄。 現在用戶在ComboBox中輸入2並將其隔開。在我的Leave事件中,我看到該值已更改,並且我重新加載了DataGrid以及該值的所有記錄。

但是,如果用戶輸入2和雙擊現有記錄的價值1,比 假事件重新加載DataGrid,比DoubleClick事件觸發。

如果DataGrid已重新加載,我如何查找待處理事件的列表並取消其中的每一個?

回答

1

您已遇到事件訂單問題,DataGridView.Enter事件過早觸發。這可以通過使用Control.BeginInvoke()方法延遲事件操作來乾淨地解決。只要程序重新進入消息循環,它的代理目標就會被觸發。換句話說,在所有懸而未決的事件發射後。使它看起來類似於這樣:

private bool selectionDirty; 

private void comboBox1_TextChanged(object sender, EventArgs e) { 
    selectionDirty = true; 
} 

private void dataGridView1_Enter(object sender, EventArgs e) { 
    this.BeginInvoke(new Action(() => selectionDirty = false)); 
} 

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { 
    if (selectionDirty) return; 
    // etc... 
} 
+0

我會試一試周一早上 – CodingJoy 2009-11-21 04:44:15

+0

我不認爲這會起作用。因爲進入數據網格時,不能保證它被重新加載。 – CodingJoy 2009-11-21 04:46:26

+0

我需要Jon Skeet或Ayende來幫助我 – CodingJoy 2009-11-21 04:48:29

1

而不是使用Leave事件,請嘗試SelectedIndexChanged Event,這將在DataGrid s DoubleClick事件之前被解僱。缺點是如果用戶使用鍵盤滾動ComboBox,那麼如果用戶在ComboBox中向下滾動5個步驟,則會觸發5次。

另一種解決辦法是進入ComboBox當以存儲局部變量lComboEntered=true和值設置爲falseLeave事件觸發時。並在DataGridDoubleClick事件之前檢查lComboEntered=false是否做任何事情。

+0

在我的離去,事件例程,如果組合框的值發生了變化,比我重裝DataGrid和設置CancelDoubleClick標誌設置爲true。在我的datagrid doubleclick例程中,我檢查這個標誌,如果它是真的,就取消事件。這工作正常,如果我改變我的組合框中的值,並雙擊行而不做任何事情。但是,如果我在組合框中輸入一個值,並且簡單地選項卡比我必須雙擊數據網格TWICE。在哪裏我可以重置該標誌爲假。 – CodingJoy 2009-11-19 21:48:38