Control.Select() 和 Control.Focus() 有啥区别?

Posted

技术标签:

【中文标题】Control.Select() 和 Control.Focus() 有啥区别?【英文标题】:What's the difference between Control.Select() and Control.Focus()?Control.Select() 和 Control.Focus() 有什么区别? 【发布时间】:2010-10-22 14:38:10 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我认为这还不够好。我阅读并理解了这一点。我写了一个自定义控件。但是,我不知道什么时候适合在我的自定义控件中使用 Select vs Focus。总是这样吗?有一些标准吗?一个与另一个在实际和语义上的含义是什么? 我怀疑大多数人在将这个问题输入 Google 之前都会阅读 MSDN。在这里简单地逐字重复并不是很有帮助。【参考方案3】:

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

【讨论】:

我可以看到,这可能是什么原因?【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

但是,不幸的是它返回了意外的结果。如果我调用MyCustomerComboControl.Select(在加载、显示或激活事件中)它调用OnEnter 方法但未能注册它有焦点(即焦点为假)但如果我调用焦点它工作。此外,Select 在表单打开时有效,即如果我选择了另一个控件,然后重新选择原始控件,一切都很好。因此,在我的情况以外的任何其他情况下,请使用Select,因为上面是这样说的。

【讨论】:

以上是关于Control.Select() 和 Control.Focus() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Linux开机报错 or type Contro-D to continue

Install the IIS 6.0 Management Compatibility Components in Windows 7 or in Windows Vista from Contro

user-select : 保护版权内容的简单方案

Android实例-调用系统APP(XE10+小米2)

查询用于创建分组、聚合和过滤的行集的不同计数

Controller 和 Action -2