我为这个问题做了一个简单的测试应用程序,每个包含一个按钮的两个winforms。 单击第一个窗体上的按钮打开另一个窗体。它还订阅了关键事件。KeyUp处理错误控制
第二种形式有其按钮设置为“的AcceptButton”在我们为1S睡觉被点击的事件,然后设置的DialogResult为true(睡眠是模拟做了一些处理)
时输入用于关闭第二种形式是第一种形式的按钮的KeyUp事件被触发,即使在第二种形式通过之前键被释放,第二种形式仍然显示并聚焦。
如果在第二种形式下按下其他任何输入按键,则第一种形式的按钮不会触发事件。
第一种形式:
public Form1()
{
InitializeComponent();
buttonForm2.KeyUp += new KeyEventHandler(cntKeyUp);
}
void cntKeyUp(object sender, KeyEventArgs e)
{
MessageBox.Show(e.KeyCode.ToString());
}
private void buttonForm2_Click(object sender, EventArgs e)
{
using (Form2 f = new Form2())
{
f.ShowDialog();
}
}
第二种形式:
private void button1_Click(object sender, EventArgs e)
{
Thread.Sleep(1000);
this.DialogResult = DialogResult.OK;
}
有谁知道为什么该事件被触发的非活性形式的按钮,可以做些什么来阻止这种情况发生?
该问题已通过向Form1添加KeyDown处理程序解决,然后keyup事件验证EventArgs的KeyValue是否匹配由KeyDown设置的KeyValue,然后清除该KeyValue。 如果KeyUp事件被另一个对话触发,KeyDown值永远不会被设置,我们知道不应该采取任何行动。 按照SLak建议的第二种形式调用是小型测试案例中的一个潜在解决方案,但在实际应用中,在一个或多个对话框中很容易忘记这么做。 – Mikael 2010-03-23 14:52:08