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

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

有什么不同,这是正确的做法吗?

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

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

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

Select()是一个更高级别的方法。 它首先在控件的父级层次中反复向上查找,直到find容器控件。 然后它将该容器的ActiveControl属性(设置为被调用的控件)。 这些方法中的逻辑并不简单,但对UserControl容器有特殊的处理。

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

只是添加到这个线程,我发现当编写一个用户控件,从一个窗体移动到另一个(新创build的窗体)的其他控件。 原始forms不能再select控制,但使用焦点允许它这样做。 我认为这强调了这些方法工作水平的答案。 但是这也意味着在上层select使用select并不够简单,因为select在原始表单上不再像预期的那样工作了(而不是应该把它放在一个不同的表单中 – 我接受)

从个人的经验,我写了一个inheritanceWindowscombobox的用户控件。 我不得不编写代码来重写OnEnter事件,我在那里有一个声明说

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

但不幸的是,它返回了意想不到的结果。 如果我调用MyCustomerComboControl.Select (在Load,Shown或Activated事件中),它会调用OnEnter方法,但是没有注册它有焦点(即Focused为False),但是如果我调用Focus,它就起作用了。 此外Select工作,如果表格是开放的,即如果我select了另一个控制,然后重新select原来的控制一切都很好。 所以在除了我的场景以外的任何其他情况下,使用Select是因为它如上所述。

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