2011-11-28 68 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键是否关闭。 –