1

我得到了一个 aspx 页面中所有控件的通用列表。我试图对该列表的每个元素执行的操作是为这些 aspx 控件的属性 Visible 和 Enabled 设置一个值。

我不知道如何从通用列表的每个元素中获取 TYPE。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim controlList As New List(Of Control)
        controlList = AddControls(Page.Controls, controlList)
        For Each ctl As Control In controlList
            Response.Write(ctl.ID & "<br/>")

            'Here I setup property Enabled of control textbox1
            CType(Me.FindControl("textbox1"), TextBox).Enabled = True

            'I'd like to setup property Enabled of control ctl.ID, but how to invoke <type of ctl>
            CType(Me.FindControl(ctl.ID), <type of ctl> ).Enabled = True

        Next
    End Sub

    Private Function AddControls(ByVal page As ControlCollection, ByVal controlList As List(Of Control)) As List(Of Control)
        For Each c As Control In page
            If c.ID IsNot Nothing Then
                controlList.Add(c)
            End If

            If c.HasControls() Then
                AddControls(c.Controls, controlList)
            End If
        Next
        Return controlList
    End Function

编辑 1:

如果我尝试这样做:

For Each ctl As Control In controlList
            Response.Write(ctl.ID & "<br/>")

            CType(Me.FindControl(ctl.ID), **ctl.GetType()** ).Enabled = True

Next

我收到错误:类型“ctl.GetType”未定义。

如果我尝试这样做:

For Each ctl As Control In controlList
            Response.Write(ctl.ID & "<br/>")

            CType(Me.FindControl(ctl.ID), **WebControl** ).Enabled = True

Next

我收到错误:无法将对象类型“System.Web.UI.HtmlControls.HtmlForm”转换为类型“System.Web.UI.WebControls.WebControl”

编辑 2:

如果我尝试这样做:

For Each ctl As Control In controlList
            Response.Write(ctl.ID & "<br/>")

            CType(ctl, WebControl).Enabled = False

Next

我收到错误:无法将对象类型“System.Web.UI.HtmlControls.HtmlForm”转换为类型“System.Web.UI.WebControls.WebControl”

我不知道我在这里错过了什么。

4

2 回答 2

0

您不需要所有控件(或 WebControl)都具有 .Visible 和 .Enabled ,即使用 List<Control> 而不是使用 List<Control>。

但是,在回答您的实际问题时,您可以调用 object.GetType() 它将返回类型,然后您可以使用任一反射来获取类型名称。

于 2013-07-05T22:32:15.973 回答
0

我不确定我是否完全理解您的要求,但是由于您在 ASP.NET 中执行此操作,我猜您的所有控件都将属于System.Web.UI.WebControls,所以您是否尝试过转换为泛型WebControl

CType(ctl, WebControl).Enabled = True

页面的所有 UI 元素都应继承自WebControl.Enabled属性.Visible

如果您只想对特定类型执行此操作,例如您想遍历每个控件但只想禁用文本框并使按钮不可见,.GetType()则可以使用来找出类型:

If ctl.GetType(ctl) = GetType(TextBox) Then
    CType(ctl, WebControl).Enabled = False
ElseIf ctl.GetType(ctl) = GetType(Button) Then
    CType(ctl, WebControl).Visible = False
End If
于 2013-07-05T22:33:16.513 回答