Ric*_*ler 4 c# events winforms
VS2010 C#.Net 4.1
我正在处理用户必须选择的表单或输入初始数据ComboBox.使用下面的代码(需要花费一些时间来推断),Tab如果数据正确,当用户点击键时启用"编辑"按钮,否则按钮被禁用,它将移动到下一个按钮.
这段代码有效,但副作用是PreviewKeyDown当我设置IsInputKey为true 时事件再次出现.这会调用两次验证.该KeyDown事件仅被调用一次,并且在IsInputKey第二次调用时再次为false,因此我需要再次检查验证.
我想了解为什么并可能避免它.
private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
if (e.KeyData == Keys.Tab) {
if (ValidationRoutine()) {
e.IsInputKey = true; //If Validated, signals KeyDown to examine this key
} //Side effect - This event is called twice when IsInputKey is set to true
}
}
private void comboBox1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyData == Keys.Tab) {
e.SuppressKeyPress = true; //Stops further processing of the TAB key
btnEdit.Enabled = true;
btnEdit.Focus();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么?很难回答,Winforms就是这样.首先来自消息循环,再次来自控件的消息调度程序.该事件实际上是一种实现受保护的IsInputKey()方法的替代方法,而不必覆盖控件类.有点黑客,我总是覆盖并且从未使用过该事件.
更好的鼠标陷阱是重写ProcessCmdKey().像这样:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (this.ActiveControl == comboBox1 && keyData == Keys.Tab) {
if (ValidationRoutine()) {
btnEdit.Enabled = true;
btnEdit.Focus();
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5844 次 |
| 最近记录: |