views:

30

answers:

1

I want my User Control to be able to have Literal Content inside of it. For Example:

<fc:Text runat="server">Please enter your login information:</fc:Text>

Currently the code for my user control is:

<ParseChildren(True, "Content")> _
Partial Public Class ctrFormText
    Inherits UserControl

    Private _content As ArrayList

    <PersistenceMode(PersistenceMode.InnerDefaultProperty), _
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
    TemplateInstance(TemplateInstance.Single)> _
    Public Property Content() As ArrayList
        Get
            If _content Is Nothing Then
                Return New ArrayList
            End If
            Return _content
        End Get
        Set(ByVal value As ArrayList)
            _content = value
        End Set
    End Property

    Protected Overrides Sub CreateChildControls()
        If _content IsNot Nothing Then
            ctrChildren.Controls.Clear()
            For Each i As Control In _content
                ctrChildren.Controls.Add(i)
            Next
        End If
        MyBase.CreateChildControls()
    End Sub
End Class

And when I put text inside this control (like above) i get this error:

Parser Error Message: Literal content ('Please enter your login information to access CKMS:') is not allowed within a 'System.Collections.ArrayList'.

This control could have other content than just the text, so making the Content property an attribute will not solve my problem.

I found in some places that I need to implement a ControlBuilder Class, along with another class that implements IParserAccessor.

Anyway I just want my default "Content" property to have all types of controls allowed in it, both literal and actual controls.

A: 

You need to set the ParseChildren attribute to "False", otherwise any content in your control will be parsed into the "Content" property. This does not meet your needs, as you want to have controls AND content.

In order to accomplish this, override the AddParsedSubObject method. Check for the parsed control type, and if it's a literal control, add it to your UserControl's Content property. If it's some other control, just add it to the Controls collection like usual.

At the end of parsing all your sub-objects, simply display the Content property in a literal control or a panel or something.

womp