【问题标题】:Passing a Control Type to a procedure将控件类型传递给过程
【发布时间】:2013-06-04 20:27:20
【问题描述】:

我正在尝试创建一个通用过程,只需使用您可以看到的参数调用此过程,即可将“X”控件对象的可见属性更改为“False/True”:

    ' Desired usage:
    ' Disable_Controls(CheckBox, Me.Panel1.Controls, False)

    Public Sub Disable_Controls(ByVal ControlType As Control, _
                                ByVal Container As ControlCollection, _
                                ByVal Visible As Boolean)

        For Each Control As Control In Container
            ' If TypeOf Control Is CheckBox then...
            If TypeOf Control Is Control Then
                Control.Visible = Visible
            End If
        Next

    End Sub

问题是我不能像我正在尝试那样传递控件名称(“复选框”), 我用“CType(Control, CheckBox)”尝试了一些东西,但没有奏效。

我该怎么做?

【问题讨论】:

  • 为什么ControlType 的类型是Control 而不是Typetypeof control 将始终返回 true,因为您将 As'ing 为上面的 Control。我不确定目标是什么。是搜索ControlCollection,找到某种类型的所有控件(例如Checkbox)并禁用它们?
  • @Eli Gassert 是的,这就是目标,但我想通过使用“ControlName”调用 sub 来使其通用以处理所有类型的控件(复选框、按钮等)参数作为第一个参数。
  • @Eli Gasser 问你的第一个问题,ControlType 是“Control”而不是“Type”,因为我不知道这样做的好方法,现在我把它改成了“Type “而且我还在尝试。谢谢你的建议。

标签: .net vb.net visual-studio-2012 casting typeof


【解决方案1】:
Public Sub Disable_Controls(Of T As Control)(ByVal Container As Control, _
                            ByVal Visible As Boolean)
    For Each ctrl As T In Container.Controls.OfType(Of T)()
        ctrl.Visible = Visible
    Next
End Sub

这样称呼它:

Disable_Controls(Of Checkbox)(MyGroupbox, False)

【讨论】:

  • Container.OfType 是否将其所有内容过滤为该类型的内容,还是尝试将该容器的所有元素转换为该类型?如果是前者(过滤器),那么答案很好!
  • 谢谢,但是 sub 在“For”行 (T) 抛出异常:T 是一种类型,不能用作表达式,这与我一直试图传递的错误相同/转换第一个参数。
  • @Joel Coehoorn 正在等待更新以解决您答案中的 (T) 异常,谢谢!
  • .OfType() 过滤和投射一切。如果您传递父类型,它将保留子控件。例外是因为我缺少一组括号和 Of 关键字。它现在应该可以工作了。
  • @Joel Coehoorn 不起作用:错误 1 ​​类型参数不能用作限定符。在“T.Visible = Visible”行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2017-06-08
  • 2015-03-29
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多