Серверный элемент управления не является хорошим решением для меня, поскольку моя панель по умолчанию всегда должна содержать флажок asp , который позволит пользователю скрывать и отображать содержимое панелей.
Я создал свою Panel как шаблонный пользовательский элемент управления, но теперь у меня проблема в том, что я не могу объявить переменные в ней.
[ParseChildren(true)]
public partial class MyPanel: System.Web.UI.UserControl
{
private ITemplate messageTemplate = null;
[TemplateContainer(typeof(MessageContainer))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate Content
{
get
{
return messageTemplate;
}
set
{
messageTemplate = value;
}
}
void Page_Init()
{
MessageContainer container = new MessageContainer();
messageTemplate.InstantiateIn(container);
PlaceHolder1.Controls.Add(container);
}
[ParseChildren(true)]
public class MessageContainer : Control, INamingContainer
{
internal MessageContainer()
{
}
}
}
Если я сделаю следующее в MyPage.aspx
, тогда определениями управления будут , а не , вставленные в MyPage.aspx.designer.cs
a, которые они обычно делают:
<my:MyPanel>
<Content>
<asp:TextBox id = "foo" runat="server" />
</Content>
</my:MyPanel>
Поэтому foo
не создается дизайнером как переменная управления, поэтому у меня нет к ней доступа.
Как я могу создать свою собственную панель, которая позволяет декларировать элементы управления в ней?
EDIT:
Я сейчас попробовал с [ParseChildren(false)]
. Переменные для содержащихся переменных теперь генерируются в коде конструктора формы. Проблема в том, что messageTemplate.InstantiateIn(container)
выдает исключение.