使用母版页清除ASP.NET页面中的所有控件

时间:2011-01-12 09:28:04

标签: c# asp.net

我有一个asp.net页面,它继承自母版页。我想清除此页面中的所有控件。我尝试使用下面的方法。如果有母版页,这是行不通的。否则它的工作正常吗?

private void ClearControls()
{
    foreach(Control c in Page.Controls)
    {
        foreach (Control ctrl in c.Controls)
        {
            if (ctrl is TextBox)
            {
                ((TextBox)ctrl).Text = string.Empty;
            }
        }
    }
} 

9 个答案:

答案 0 :(得分:6)

试试这个:

public void FindAllTextBox(Control ctrl)
{
    if (ctrl != null)
    {
        foreach (Control c in ctrl.Controls)
        {
            if (c is TextBox)
                ((TextBox)c).Text = string.empty;
            FindAllTextBox(c);
        }
    }
}

例:

Control ctrl = this.FindControl("content");
FindAllTextBox(ctrl);

答案 1 :(得分:1)

这可能是因为当您添加母版页时,您的控件位于另一个容器内。你之前尝试过添加另一个foreach吗?

private void ClearControls()
{ 
    foreach(Control container in Page.Controls) 
    {  
        foreach (Control c in container.Controls)  
        {     
            foreach (Control ctrl in c.Controls)  
            {     
                if (ctrl is TextBox)        
                {          
                    ((TextBox)ctrl).Text = string.Empty; 
                }   
            }  
        }
    }
}  

我不会这样做。有时硬编码更好。在包含大量控件的页面上调用时,这会占用大量资源。

答案 2 :(得分:1)

不要硬编码:

//Recursively get all the formControls underneath the current one, be it Page, UserControl or whatever.
public static IEnumerable<Control> GetAllControls(this Control parent)  
{  
    foreach (Control control in parent.Controls)  
    {
        yield return control;  
        foreach (Control descendant in control.GetAllControls())  
        {  
            yield return descendant;  
        }  
    }  
}

然后你可以在webform / control中调用它:

var formCtls = this.GetAllControls().OfType<TextBox>();
foreach(TextBox txtbx in formCtls)
{
    //do what you gotta do ;)

}

答案 3 :(得分:0)

首先,使用运算符as代替iscast

TextBox tb = ctrl as TextBox;
if (tb != null)
{
    tb.Text = String.Empty;
}

其次,您可以使用ITextControl代替TextBox

第三,尝试下一个扩展方法:

public static IEnumerable<T> GetChildControls(this Control control) where T : Control
{
    var children = (control.Controls != null) ? control.Controls.OfType<T>() : Enumerable.Empty<T>();
    return children.SelectMany(c => GetChildControls(c)).Concat(children);
}

用法:

foreach (var c in this.Page.Controls.GetChildControls<TextBox>())
{
    c.Text = String.Empty;
}

答案 4 :(得分:0)

我有同样的问题,但我认为我太难了。我正在使用AJAX UpdatePanel控件,我刚刚引用它而不是一直到MasterPage。这对我有用。

        foreach (Control c in UpdatePanel1.Controls)
        {
            foreach (Control c1 in c.Controls)
            {
                if (c1 is TextBox)
                {
                    TextBox txtBox = (TextBox)c1;
                    txtBox.Text = "0";
                }
            }
        }

答案 5 :(得分:0)

只需将控件保留在Panel中,然后尝试下面的代码

foreach (Control cntrl in pnl.Controls)//pnl is panel id  
                {  
                    if (cntrl is TextBox)  
                    {  
                        TextBox txtBox = (TextBox)cntrl;  
                        txtBox.Text = " ";  
                    }  
                }  

答案 6 :(得分:0)

在你的.cs上制作一个方法:

 //Where "this" is Page.
 ClearInput(this);

 private void ClearInput(Control parent)
 {
     foreach (Control c in parent.Controls)
     {
          if (c.Controls.Count > 0)
                ClearInput(c);
          else
          {
               if (c is TextBox)
                  (c as TextBox).Text = "";

               if (c is CheckBox)
                  (c as CheckBox).Checked = false;

                if (c is DropDownList)
                   (c as DropDownList).SelectedIndex = 1;
           }
       }
   }

答案 7 :(得分:0)

        private void EnableControls(Control control)
        {
            var textbox = control as TextBox;
            if (textbox != null)
            {
                textbox.Enabled = true;
            }

            var dropDownList = control as DropDownList;
            if (dropDownList != null)
            {
                dropDownList.Enabled = true;
            }

            var radioButton = control as RadioButton;
            if (radioButton != null)
            {
                radioButton.Enabled = true;
            }

            var checkBox = control as CheckBox;
            if (checkBox != null)
            {
                checkBox.Enabled = true;
            }

            foreach (Control childControl in control.Controls)
            {
                EnableControls(childControl);
            }

        }

答案 8 :(得分:0)

    public void getAllCtl(ControlCollection ctls)
    {

        foreach (Control c in ctls)
        {
            if (c is System.Web.UI.WebControls.TextBox)
            {
                //TextBox tt = c as TextBox;
                ////to do something by using textBox tt.
                ((TextBox)c).Text = string.Empty;
            }
            if (c is System.Web.UI.WebControls.CheckBox)
            {
                ((CheckBox)c).Checked = false;
            }
            if (c is System.Web.UI.WebControls.DropDownList)
            {
                ((DropDownList)c).SelectedIndex = -1;
            }
            if (c.HasControls())
            {
                getAllCtl(c.Controls);

            }
        }

    }

在aspx.cs文件中调用

        getAllCtl(this.Form.Controls);

这是可以测试的,适用于所有Master-child页面以及页面中包含多个控件...