问题描述:

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.

网友答案:

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.

相关阅读:
Top