Winforms 当用户控件获得焦点时要检测的事件?

Winforms 当用户控件获得焦点时要检测的事件?,winforms,events,user-controls,focus,Winforms,Events,User Controls,Focus,我在一个表单上有一个用户控件,可以生成几个非模态子表单。子窗体显示用户可以编辑的数据。用户控件显示相同数据的不同视图,如果用户在一个或多个子窗体中进行了更改,我希望能够重新加载数据。我已经设置了事件来通知用户控件子窗体中的数据更改,但我无法确定应该在用户控件上捕获哪个事件(如果存在),以确定它已从子窗体获得焦点。这里有我可以使用的现有事件吗 编辑:代码示例 (对不起,我的客户喜欢VB) GotFocus似乎仅在释放UserControl时触发 我将控件添加到“主”窗体上的面板中,如下所示: Di

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

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

GotFocus似乎仅在释放UserControl时触发

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

Dim mainControl as New MainUserControl()
Panel1.Controls.Add(mainControl)
mainControl.Doc = DocStyle.Fill
mainControl.Visible = True
mainControl.Show()
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
然后,事件处理程序代码:

Private Sub MainUserControl_GotFocus(ByVal sender as Object, ByVal e as EventArgs) Handles Me.GotFocus
    MessageBox.Show("got focus")
End Sub
然后,用户控件上有一个“close”(关闭)按钮,它将事件发回主窗体,然后主窗体将用户控件从面板中删除并处理它。只有在调用
mainControl.Dispose()
时才会触发
GotFocus

编辑2

我刚刚尝试处理
Enter
事件,但这只是第一次触发,而不是每次控件接收到焦点时都触发。

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

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

Dim mainControl as New MainUserControl()
Panel1.Controls.Add(mainControl)
mainControl.Doc = DocStyle.Fill
mainControl.Visible = True
mainControl.Show()
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\u
了解它。希望这对将来的人有所帮助。

我喜欢这样玩把戏

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);

    if (Disposing == false)
    {
        if (Visible == true)
        {
            // OnShown(e);
        }
        else
        {
            // OnHide(e);
        }
    }
}

我为此添加了一个处理程序,当我在控件和子窗体之间来回切换时,它似乎不会启动。要让GotFocus开火,我需要做什么特别的事情吗?参见这里:例如。请随意发布代码,它仍然不会启动。GotFocus仅在释放用户控件时启动。请参阅原始帖子中的代码示例。谢谢@AJ:您确定添加的事件正确吗?此事件没有按您预期的方式启动。如果您有重叠的用户控件,并且将一个控件放在另一个控件的前面,则就此事件而言,可见性保持不变。只有释放控件才能触发此事件,与GotFocus相同。