2012-01-09 60 views
4

我需要在用戶通常在DataGridView的文本框列中結束編輯模式(無論用戶是否實際修改了值,但不是當用戶按ESC取消編輯模式時)執行任務控制。DataGridView事件

我試過DataGridView控制本身的幾個事件,也是編輯的控制,但沒有人不正是我想要的:

DataGridView.CellValidatingDataGridView.CellValidated

這些事件被觸發每當用戶選擇另一個單元,即使該單元不處於編輯模式。我試圖檢查CellValidating事件中的IsCurrentCellDirty屬性。這幾乎是我所需要的,但只有在用戶實際更改值時才設置IsCurrentCellDirty。但是,當用戶通常在不改變任何內容的情況下結束編輯模式時,我也需要執行此任務。當用戶取消編輯模式時,這些事件不會被觸發,這很好。

DataGridView.CellValueChanged

此事件也被炒得經常(如果設置一個單元格的值編程的同時,還解僱)。

DataGridView.CellEndEdit

此事件幾乎是我想要的。但是,當用戶通過按下ESC取消編輯模式時,它也會被觸發。有沒有辦法檢查CellEndEdit事件中編輯模式是否被取消?

DataGridView.CellParsing

此事件幾乎是我想要的。但是,當用戶結束編輯模式而不改變任何內容時,它不會被觸發。

我註冊到DataGridView.EditingControlShowing事件中這些事件的編輯控制的

ValidatingValidated事件。他們幾乎做我想要的,但當用戶通過按下ESC取消編輯模式時,他們也會被觸發。有沒有辦法檢查編輯模式是否在這些事件中被取消?

對於我可以註冊的事件以及/或者我可以檢查以實現所需行爲的標誌,我還有其他建議嗎?

回答

4

你可以做的是註冊到EditingControlShowing事件DataGridView內的PreviewKeyDown事件EditingControl的。從那裏可以檢測是否在編輯控件中按下了轉義,並設置了一個標誌,該標誌將被CellEndEdit事件讀取。

您可以推斷從方法名稱註冊的必要事件。假設你在你的班級中有一個名爲escapePressed的bool字段,這並不奇怪是被按下的逃生標誌。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    e.Control.PreviewKeyDown -= Control_PreviewKeyDown; //avoid attaching multiple handlers in case control is cached 
    e.Control.PreviewKeyDown += new PreviewKeyDownEventHandler(Control_PreviewKeyDown); 
} 

void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.KeyCode == Keys.Escape) 
    { 
     Console.WriteLine("escape pressed"); 
     escapePressed = true; 
    } 
} 

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    if (!escapePressed) 
    { 
     Console.WriteLine("do your stuff"); //escape was not pressed. 
    } 
    else escapePressed = false; //reset the flag 
} 
+0

謝謝您的回答。我沒有檢查它,因爲同時我找到了我自己的解決方法。只有一件事:在EditingControlShowing中,您應該在添加事件處理程序之前刪除它,以避免多次附加事件處理程序(請參閱http://msdn.microsoft.com/zh-cn/library/system.windows上的註釋.forms.datagridview.editingcontrolshowing.aspx) – 2012-01-09 09:01:15

+0

你是對的,編輯我的答案。 – Rotem 2012-01-09 09:04:07

1

這裏是我的解決方法:

介紹一個

private DataGridViewCell cellBeingEdited = null; 

DataGridView.EditingControlShowing

cellBeingEdited = DataGridView.CurrentCell; 

DataGridView.CellEndEdit

cellBeingEdited = null; 

然後我可以使用DataGridView.CellValidating事件時,編輯被取消不火,並檢查我cellBeingEdited領域:

if (DataGridView.CurrentCell != cellBeingEdited) return;