如何为MDI儿童表单设置事件而不向每种表单添加代码



我想为所有打开的子女形式设置某种类型的控件的背景颜色。我有一种用于打开自身内部其他形式的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并根据EventEventHandler将事件添加到适当的控件中。

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()的子形式设计中包括一种方法,无论是通过事件还是直接呼叫触发的方法是您的设计决定。并包括一种方法来告诉父母表格时,当子壁死亡时,以便它停止寻找它。

相关内容

  • 没有找到相关文章

最新更新