55

在 WinForms 中,要将焦点设置到特定控件,我似乎总是最终调用Control.Select() Control.Focus()让它工作。

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

4

6 回答 6

42

Focus() 是实际设置焦点的低级函数。

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

于 2009-08-05T10:06:49.427 回答
24

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

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

于 2009-04-29T14:54:23.070 回答
6

例如,如果您尝试将 Forms App 的控件设置为打开它时的默认焦点,则在 InitializeComponent() 之后在构造函数中调用时,只有 Select() 将起作用。Focus() 不会。

于 2013-06-11T18:12:05.123 回答
3

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

于 2013-12-30T12:06:29.720 回答
2

在某些情况下,如果没有焦点,Focus() 可能会导致拥有该控件的窗口获得焦点。Select() 不会引起窗口的焦点抓取。

于 2017-04-05T12:11:08.987 回答
1

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

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

然而,不幸的是它返回了意想不到的结果。如果我调用MyCustomerComboControl.Select(在 Load、Shown 或 Activated 事件中)它调用该OnEnter方法但未能注册它有焦点(即 Focused 为 False)但如果我调用 Focus 它工作。此外Select,如果表单是打开的,即如果我选择了另一个控件然后重新选择了原始控件,一切都很好。因此,在我的场景以外的任何其他情况下,请使用,Select因为上面是这样说的。

于 2012-02-13T06:25:26.610 回答