2009-05-27 7 views
0

Я хочу создать пользовательский элемент управления контейнера в ASP.NET (аналогично панели) с флажком в виде заголовка, который отключает все содержащиеся элементы управления при его отсутствии.Как создать пользовательскую панель с флажком в ASP.NET

Как бы я это сделал?

EDIT:

Для расширения моих требований, мне нужно что-то вроде Роб предложили, то есть в UserControl, содержащий CheckBox и панель контента. Однако он должен быть функционально подобен панели, поскольку мне нужно иметь возможность повторно использовать элемент управления, определяя различное содержимое в каждом его экземпляре. Трудно объяснить, извините за кажущуюся «ползучесть».

ответ

2

Если я правильно помню, вы отключите панель [с помощью включенного свойства], когда флажок снят, это отключит элементы на панели. Затем вам не нужно отключать все элементы внутри панели отдельно. Аналогично, когда вы снова включите панель, она снова включит дочерние элементы управления.

myPanel.Enabled = false; //Child controls disabled 
myPanel.Enabled = true; //Child controls enabled 

Вы также можете перебирать каждый элемент управления внутри панели с помощью:

foreach(Control control in myPanel) 
{ 
    //Assume for the purpose of demonstration 
    //that each control within myPanel has an 
    //"Enabled" property 
    control.Enabled = myPanel.Enabled; 
} 

Это установить включен свойство каждого элемента управления на панели, чтобы соответствовать панели - на самом деле, это избыток в и поэтому не очень желательно. Я просто предоставил этот метод для демонстрационных целей.

Edit: Это может быть продлен [например] дизайн Роба для пользовательского элемента управления, который вы могли бы добавить свойство элемента управления пользователя, чтобы выставить коллекцию элементов управления на панели в:

public Control[] Controls 
{ 
    return controlPanel.Controls; 
} 

Это было по существу разрешить изменение элементов управления вашего элемента управления вне вашего пользовательского элемента управления и не требовать назначения элементов управления в определении панели внутри пользовательского элемента управления.

2

Я хотел бы создать UserControl со следующим:

<asp:UpdatePanel ID="upDisableAllPanel" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 
     <asp:CheckBox AutoPostBack="true" ID="cbTogglePanel" runat="server" /> 
     <asp:Panel ID="pnlDisableAll" runat="server"> 
     ... controls here ... 
     </asp:Panel> 
    </ContentTemplate> 
</asp:UpdatePanel> 

В коде-за добавления этого (образец VB)

Public MyControls As New ControlCollection(Me) 

Protected Sub control_load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    bindControls() 
End Sub 

Protected Sub cbTogglePanel_CheckChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbTogglePanel.CheckChanged 
    pnlDisableAll.Enabled = cbTogglePanel.Checked 'Or Not cbTogglePanel.Checked depending on how you have the cb labeled.' 
End Sub 

Public Sub bindControls() 
    If MyControls IsNot Nothing And MyControls.Count > 0 Then 
     pnlDisableAll.Controls.Clear() 
     For Each cntrl As Control In MyControls 
      pnlDisableAll.Controls.Add(cntrl) 
     Next 
    End If 
End Sub 

@balabaster является правильным, что отключение панели будет эффективно отключить все внутри. Это инкапсулирует его в контейнер многоразового использования.

Этот код предполагает, что вы используете .Net 3.5 или .Net 2 с библиотекой Ajax.Net и объявили ScriptManager где-то на странице содержимого или главной странице. Вы : с помощью Ajax справа?

+0

Приятное аккуратное решение, стоит отметить, хотя вам не нужно * Ajax для вашего решения для работы, это просто сделало бы его немного более удобным для пользователя. – BenAlabaster

+0

Меня постоянно обвиняют в том, что я слишком хорош для своих пользователей. –

+0

+1 хотя для хорошего примера того, как реализовать это – BenAlabaster

1

Я думаю, что я пошла бы по этой проблеме по-другому, я не думаю, что UserControl с Panel/Checkbox внутри него будет работать так, как вы хотите, потому что вы не сможете легко добавить в него другие элементы управления ,

Вместо этого я создам Ajax Extender для блока управления Checkbox a Panel в качестве аргумента.Затем, всякий раз, когда был нажат Checkbox, попросите его посетить каждый из дочерних элементов управления Panels с кодом что-то вроде этого;

foreach(Control c in pnlFoo.Controls) 
{ 
    if (!(c is Checkbox)) // probably need a better check than this 
    {     // incase you have other checkboxes inside your panel 
     c.Enabled = chkToggler.Checked; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^