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

在WinForms中,为了将焦点放在特定的控件上,我似乎总是想调用Control.Select()Control.Focus()使其正常工作。

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

Neil Barnwell asked 2020-02-17T16:46:08Z
6个解决方案
38 votes

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

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

answered 2020-02-17T16:46:54Z
24 votes

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

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

Daniel A. White answered 2020-02-17T16:46:29Z
6 votes

有关它们之间如何不同的示例,如果您试图将Forms App的控件设置为默认焦点,则该控件在打开时将默认焦点放在打开时,在InitializeComponent()之后在构造函数中调用时,仅Select()将起作用。 Focus()不会。

Kyle Breton answered 2020-02-17T16:47:15Z
3 votes

只是为了添加到该线程中,我发现在编写将其他控件从一种形式移动到另一种形式(新创建的形式)的用户控件时。 原始表单无法再选择控件,但是使用焦点可以这样做。 我认为这强调了有关这些方法所适用的级别的答案。 但这还意味着在较高级别使用Select并不容易,因为select在原始形式上不再按预期工作(不是我应该将其放置为其他形式-我接受)

Tim answered 2020-02-17T16:47:36Z
2 votes

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

user118708 answered 2020-02-17T16:47:56Z
1 votes

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

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

但是,不幸的是,它返回了意外的结果。 如果我调用MyCustomerComboControl.Select(在“加载”,“显示”或“激活”事件中),则调用了2751805535275189189249方法,但未能注册它具有焦点(即Focused为False),但是如果我调用Focus,则它起作用。 此外,如果打开了表单,则Select也可以工作,即如果我选择了另一个控件,然后重新选择了原始控件,一切都很好。 因此,在我的方案以外的任何其他情况下,请使用Select,因为上面已经说过了。

DEVELOPER answered 2020-02-17T16:48:21Z
translate from https://stackoverflow.com:/questions/802722/whats-the-difference-between-control-select-and-control-focus