Вы можете создать пользовательский элемент управления, что-то вроде этого должно работать (получение настроек "parsechildren", чтобы он работал в конструкторе, всегда раздражает, но я думаю, что это правильно):
[ParseChildren(typeof(WebControl), ChildrenAsProperties = true,
DefaultProperty = "ChildControls"), NonVisualControl]
public class EnableGroup: Control
{
public EnableGroup() {
ChildControls = new Collection<WebControl>();
}
protected override void OnPreRender(EventArgs e)
{
foreach (WebControl ctl in Controls) {
ctl.Enabled = this.Enabled;
}
base.OnPreRender(e);
}
public Collection<WebControl> ChildControls
{
get;
protected set;
}
}
Но, честно говоря, было бы так же просто написать простой метод расширения или что-то, например,
public static SetChildEnabled(this WebControl parent) {
foreach (WebControl ctl in parent.Controls) {
ctl.Enabled = parent.Enabled;
}
}
, а затем просто использовать любой старый элемент управления, чтобы обернуть ваши группы ...
<asp:PlaceHolder runat="server" id="Group1">
</asp:PlaceHolder>
и назовите этот код для prerender:
Group1.SetChildEnabled()
Вы можете заставить любую рекурсивную работу довольно легко обрабатывать более глубокие вложенные дети, если хотите.
Если подумать, вы, вероятно, могли бы просто создатьконтроль, который расширяет PlaceHolder
и пропускает сложную часть выше ... если вы хотите иметь возможность контролировать, какие типы объектов разрешены в вашем контейнере, это то, как вы это делаете, но это может быть излишним.