Как создать пользовательскую панель с флажком в ASP.NET - PullRequest
0 голосов
/ 27 мая 2009

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

Как бы я поступил так?

EDIT:

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

Ответы [ 3 ]

2 голосов
/ 27 мая 2009

Я бы создал 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, верно?

2 голосов
/ 27 мая 2009

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

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;
}

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

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

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

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

1 голос
/ 27 мая 2009

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

Вместо этого я бы создал Ajax Extender для элемента управления Checkbox, а 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;
   }
}
...