用于检测用户控件何时获得焦点的事件?

时间:2011-05-12 16:09:13

标签: winforms events user-controls focus

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

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

当UserControl处理完毕时,GotFocus似乎才会触发。

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

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事件,但这只是第一次触发,而不是每次控件都获得焦点。

3 个答案:

答案 0 :(得分: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了解它。希望这有助于将来的某个人。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我这样欺骗。

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

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