我有一个简单的情况(.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
答案 0 :(得分: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;
}
答案 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)
最好只是将鼠标事件捕获到用户控件上并将焦点设置在自身上。这将自动将焦点从文本框中移除。