2009-04-21 69 views
5

我有一個DataGridView設置爲EditOnF2。我在CellEndEdit事件處理程序中對數據進行了一些特殊處理,以設置單元格的值。我仍然希望EditOnKeystrokeOrF2的功能在Esc鍵被按下時恢復到原始值。不幸的是,在CellEndEdit事件處理程序中,我沒有看到一種方法來告訴是什麼導致CellEndEdit事件被觸發。如果沒有按下Esc鍵,我只想更改單元格的值。我怎麼知道它是否是?如何捕獲在C#中的DataGridView上觸發「CellEndEdit」的擊鍵?

編輯:值得注意的是,當單元格被編輯時,KeyDown事件不會被觸發,也不會導致最終的結尾鍵擊。編輯2:我已經嘗試了KeyPreview的建議,但窗體仍然沒有捕獲被按下的退出鍵。

編輯3:我一直在試圖讓這個工作。我最初將以下內容中的一部分作爲單獨的帖子發佈,但感覺它可能更適合將其包含在此處。

我在DataGridView中有一個單元,它現在被設置爲EditProgrammatically。要捕獲開始編輯的擊鍵,我將cell.Value設置爲等於擊鍵。但是,這會遺失單元格的「Escape」功能 - 當您按下換碼時,而不是恢復到原始值時,它將恢復爲以編程方式插入單元格的按鍵。

我相信如果我可以在單元格上設置「EditedFormattedValue」,這將是我想要放置我的擊鍵值的位置,但是這看起來是隻讀的。我怎樣才能完成我所嘗試的?

舉例說明:如果單元格中的值爲「54.3」,並按下「9」鍵,它將開始編輯單元格並在其中放置「9」。如果我點擊Escape,而不是回到「54.3」,它會回到「9」。我想要的是它恢復到原來的「54.3」值。

所以,我試圖從開始和結束兩個方面來解決這個問題。我認爲真正的問題是我覆蓋了原來的價值,無法確定我是否應該恢復原狀。編輯4:它看起來像CellValidating可能值得使用,但是當我嘗試使用它時,我看到了奇怪的行爲。在一個新項目中,我創建了DataGridView並註冊了各種事件,並且發現CellEndEdit在CellEndEdit之前被觸發。然而,在我試圖讓這個工作起來的項目中,CellEndEdit正在發射CellValidating。任何想法可能是什麼區別?

回答

2

將表單上的KeyPrevew property設置爲true;這將阻止控制首先將其吞噬。 :)

+0

謝謝,但嘗試此方法後,它看起來像Escape鍵仍然只能被單元格識別爲編輯的結尾,而不是表單上的實際KeyDown或KeyPress事件。 – 2009-04-22 14:01:48

0

首先,你是絕對正確的,KeyPreview將無法​​正常工作。起初,我想我可以通過覆蓋表格的IsInputKey方法來解決這個問題。這種技術在其他一些我無法抓住我需要的鑰匙的情況下適用於我。這也沒有效果,所以我試着在這裏繼承DataGridView並重寫IsInputKey。那也行不通。在深入瞭解其他可以覆蓋的方法之後,我學到了另一類叫做命令鍵的鍵,我需要攔截它們。要做到這一點,請在DataGridView上覆蓋ProcessCmdKey(您需要將其繼承)。

這裏是我的代碼:

public class CommandKeyInterceptingDataGridView : DataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     Debug.WriteLine(keyData); 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

並進入編輯模式與F2,修改小區說「你好」,並取消與逃生編輯輸出。

F2 
ShiftKey, Shift 
H, Shift 
E 
L 
L 
O 
Escape 

希望這會給你你需要的東西。

0

我的問題是類似的,這裏是我的解決方法:

Problem:當用戶開始編輯在DGV一個單元格的值和提交值EndEdit中前按下ESC鍵被調用,從而重新寫的所有DGV領域數據庫因此更新了更新日期&時間字段,我只希望DGV.EndEdit在用戶實際更改值時運行,並且在這樣做時不按ESC。

Solution:細胞驗證我使用的標誌像this,以檢查是否值被改變,如果標誌值是假的只是做一個if(!flag)return;上EndEdit中