2009-02-02 65 views
17

我在頁面中有多個下拉列表,並且想要禁用所有用戶選擇禁用全部的複選框。到目前爲止,我有這個代碼,它不工作。有什麼建議麼?如何禁用ASP.NET頁面中的所有控件?

foreach (Control c in this.Page.Controls) 
{ 
    if (c is DropDownList) 
     ((DropDownList)(c)).Enabled = false; 
} 

回答

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 
+0

謝謝!我想關閉除了一個窗體以外的窗體上的所有按鈕/文本框/組合框,並且禁用面板會禁用所有控件,因此它不起作用。使用你的方法,我可以關閉我想要的控件,但不是面板。 – ajs410 2010-03-17 14:50:07

18

如果你想在面板中禁用所有的控件,然後啓用/禁用面板,這將是最簡單的。

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

這裏是一個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 
0

如果你真的想在頁面上禁用所有控制,那麼最簡單的方式做這是將窗體的Disabled屬性設置爲true。

ASPX:

<body> 
    <form id="form1" runat="server"> 
     ... 
    </form> 
</body> 

代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
{ 
    form1.Disabled = true; 
} 

不過,當然,這也將禁用複選框,這樣你就無法點擊複選框以重新啓用控制。

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)

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庫。

28

我知道這是一箇舊的帖子,但這是我剛剛解決這個問題。按照標題「如何禁用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 
+2

這是最好的解決方案,因爲它會禁用具有「已啓用」屬性的任何控件。我當前的項目可以在特定的字段集中包含各種自定義控件,僅禁用某些已知類型就很難看。 – ASalazar 2013-04-15 17:55:27

2

我和我做這樣的

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控件工作
相關問題