我做了两个窗体,父窗体中设置了一个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也一样被执行,头疼。

解决方案 »

  1.   

    子窗体和父窗体上的控件的消息都要被父窗体先接收再传给他们,按下Enter键时自然就都执行了。你需要不同的键进行操作。
      

  2.   

    你可以在主窗口中设置一个标记,如果是由子窗口引发的事件就直接return就好了,就不执行父窗口中的逻辑就可以的
      

  3.   

    你的代码手工打的吧,哪有什么KeyupEventArgs,static方法里怎能访问this,Showdialog拼错了,subForm没定义,这样的代码别人怎么知道错在哪里?
      

  4.   


    不知道“子窗体和父窗体上的控件的消息都要被父窗体先接收再传给他们,按下Enter键时自然就都执行了”这是什么平台。微软的么?
      

  5.   


    谁知道你的 Keyup_Callback 在什么地方使用过?你贴得出来使用它来注册别的事件的所有相关代码吗?你私藏了这么多代码,又可以写错了那么多代码,这怎么问问题呢?如果你觉得自己的代码很值钱,不想写出来,那么你可以写一个只有10~20行的例子来。但是最起码地要符合语法,可以编译通过。
      

  6.   

    原本我担心完整工程的代码看着烦人,既然这样我就不担心了,重新写了个例程:http://bbs.csdn.net/topics/390584915