2011-05-12 49 views
1

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

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

的GotFocus似乎只在用户控件设置为触发。

我的控制面板添加“主”形式是这样的:

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火。

EDIT 2
我只是想处理Enter事件,但只有触发第一次,而不是每一个控件接收焦点时。

回答

2

我能找到的最好方法是处理用户控件中父窗体的Activated事件。根据我在过去几个小时中所做的所有研究,我了解到GotFocus是一件棘手的事情,Winforms用户控件根本不喜欢聚焦,因为它是一个容器控件。说我有一个加载到一个名为“MyControlParentForm”形式的用户控件MyUserControl,当时我正在使用的代码是这样的:

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

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

+0

我为此添加了一个处理程序,当它在控件和子窗体之间来回切换时,它不会触发。我需要做什么才能让GotFocus开火? – 2011-05-12 16:26:54

+0

请参阅此处:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.gotfocus.aspx中的示例。随意发布代码它仍然不会触发。 – soandos 2011-05-12 16:29:19

+0

GotFocus仅在用户控件处理时触发。查看原始帖子中的代码示例。谢谢! – 2011-05-12 17:07:43

0

我这样的诡计。

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

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

这个事件并没有像你期望的那样开火。如果您有重叠的用户控制,并且一个在另一个之前,就此事件而言,可见性保持不变。只有处置控件才能触发此事件,与GotFocus相同。 – 2015-11-16 14:13:52