我想为所有打开的子女形式设置某种类型的控件的背景颜色。我有一种用于打开自身内部其他形式的Mdiparent形式。我不想在每个孩子表格中添加代码,因为这将非常广泛。这将用作应用程序的主题功能,因此我想根据主要形式以逻辑来自动更改背景颜色。是否有类似的全球事件可以触发所有表单。加载事件?
到目前为止,我已经创建了一个事件,但它不适用于嵌套控件
Private Sub frmMain_MdiChildActivate(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
Dim ParentControl As frmMain = sender
Dim ChildControl = ParentControl.ActiveControl
If ChildControl IsNot Nothing Then
For Each FormControl As Control In ChildControl.Controls
If FormControl.GetType = GetType(GroupBox) Then
RemoveHandler FormControl.Paint, AddressOf PaintBorderlessGroupbox
AddHandler FormControl.Paint, AddressOf PaintBorderlessGroupbox
End If
Next
End If
End Sub
我能够通过使用Form.MdiChildActivate
并根据Event
和EventHandler
将事件添加到适当的控件中。
Private Sub frmMain_MdiChildActivate(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
Dim ParentForm As frmMain = sender
Dim ChildForm = ParentForm.ActiveMdiChild
Dim EventName = "Paint"
Dim EventHandlerName = "PaintBorderlessGroupBox"
If ChildForm IsNot Nothing Then
AddEventToControls(ChildForm, GetType(GroupBox), EventName, EventHandlerName)
End If
End Sub
Private Sub AddEventToControls(Control As Control, ControlType As Type, ControlEventName As String, ControlEventMethod As String)
For Each ChildControl In Control.Controls
If ChildControl.GetType = ControlType Then
If ChildControl.Controls.Count > 0 Then
AddEventToControls(ChildControl, ControlType, ControlEventName, ControlEventMethod)
End If
Dim EventMethod = Me.GetType().GetMethod(ControlEventMethod, BindingFlags.NonPublic Or BindingFlags.Instance)
Dim ControlEvent As EventInfo = ControlType.GetEvent(ControlEventName)
Dim del = [Delegate].CreateDelegate(ControlEvent.EventHandlerType, Me, EventMethod)
ControlEvent.RemoveEventHandler(ChildControl, del)
ControlEvent.AddEventHandler(ChildControl, del)
End If
Next
End Sub
呼叫AddEventToControls()
将处理程序分配给控件以及它也适用的任何子女控件。在这种情况下,我将Control.Paint
事件设置为以特定方式绘制GroupBox
。这可能不是完成此操作的最干净的方法,但是我能够为所有儿童表单创建一个"全局事件",而无需触摸每种形式的代码。
在您的父级形式中,保留已激活的所有子女表格的集合。然后,您可以穿越该集合并更改每个收集的相关控制属性。
For Each ChildForm in MyCollection
ChildForm.TextBox.BackColor = Red
Next
当然:
- 父母表格必须访问子壁控制
- 孩子形式必须仍然存在(即未在平均值中关闭时间(
- 您无法检查闭合子,因为您没有添加任何向子形式代码以发出此类事件的信号。
- 当您尝试更改表格时,您必须处理异常已关闭。
在ChangeColour()
的子形式设计中包括一种方法,无论是通过事件还是直接呼叫触发的方法是您的设计决定。并包括一种方法来告诉父母表格时,当子壁死亡时,以便它停止寻找它。