2009-02-02 5 views
17

Ich habe mehrere Dropdown-Liste in einer Seite und möchte alle deaktivieren, wenn der Benutzer ein Kontrollkästchen aktiviert, die liest alle deaktivieren. Bisher habe ich diesen Code und es funktioniert nicht. Irgendwelche Vorschläge?Wie deaktiviere ich alle Steuerelemente in der ASP.NET-Seite?

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

Antwort

37

Jedes Steuerelement hat untergeordnete Steuerelemente, so dass man die Rekursion verwenden müssen, würde sie alle erreichen:

es
protected void DisableControls(Control parent, bool State) { 
    foreach(Control c in parent.Controls) { 
     if (c is DropDownList) { 
      ((DropDownList)(c)).Enabled = State; 
     } 

     DisableControls(c, State); 
    } 
} 

Dann rufen Sie wie folgt:

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

Danke! Ich wollte alle Tasten/Textfelder/Comboboxes auf einem Formular mit Ausnahme einer deaktivieren, und das Deaktivieren eines Bedienfelds deaktiviert alle Steuerelemente, so dass es nicht funktioniert. Mit Ihrer Methode konnte ich nur die Steuerelemente ausschalten, die ich wollte, aber nicht die Panels. – ajs410

18

Es wäre am einfachsten, wenn Sie alle Steuerelemente, die Sie deaktivieren möchten, in einem Panel platzieren und dann nur das Panel aktivieren/deaktivieren.

1

Sie haben diese rekursiv zu tun, Ich meine, Sie müssen untergeordnete Steuerelemente der Steuerelemente zu deaktivieren:

1

Hier ist eine VB.NET-Version, die auch eine opt Parameter, so dass auch die Steuerung aktiviert werden kann.

Private Sub SetControls (ByVal Parent As Control, Optional ByVal ermöglichen 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 
0

Wenn Sie wirklich alle Steuerelemente auf einer Seite deaktivieren möchten, dann ist die einfachste Art und Weise zu tun Dies setzt die Deaktivierte Eigenschaft des Formulars auf "True".

ASPX:

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

-Code-behind:

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

Aber natürlich, das wird auch Ihre Kontrollkästchen deaktivieren, so dass Sie nicht in der Lage sein, das Kontrollkästchen klicken, um wieder zu aktivieren die Kontrollen.

8

Setzen Sie ein Panel um den Teil der Seite, die Sie deaktiviert werden soll:

< asp:Panel ID="pnlPage" runat="server" > 
     ... 
    </asp:Panel> 

Innerhalb von Page_Load:

If Not Me.Page.IsPostBack Then 
     Me.pnlPage.Enabled = False 
    End If 

... oder C# -Äquivalent. : 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; 
} 

Ich benutze eine linq aproach. Wenn Sie devExpress verwenden, müssen Sie DevExpress.Web.ASPxEditors lib einschließen.

28

Ich weiß, das ist ein alter Beitrag, aber das ist, wie ich gerade dieses Problem gelöst habe. Wie unter dem Titel "Wie deaktiviere ich alle Steuerelemente in ASP.NET-Seite?" Ich habe Reflection benutzt, um das zu erreichen. Es wird auf allen Steuerelementtypen funktionieren, die über die Eigenschaft Enabled verfügen. Rufen Sie einfach DisableControls auf, indem Sie das übergeordnete Steuerelement (z. B. Form) übergeben.

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

Dies ist die beste Lösung, da alle Steuerelemente mit der Eigenschaft "Enabled" deaktiviert werden. Mein aktuelles Projekt kann eine Vielzahl von benutzerdefinierten Steuerelementen innerhalb eines bestimmten Feldsets haben. Es war hässlich, nur bestimmte bekannte Typen zu deaktivieren. – ASalazar

+1

Perfekt für mich! Vielen Dank. – MAW74656

2

ich mit ASP.Net und HTML-Steuerelemente arbeiten Ich mag dieses tat

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

wie diese genannt

DisableForm(Page.Controls);