我在一个页面中有多个下拉列表,如果用户选择一个禁用全部的复选框,则要禁用所有。到目前为止,我有这个代码,它无法正常工作。有什么建议吗?
foreach (Control c in this.Page.Controls)
{
if (c is DropDownList)
((DropDownList)(c)).Enabled = false;
}
答案 0 :(得分:37)
每个控件都有子控件,因此您需要使用递归来实现所有控件:
protected void DisableControls(Control parent, bool State) {
foreach(Control c in parent.Controls) {
if (c is DropDownList) {
((DropDownList)(c)).Enabled = State;
}
DisableControls(c, State);
}
}
然后这样称呼它:
protected void Event_Name(...) {
DisableControls(Page,false); // use whatever top-most control has all the dropdowns or just the page control
} // divs, tables etc. can be called through adding runat="server" property
答案 1 :(得分:29)
我知道这是一个老帖子,但这就是我刚刚解决了这个问题的方法。根据标题“我如何禁用ASP.NET页面中的所有控件?”我用反射来达到这个目的;它适用于具有Enabled属性的所有控件类型。只需调用在父控件中传递的DisableControls(即表单)。
C#:
private void DisableControls(System.Web.UI.Control control)
{
foreach (System.Web.UI.Control c in control.Controls)
{
// Get the Enabled property by reflection.
Type type = c.GetType();
PropertyInfo prop = type.GetProperty("Enabled");
// Set it to False to disable the control.
if (prop != null)
{
prop.SetValue(c, false, null);
}
// Recurse into child controls.
if (c.Controls.Count > 0)
{
this.DisableControls(c);
}
}
}
VB:
Private Sub DisableControls(control As System.Web.UI.Control)
For Each c As System.Web.UI.Control In control.Controls
' Get the Enabled property by reflection.
Dim type As Type = c.GetType
Dim prop As PropertyInfo = type.GetProperty("Enabled")
' Set it to False to disable the control.
If Not prop Is Nothing Then
prop.SetValue(c, False, Nothing)
End If
' Recurse into child controls.
If c.Controls.Count > 0 Then
Me.DisableControls(c)
End If
Next
End Sub
答案 2 :(得分:19)
如果您在面板中放置要禁用的所有控件,然后启用/禁用面板,这将是最简单的。
答案 3 :(得分:8)
在要禁用的页面部分周围放置一个面板:
< asp:Panel ID="pnlPage" runat="server" >
...
< /asp:Panel >
Page_Load:
If Not Me.Page.IsPostBack Then
Me.pnlPage.Enabled = False
End If
...或C#等价物。 :O)
答案 4 :(得分:2)
我正在使用ASP.Net和HTML控件我喜欢这个
public void DisableForm(ControlCollection ctrls)
{
foreach (Control ctrl in ctrls)
{
if (ctrl is TextBox)
((TextBox)ctrl).Enabled = false;
if (ctrl is Button)
((Button)ctrl).Enabled = false;
else if (ctrl is DropDownList)
((DropDownList)ctrl).Enabled = false;
else if (ctrl is CheckBox)
((CheckBox)ctrl).Enabled = false;
else if (ctrl is RadioButton)
((RadioButton)ctrl).Enabled = false;
else if (ctrl is HtmlInputButton)
((HtmlInputButton)ctrl).Disabled = true;
else if (ctrl is HtmlInputText)
((HtmlInputText)ctrl).Disabled = true;
else if (ctrl is HtmlSelect)
((HtmlSelect)ctrl).Disabled = true;
else if (ctrl is HtmlInputCheckBox)
((HtmlInputCheckBox)ctrl).Disabled = true;
else if (ctrl is HtmlInputRadioButton)
((HtmlInputRadioButton)ctrl).Disabled = true;
DisableForm(ctrl.Controls);
}
}
这样称呼
DisableForm(Page.Controls);
答案 5 :(得分:1)
你必须递归,我的意思是你必须禁用控件的子控件:
protected void Page_Load(object sender, EventArgs e)
{
DisableChilds(this.Page);
}
private void DisableChilds(Control ctrl)
{
foreach (Control c in ctrl.Controls)
{
DisableChilds(c);
if (c is DropDownList)
{
((DropDownList)(c)).Enabled = false;
}
}
}
答案 6 :(得分:1)
这是一个VB.NET版本,它也带有一个可选参数,因此它也可用于启用控件。
Private Sub SetControls(ByVal parentControl As Control,可选ByVal enable As Boolean = False)
For Each c As Control In parentControl.Controls
If TypeOf (c) Is CheckBox Then
CType(c, CheckBox).Enabled = enable
ElseIf TypeOf (c) Is RadioButtonList Then
CType(c, RadioButtonList).Enabled = enable
End If
SetControls(c)
Next
End Sub
答案 7 :(得分:1)
private void ControlStateSwitch(bool state)
{
foreach (var x in from Control c in Page.Controls from Control x in c.Controls select x)
if (ctrl is ASPxTextBox)
((ASPxTextBox)x).Enabled = status;
else if (x is ASPxDateEdit)
((ASPxDateEdit)x).Enabled = status;
}
我使用linq aproach。使用devExpress时,您必须包含 DevExpress.Web.ASPxEditors lib。
答案 8 :(得分:0)
如果您确实要在页面上禁用 所有 控件,那么最简单的方法是将表单的Disabled属性设置为true。
ASPX:
<body>
<form id="form1" runat="server">
...
</form>
</body>
代码隐藏:
protected void Page_Load(object sender, EventArgs e)
{
form1.Disabled = true;
}
但当然,这也会禁用您的复选框,因此您无法点击该复选框来重新启用控件。