2009-02-02 3 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

Спасибо! Я хотел отключить все кнопки/текстовые поля/comboboxes в форме, кроме одной, и отключить панель отключает все элементы управления, чтобы она не работала. Используя ваш метод, я мог бы отключить только те элементы управления, которые я хотел, но не панели. – ajs410

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, которая также принимает выбор чтобы его можно было использовать и для управления.

Private Sub SetControls (ByVal parentControl В качестве контроля Факультативного ByVal включить 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

Если вы действительно хотите, чтобы отключить всех управления на странице, то самый простой способ сделать это означает, что свойство Disabled для формы имеет значение true.

ASPX:

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

Code-за:

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 lib.

28

Я знаю, что это старый пост, но так я решил эту проблему. AS за заголовок «Как отключить все элементы управления на странице ASP.NET?» Для этого я использовал Reflection; он будет работать на всех типах управления, которые имеют свойство Enabled. Просто вызовите DisableControls, проходящий в родительском элементе управления (I.e., 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

+1

Идеально подходит для меня! Благодарю. – MAW74656

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); 
Смежные вопросы