form1 中有控件 button1, textBox1, textBox2...
点击 button1 创建 form2 并显示form2 的 Deactivate 事件中 关闭自身,代码为// 当窗体被停用时,关闭自身
private void Form2_Deactivate(object sender, EventArgs e)
{
     this.Close();
}
问题是:
当点击 form1 中的任一 textBox 控件,form2 关闭了,但输入焦点返回到了 button1 上,必须再次点击 textBox ,textBox才能得到焦点,进行输入。这非常烦人。
(如果不是 form2 自己关闭,而在 form1 的事件中关闭 form2,就没有此问题。)我希望 是  form2 失去焦点后即应自己关闭或隐藏,而如果点击的是 form1 中的控件,该控件能够立即得到输入焦点。我是在做自定控件中遇到此问题,查看其他人的控件却无此问题。找不到答案,用两个 form  测试也是如此。
请问大家是如何解决此问题的?谢谢

解决方案 »

  1.   

    试试在form1的active事件中让textbox获得焦点呢?
      

  2.   

    在button1中获得当前具有焦点的控件.show form2后 再让这个控件获得焦点.
      

  3.   

     
    在 form2 的 LostFocus 事件中 关闭自身,就可以实现。LostFocus 事件是关联于 WM_KILLFOCUS 和 WM_SETFOCUS Windows 消息的低级别焦点事件Deactivate 与 LostFocus 事件的机制有何不同呢?
      

  4.   

    Hide()方法.隐藏后 焦点不丢失.!
      

  5.   

    是, hide() 后,焦点不丢失。
    而且在用户控件中使用 form2 , 用户控件在 form1 中,
    点击了 form2 中的控件后,form2就已失去焦点,  再点击 form1 就不再激发 form2 的 LostFocu 事件
    有没有简洁的办法?
      

  6.   

    问题的原因是,当点击form1上的控件时,首先触发form2失去焦点事件,如果此时关闭或隐藏窗口,则控件不会获得焦点。
    可以改成响应form1的Activated事件,把form2隐藏;或者在form2的Deactivate事件中启动一个定时器,延迟一段时间再关闭自己。
      

  7.   

    因为要封装 用户控件,最终使用了 windows消息 ,得以解决