日期:2014-05-17  浏览次数:20772 次

子窗体激活时,KeyUp事件偏偏传到了父窗体
我做了两个窗体,父窗体中设置了一个KeyUp事件响应函数,只希望它对父窗体激活时的键盘操作作出响应,但是现在发现子窗体激活时,键盘事件被父窗体捕获了,这是我不希望发生的。

具体的代码如下:

父窗体的键盘响应:


public class MainForm:Form
{
private void Keyup_Callback(object sender, KeyupEventArgs e)
{
if(e.Keycode == Keys.Enter)
//do something
}
}

父窗体打开子窗体的方式:


//父窗体调用
SubForm.Show();


//子窗体代码
public class SubForm:Form
{
public DialogResult result = DialogResult.None;

public static DialogResult Show()
{
subForm = new subForm();
subForm.Showdialog(); // Showdialog阻塞期间,用户点击SubForm上的确定按钮,事件响应见btnCommit响应函数
return this.result;
}

private void btnCommint_Callback(object sender, EventArgs e)
{
this.Close();
this.result = DialogResult.OK;
}
}


状况出现在父窗体用SubForm.Show()打开子窗体后,用Tab键将焦点移动到子窗体的确定按钮上,一敲回车,子窗体的btnCommit_Callback被执行,同时父窗体中的Keyup_Callback也被执行!

尝试了很多方法,如果我用C#的MessageBox代替SubForm显示对话框消息,当我按下Enter键时,Keyup_Callback也一样被执行,头疼。

------解决方案--------------------
引用:
我做了两个窗体,父窗体中设置了一个KeyUp事件响应函数,只希望它对父窗体激活时的键盘操作作出响应,但是现在发现子窗体激活时,键盘事件被父窗体捕获了,这是我不希望发生的。

具体的代码如下:

父窗体的键盘响应:


public class MainForm:Form
{
private void Keyup_Callback(object sender, KeyupEventArgs e)
{
if(e.Keycode == Keys.Enter)
//do something
}
}


谁知道你的 Keyup_Callback 在什么地方使用过?你贴得出来使用它来注册别的事件的所有相关代码吗?

你私藏了这么多代码,又可以写错了那么多代码,这怎么问问题呢?

如果你觉得自己的代码很值钱,不想写出来,那么你可以写一个只有10~20行的例子来。但是最起码地要符合语法,可以编译通过。