2011-11-28 44 views
1

在我的應用程序有:形式KEYUP和的KeyDown事件來改變變量

private bool _clear = true; 

當用戶進入一個新的文本的,這種布爾來看看一個文本框應被清除或沒有(按上TreeView中的TreeNode)。

然後,我有我的形式這兩個事件:

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Modifiers == Keys.Control) 
    { 
     _clear = false; 
    } 

} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Modifiers == Keys.Control) 
    { 
     _clear = true; 
    } 
} 

我想它在某種程度上,當用戶按住CTRL鍵,清楚是謊言並CTRL被釋放時,明確追溯到TRUE。

顯然我在這裏寫的代碼不起作用!什麼可能是錯誤的和/或有沒有更好的方法?

回答

2

這是一個簡單的修復,當你釋放鍵,KeyUp事件沒有收到本身釋放的鍵的任何信息,所以只是屬性設置爲true:

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    _clear = true;  
} 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Modifiers == Keys.Control) 
    { 
     _clear = false; 
    } 
} 

如果你想看到它的實時工作,一個標籤添加到您的形式和「_clear」變量的每個設置下補充一點:

label1.Text = _clear.ToString(); 

根據您的意見,更改第二個代碼塊:

if (e.KeyData.ToString() == "ControlKey, Control") 
{ 
    _clear = false;     
} 
else if(other shortcut conditionals go here or on other else if's) 
{ 
    _clear = true; 
} 

此條件將保持爲真的唯一時間是控制自行保存的時間。其他情況是爲了將ccle設置爲true,當您按ctrl後再按另一個鍵時,由於事實上只要按下控件,它就會觸發KeyDown事件。

基於這種改變,只要你照顧if語句之後的按鍵(例如if()),你就不需要在KeyUp事件中設置任何東西。

請參閱my answer here to the intricacies of keys and their properties如果您想要更深入的信息。

編輯#3:

只要你設置_clear爲true在每個條件的第一行,你應該能夠避免你正面臨着在您的評論的問題:

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 

    if (e.KeyData.ToString() == "ControlKey, Control") 
    { 
     _clear = false; 

    } 
    else if(e.KeyData.ToString() == "O, Control") 
    { 
     _clear = true; 
     //Do other stuff here, such as opening a file dialog 

    } 

} 
+0

謝謝,我也試過這個,但是有問題。我有其他的快捷方式,例如CTRL + A和那種類型的stuf。如果我爲另一個目的按下CTRL + A(這是菜單項的快捷方式),這將不是一個可靠的解決方案。有沒有辦法解決? –

+1

修復,檢查答案的底部。 – KreepN

+0

嗨,我也試過這種方式。不幸的問題依然存在。發生這種情況時,按下例如'CTRL + O'打開FileOpenDialog,即使對話框關閉,_clear也將保持爲false,因此我必須再次按下CTRL。是否有可能避免這種行爲? –

1

您需要將窗體的KeyPreview屬性更改爲True。

+0

謝謝,這部分工作,它使'_clear'假,但'KeyUp'事件不知何故無效和_clear保持假。有任何想法嗎? –

+0

我試過一個測試表單,你的問題沒有出現,在調試模式下你只會看到一個事件觸發但是這兩個事件正在觸發鍵盤事件檢查結果 – Mazen313

2

這是如果你以相反的方式做到這一點更容易。檢查樹視圖事件中的CTRL鍵是否關閉。這樣的事情:

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { 
     if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { 
      // Control key is down, do something... 
     } 
    } 
+0

謝謝,這與鼠標工作正常,但如果用戶使用箭頭鍵並輸入它會怎麼樣。我也有自動激活項目更改。 –

+0

哦,明白了,我使用相同的方式進行樹視圖鍵事件,或不是? –

+0

是的,在哪裏你會關心CTRL鍵是否關閉。 –