【问题标题】:Event to detect when a user control gains focus?检测用户控件何时获得焦点的事件?
【发布时间】:2011-08-24 06:32:03
【问题描述】:

我在一个可以生成多个非模态子窗体的窗体上有一个用户控件。子窗体显示用户可以编辑的数据。用户控件显示相同数据的不同视图,如果用户在一个或多个子窗体中进行了更改,我希望能够重新加载数据。我已经设置了事件来通知用户控件子表单中的数据更改,但我无法确定我应该在用户控件上捕获哪个事件(如果它存在)以确定它已经从子表格。我可以在这里使用现有的活动吗?

编辑:代码示例 (对不起,我的客户喜欢 VB)

GotFocus 似乎仅在释放 UserControl 时触发。

我将控件添加到“主”表单上的面板中,如下所示:

Dim mainControl as New MainUserControl()
Panel1.Controls.Add(mainControl)
mainControl.Doc = DocStyle.Fill
mainControl.Visible = True
mainControl.Show()

然后,事件处理代码:

Private Sub MainUserControl_GotFocus(ByVal sender as Object, ByVal e as EventArgs) Handles Me.GotFocus
    MessageBox.Show("got focus")
End Sub

然后,用户控件上有一个“关闭”按钮,该按钮将事件触发回主窗体,然后从面板中删除用户控件并将其释放。只有当mainControl.Dispose() 被调用时,GotFocus 才会触发。

编辑 2
我刚刚尝试处理 Enter 事件,但这只会在第一次触发,而不是每次控件获得焦点时触发。

【问题讨论】:

    标签: winforms events user-controls focus


    【解决方案1】:

    我就是这样骗人的。

    protected override void OnVisibleChanged(EventArgs e)
    {
        base.OnVisibleChanged(e);
    
        if (Disposing == false)
        {
            if (Visible == true)
            {
                // OnShown(e);
            }
            else
            {
                // OnHide(e);
            }
        }
    }
    

    【讨论】:

    • 此事件不会像您期望的那样触发。如果您有重叠的用户控件,并将一个放在另一个前面,则就此事件而言,可见性保持不变。只有释放控件才允许触发此事件,与 GotFocus 相同。
    【解决方案2】:

    我能找到的最佳方法是在用户控件中处理父窗体的Activated 事件。从我过去几个小时所做的所有研究中,我了解到GotFocus 是一个棘手的事情,而且 Winforms 用户控件根本不喜欢有焦点,因为它是一个容器控制。假设我有一个用户控件MyUserControl,它被加载到一个名为“MyControlParentForm”的表单上,那么我正在使用的代码是这样的:

    Private Sub MyUserControl_Load(ByVal sender as Object, ByVal e As EventArgs) Handles MyBase.Load
        Dim parent = TryCast(ParentForm, MyControlParentForm)
        If parent IsNot Nothing Then
            AddHandler parent.Activated, AddressOf Control_Activated
        End If
    End Sub
    
    Private Sub Control_Activated(ByVal sender As Object, ByVal e as EventArgs)
        Debug.WriteLine("activated")
    End Sub
    

    然后,如果表单因任何原因失去焦点然后重新获得焦点,MyUserControl 通过Control_Activated 知道它。希望这对将来的某人有所帮助。

    【讨论】:

      【解决方案3】:

      c# 中有一个名为 Control.GotFocus Event 的事件。在 .net 2.0 之前不存在。

      【讨论】:

      • 我为此添加了一个处理程序,当我在控件和子窗体之间来回切换时,它似乎没有触发。要让 GotFocus 开火,我需要做些什么特别的事情吗?
      • 参见此处:msdn.microsoft.com/en-us/library/… 示例。随意发布代码它仍然不会触发。
      • GotFocus 仅在释放用户控件时触发。请参阅原始帖子中的代码示例。谢谢!
      • @AJ:你确定你添加的事件正确吗?
      猜你喜欢
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多