我在表单上有一个用户控件,可以生成几个非模态子表单。子表单显示用户可以编辑的显示数据。用户控件显示相同数据的不同视图,并且如果用户在一个或多个子表单中进行了更改,我希望能够生成数据的重新加载。我已经设置了事件来通知用户控制子窗体中的数据更改,但我无法确定哪个事件(如果存在)我应该捕获用户控件以确定它已从焦点返回儿童形式。我可以在这里使用现有活动吗?
编辑:代码示例 (对不起,我的客户喜欢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
事件,但这只是第一次触发,而不是每次控件都获得焦点。
答案 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);
}
}
}