0

我想在 ASP.NET(类似于面板)中创建一个自定义容器控件,其中一个复选框作为标题,在未选中时禁用所有包含的控件。

我该怎么做呢?

编辑:

为了扩展我的要求,我需要类似 Rob 建议的东西,即包含 CheckBox 和内容面板的 UserControl。但是,它应该在功能上类似于 Panel,因为我需要能够重用控件,在它的每个实例中定义不同的内容。很难解释,对于明显的“功能蠕变”感到抱歉。

4

3 回答 3

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

这将设置面板中每个控件的 enabled 属性以匹配面板的属性 - 实际上,这超出了要求,因此并不是真正可取的。我只是为了演示目的提供了这个方法。

编辑:这可以通过 Rob 的用户控件设计来扩展 [例如],您可以向用户控件添加一个属性以公开面板的控件集合:

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

这基本上允许从用户控件外部修改控件的面板控件,并且不需要在用户控件内部的面板定义中分配控件。

于 2009-05-27T16:21:05.190 回答
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 是正确的,禁用面板将有效地禁用内部的所有内容。这会将其封装到可重复使用的容器中。

此代码假定您正在使用带有 Ajax.Net 库的 .Net 3.5 或 .Net 2,并且在内容页或母版页的某处声明了 ScriptManager。您使用的是Ajax 对吗?

于 2009-05-27T16:34:40.233 回答
1

我想我会以不同的方式解决这个问题,我认为其中带有面板/复选框的 UserControl 不会按照您希望的方式工作,因为您将无法轻松地将其他控件添加到其中。

相反,我会为Checkbox控件创建一个 Ajax Extender,将 aPanel作为参数提供给它。然后,每当单击 时,让它使用类似这样的代码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;
   }
}
于 2009-05-27T17:08:27.043 回答