1

如何获取对象类型以便可以直接转换为它?这是我想执行的理想方法:

Dim MyObjects As New List(Of Object)
For Each O As Object In GlobalFunctions.GeneralFunctions.FindControlsRecursive(MyObjects, Form)
    Select Case True
        Case TypeOf O Is MenuStrip Or TypeOf O Is ToolStripButton Or TypeOf O Is Panel Or TypeOf O Is Label Or TypeOf O Is ToolStripSeparator
            AddHandler DirectCast(O, O.GetType).Click, AddressOf GotFocus
    End Select
Next

我试图使代码更高效,这样我就不必直接转换为指定的对象类型。前任。:

Dim MyObjectsAs New List(Of Object)
For Each O As Object In GlobalFunctions.GeneralFunctions.FindControlsRecursive(MyObjects, Form)
    Select Case True
        Case TypeOf O Is MenuStrip
            AddHandler DirectCast(O, MenuStrip).Click, AddressOf GotFocus
        Case TypeOf O Is Panel
            AddHandler DirectCast(O, Panel).Click, AddressOf GotFocus
        Case TypeOf O Is ToolStripButton
            AddHandler DirectCast(O, ToolStripButton).Click, AddressOf GotFocus
        Etc...
    End Select
Next 

编辑

据我所知,ToolStripItemToolStripButton)不是 aControl所以我不能List(Of Control)在这种情况下使用 a 。当我第一次使用控件列表时,工具条项目不包括在内。这是我第一次在应用程序中使用,所以直到现在ToolStrip我都没有理由不使用。List(Of Control)

4

1 回答 1

4

所有控件均源自Control. 因此,不要使用类型Objectuse ControlControl拥有这些控件的大多数成员就像一个Click事件。

Dim myControls As New List(Of Control)
For Each ctrl As Control In _
  GlobalFunctions.GeneralFunctions.FindControlsRecursive(myControls, Form)

    AddHandler ctrl.Click, AddressOf GotFocus
Next

也可以使用ControlFindControlsRecursive

看:


事实证明,您有一些组件不是控件。但是您仍然可以将所有控件投射到Control

Dim myControls As New List(Of Object)
For Each obj As Object In
        GlobalFunctions.GeneralFunctions.FindControlsRecursive(myControls, Form)

    Select Case True
        Case TypeOf obj Is Control
            AddHandler DirectCast(obj, Control).Click, AddressOf GotFocus
        Case TypeOf obj Is ToolStripItem
            AddHandler DirectCast(obj, ToolStripItem).Click, AddressOf GotFocus
    End Select
Next

请注意,ToolStripItem包括ToolStripButtonToolStripControlHost、和ToolStripDropDownItem,因为所有这些组件都派生自. 您可以在 Visual Studio 的对象浏览器中看到: ToolStripLabelToolStripSeparatorToolStripItem在此处输入图像描述

MenuStrip是一个Control。因此,这两种情况应该涵盖您的大部分控件和组件。如果您发现此处未涵盖的另一个组件,请搜索其以Click事件为特征的最小派生基类型,以便新案例涵盖尽可能多的组件。

于 2021-06-15T16:28:20.130 回答