我想在ASP.NET中创建一个自定义容器控件(类似于Panel),复选框作为标题,在取消选中时禁用所有包含的控件。
我将如何做到这一点?
编辑:
为了扩展我的要求,我需要Rob建议的东西,即包含CheckBox和内容面板的UserControl。但是,它应该在功能上类似于Panel,因为我需要能够重用控件,在每个实例中定义不同的内容。这很难解释,对于明显的“特征蠕变”感到抱歉。
答案 0 :(得分:2)
如果我没记错,当取消选中该复选框时,禁用面板[使用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属性设置为与面板的属性相匹配 - 实际上,这是对需求的过剩,因此不是很理想。我刚刚提供了这种方法用于演示目的。
编辑这可以通过Rob的用户控件设计进行扩展[例如],您可以向用户控件添加属性以显示面板的控件集合:
public Control[] Controls
{
return controlPanel.Controls;
}
这实际上允许从用户控件外部修改控件的面板控件,而不需要在用户控件内的面板定义中分配控件。
答案 1 :(得分: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吗?
答案 2 :(得分:1)
我认为我会以不同的方式解决这个问题,我不认为带有Panel / Checkbox的UserControl会以你想要的方式工作,因为你将无法轻易地添加其他控件。
相反,我会为Checkbox
控件创建一个Ajax Extender,提供一个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;
}
}