帮助将焦点设置在父级上

时间:2010-01-06 11:41:58

标签: .net vb.net winforms controls focus

我有一个简单的情况(.NET2):UserControl1(或Form1)上的texbox1。

当我点击usercontrol / form时,我想取消聚焦(离开)texbox(改为聚焦usercontrol / form): alt text http://lh3.ggpht.com/_1TPOP7DzY1E/S0R1ORVt-pI/AAAAAAAAC3Y/UkS2zEMWa9o/s800/Capture4.png

我在UC /表格上执行以下操作:

      Protected Overrides Sub OnMouseClick _
          (ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick(e)
        Me.Focus()
      End Sub

为什么它不适用于文本框,但在非子文本框上效果很好(专注于textBox2然后点击该面板会删除焦点textBox2)?

真实项目窗口

alt text http://lh5.ggpht.com/_1TPOP7DzY1E/S0SVniaeN1I/AAAAAAAAC3g/jafhFG-vA0g/s800/Capture5.png

4 个答案:

答案 0 :(得分:3)

  1. 在表单中添加一个新的面板控件(某处不在处)并将其调整为0,0
  2. 请勿在此面板上设置Visible = false。
  3. 在表单中添加标准的MouseClick事件处理程序,如下所示:

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        // Uncomment if in scrollable control
        //Point scrollPos = new Point(this.AutoScrollPosition.X, -this.AutoScrollPosition.Y);
        newPanel.Select(); 
        // Uncomment if in scrollable control
        //this.AutoScrollPosition = scrollPos;
    
    }
    
  4. 现在,当您单击主窗体上的任何位置时,任何输入控件都将失去焦点,您将能够处理常见的验证事件等。

答案 1 :(得分:2)

您正在与Form和UserControl类的内置行为作斗争。如果它们包含任何子控件,它们就会被写为永远不会接受焦点,它们会自动将焦点转移到孩子身上。 ContainerControl类的内置行为,两者的基类。 GroupBox是另一个。

如果您考虑一下,这很有意义:既不能表明他们有焦点,也没有任何有用的东西会在用户开始输入时发生。

不要解决这个问题,只会让用户感到非常困惑。

答案 2 :(得分:2)

您似乎试图部分复制在Excel中的图表中看到的行为。您可以单击图表中的任何对象,然后选择它(具有焦点),但如果您在图表区域外单击但仍在图表对象中,则不会选择任何内容。

对于习惯使用Excel中的图表的人来说,这是非常熟悉的行为。

基本上,你需要一个通常会接受焦点的控件。我过去曾经和同样的问题搏斗过。我提出的最佳解决方案(以及“最佳”我并不是说它实际上很好)是创建一个空白文本框,并将其放在UserControl后面。然后,您单击usercontrol的代码如下所示:

Protected Overrides Sub OnMouseClick _
          (ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick(e)
        myFakeTextBox.Focus()
End Sub

用户永远不会看到此文本框获得焦点。他们所看到的只是现在没有在表格中选择任何内容,他们可以自由地开展业务。

这种方法运行得很好,但从维护的角度来看,这有点令人头疼,因为你必须记住虚假文本框就在那里以及它有什么好处。

答案 3 :(得分:0)

最好只是将鼠标事件捕获到用户控件上并将焦点设置在自身上。这将自动将焦点从文本框中移除。