Как включить / отключить группу элементов управления? - PullRequest
1 голос
/ 22 октября 2011

Моя спецификация требует выпадающего ИЛИ двух каландровых боксов рядом с группой переключателей для управления, которая активна, поэтому я сделал этот пользовательский элемент управления:

<asp:RadioButton 
    GroupName="group1" 
    ID="DateMacroRadioButton" 
    runat="server" 
    Checked="true" />
<uc:DateMacroSelector ID="DateMacroSelector1" runat="server" />
<asp:RadioButton GroupName="group1" 
    ID="CustomDateRadioButton" 
    runat="server" 
    AutoPostBack="true" Text="" />
<uc:DateSelector ID="DateSelector1" runat="server" />
to
<uc:DateSelector ID="DateSelector1" runat="server" />

enter image description here

Я бы хотел включить / отключить дочерние элементы управления с помощью групп:

<asp:RadioButton 
    GroupName="group1" 
    ID="DateMacroRadioButton" 
    runat="server"  
    Checked="true" />
<uc:EnableGroup ID="EnableGroup1" runat="server"
   CheckBoxId="DateMacroRadioButton">
   <uc:DateMacroSelector ID="DateMacroSelector1" runat="server" />
</uc:EnableGroup>
<asp:RadioButton GroupName="group1" 
    ID="CustomDateRadioButton" 
    runat="server" 
    AutoPostBack="true" Text="" />
<uc:EnableGroup ID="EnableGroup12 runat="server" 
    CheckBoxId="CustomDateRadioButton">
   <uc:DateSelector ID="DateSelector1" runat="server" />
   to
   <uc:DateSelector ID="DateSelector1" runat="server" />
</uc:EnableGroup>

Как можно разработать пользовательский элемент управления, работающий таким образом?

1 Ответ

1 голос
/ 22 октября 2011

Вы можете создать пользовательский элемент управления, что-то вроде этого должно работать (получение настроек "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 и пропускает сложную часть выше ... если вы хотите иметь возможность контролировать, какие типы объектов разрешены в вашем контейнере, это то, как вы это делаете, но это может быть излишним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...