Vb.net 如何在页面上呈现用户控件的内部属性?

Vb.net 如何在页面上呈现用户控件的内部属性?,vb.net,user-controls,Vb.net,User Controls,我正在设计一个用户控件,该控件尝试根据下面的示例标记在页面上创建一个包含各种文本框或DropDownList元素的筛选栏: <gf:GridFilterBar runat="server"> <filters> <filter Label="Field1" Type="TextBox" /> <filter Label="Field2" Type="DropDownList" /> </filt

我正在设计一个用户控件,该控件尝试根据下面的示例标记在页面上创建一个包含各种文本框或DropDownList元素的筛选栏:

<gf:GridFilterBar runat="server">
    <filters>
        <filter Label="Field1" Type="TextBox" />
        <filter Label="Field2" Type="DropDownList" />
    </filters>
</gf:GridFilterBar>
根据另一篇文章的灵感,我创建了一个代码,可以正确解析这个标记并读入每个子控件的属性。我遇到的问题是,何时真正在屏幕上呈现这些信息。从Filter类的新子类中初始化的每个控件都不会出现在屏幕上。当我在新sub中放置断点并跟踪正在发生的事情时,我可以看到过滤器。新sub被遍历两次,值被读入,但我从该sub中初始化的任何内容都不会对页面产生任何影响,即使据我所知,它都已成功创建。以下是仅读取Label属性的代码示例:

Imports System
Imports System.Collections
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls


Public Class GridFilterBar
Inherits System.Web.UI.UserControl

Private _Filters As New FiltersClass(Me)

<PersistenceMode(PersistenceMode.InnerProperty)> _
Public ReadOnly Property Filters() As FiltersClass
    Get
        Return _Filters
    End Get
End Property

Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
    DDL.Visible = True
End Sub
End Class

Public Class FiltersClass
Inherits ControlCollection

Public Sub New(ByVal owner As Control)
    MyBase.New(owner)
End Sub

Public Overrides Sub Add(ByVal child As System.Web.UI.Control)
    MyBase.Add(New Filter(child))
End Sub

End Class

Public Class Filter
Inherits HtmlGenericControl

Public Sub New(ByVal GenericControl As HtmlGenericControl)
    Label = GenericControl.Attributes("Label")
    Dim lit As New Literal
    lit.Text = Label.ToString
    Me.Controls.Add(lit)
End Sub

Public Property Label As String = String.Empty

Public Overrides Function ToString() As String
    Return Me.Label
End Function

End Class

有人能看出我做错了什么吗?

我能回答我的问题。我在主类中为CreateChildControls添加了一个覆盖子类,并使用for-Each循环从每个新初始化的过滤器获取属性集

Protected Overrides Sub CreateChildControls()

    For Each filter In Filters

        Dim lit As New Literal
        lit.Text = filter.Label
        Controls.Add(lit)

    Next filter

End Sub
这将过滤器降级。新子过滤器仅用于获取属性:

Public Sub New(ByVal GenericControl As HtmlGenericControl)
    Label = GenericControl.Attributes("Label")
End Sub