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

时间:2012-10-15 13:18:21

标签: vb.net user-controls

我正在设计一个用户控件,尝试根据下面的示例标记在页面上创建一个包含各种TextBox或DropDownList元素的过滤器栏:

<gf:GridFilterBar runat="server">
    <filters>
        <filter Label="Field1" Type="TextBox" />
        <filter Label="Field2" Type="DropDownList" />
    </filters>
</gf:GridFilterBar>

使用来自其他帖子的灵感,我创建了正确解析此标记的代码并读入每个预期子控件的属性。我遇到的问题是何时需要在屏幕上实际呈现此信息。我在“过滤器”类的“新”子项中初始化的每个控件都不会出现在屏幕上。当我在“新”子中放置一个断点并跟踪发生的事情时,我可以看到Filter.New子被遍历两次并且值被读入,但是我在该子域内初始化的其他内容对页面没有任何影响尽管如此,据我所知,这一切都是成功创造的。以下是只读取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

有人能发现我做错了吗?

1 个答案:

答案 0 :(得分:-1)

我能够回答我的问题。我在我的主类中为CreateChildControls添加了一个override子句,并使用For Each循环从每个新初始化的“Filter”中获取属性集

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

这将Filter.New子降级为简单地抓住属性:

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