Control.Select()和Control.Focus()之间有什么区别?

时间:2009-04-29 14:52:08

标签: .net winforms user-interface behavior

在WinForms中,要将焦点设置为特定控件,我似乎总是调用Control.Select() Control.Focus()来使其工作。

有什么区别,这是正确的做法吗?

6 个答案:

答案 0 :(得分:37)

Focus()是实际设置焦点的低级功能。

Select()是一种高级方法。它首先在控件的父层次结构中以迭代方式向上查找,直到找到容器控件。然后它设置该容器的ActiveControl属性(到被调用的控件)。但是,这些方法中的逻辑并不简单,并且对UserControl容器有特殊处理。

答案 1 :(得分:23)

  

Focus是一种低级方法,主要用于自定义控件作者。相反,应用程序员应该对子控件使用Select方法或ActiveControl属性,或者对表单使用Activate方法。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

答案 2 :(得分:4)

有关它们如何不同的示例,如果您尝试将窗体应用程序的控件设置为默认焦点时打开它,则只有Select()在InitializeComponent()之后在构造函数中调用时才有效。焦点()不会。

答案 3 :(得分:3)

只是为了添加到这个线程,我发现在编写一个用户控件时,将其他控件从一个窗体移动到另一个窗体(新创建的窗体)。原始表单无法再选择控件,但使用焦点允许它这样做。我认为这强调了这些方法工作水平的答案。但这也意味着说使用选择在较高级别并不简单,因为选择不再按照预期在原始形式上工作(不是因为它应该将其放入不同的形式 - 我接受它)

答案 4 :(得分:1)

根据个人经验,我编写了一个继承Windows ComboBox的用户控件。我不得不编写代码来覆盖OnEnter事件,我在那里有一个声明

If Me.Focused Then ... Else ...

然而,遗憾的是它返回了意想不到的结果。如果我调用了MyCustomerComboControl.Select(在加载,显示或激活的事件中)它调用了OnEnter方法但是没有注册它有焦点(即Focused为False)但是如果我调用Focus它就可以了。此外Select如果表格是开放的,即如果我选择了另一个控件,然后重新选择原始控件,则一切正常。因此,在我的方案以外的任何其他情况下,请使用Select,因为它如上所述。

答案 5 :(得分:1)

在某些情况下,焦点()会导致拥有控件的窗口在没有焦点的情况下获得焦点。 Select()不会导致窗口聚焦。