我在頁面中有多個下拉列表,並且想要禁用所有用戶選擇禁用全部的複選框。到目前爲止,我有這個代碼,它不工作。有什麼建議麼?如何禁用ASP.NET頁面中的所有控件?
foreach (Control c in this.Page.Controls)
{
if (c is DropDownList)
((DropDownList)(c)).Enabled = false;
}
我在頁面中有多個下拉列表,並且想要禁用所有用戶選擇禁用全部的複選框。到目前爲止,我有這個代碼,它不工作。有什麼建議麼?如何禁用ASP.NET頁面中的所有控件?
foreach (Control c in this.Page.Controls)
{
if (c is DropDownList)
((DropDownList)(c)).Enabled = false;
}
每個控件都有子控件,所以你需要使用遞歸來達到他們都:
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
如果你想在面板中禁用所有的控件,然後啓用/禁用面板,這將是最簡單的。
你要做這個遞歸,我的意思是你必須禁用子控件的控件:
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;
}
}
}
這裏是一個VB.NET版本,它也需要一個選擇離子參數,因此它也可以用於啓用控制。
私人小組SetControls(BYVAL parentControl作爲對照,可選BYVAL使由於布爾= 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
如果你真的想在頁面上禁用所有控制,那麼最簡單的方式做這是將窗體的Disabled屬性設置爲true。
ASPX:
<body>
<form id="form1" runat="server">
...
</form>
</body>
代碼隱藏:
protected void Page_Load(object sender, EventArgs e)
{
form1.Disabled = true;
}
不過,當然,這也將禁用複選框,這樣你就無法點擊複選框以重新啓用控制。
放在面板周圍要禁用頁面的一部分:
< asp:Panel ID="pnlPage" runat="server" >
...
</asp:Panel>
裏面的Page_Load中:
If Not Me.Page.IsPostBack Then
Me.pnlPage.Enabled = False
End If
...或C#等效。 :o)
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庫。
我知道這是一箇舊的帖子,但這是我剛剛解決這個問題。按照標題「如何禁用ASP.NET頁面中的所有控件?」我用反射來實現這一點;它將適用於所有具有Enabled屬性的控件類型。只需調用父控件中的DisableControls傳遞(即,Form)即可。
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
這是最好的解決方案,因爲它會禁用具有「已啓用」屬性的任何控件。我當前的項目可以在特定的字段集中包含各種自定義控件,僅禁用某些已知類型就很難看。 – ASalazar 2013-04-15 17:55:27
我和我做這樣的
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);
ASP.Net和HTML控件工作
謝謝!我想關閉除了一個窗體以外的窗體上的所有按鈕/文本框/組合框,並且禁用面板會禁用所有控件,因此它不起作用。使用你的方法,我可以關閉我想要的控件,但不是面板。 – ajs410 2010-03-17 14:50:07