C# 如何使用for循环扫描ASP.NET页面中的所有控件?

C# 如何使用for循环扫描ASP.NET页面中的所有控件?,c#,asp.net,servercontrols,C#,Asp.net,Servercontrols,我正在使用asp.net,我有一个带有文本框的插入页面,我需要检查页面中的文本框是否为空,如果是,我需要显示一个带有空文本框的消息框 foreach (Control ctrl in Page.Controls) { if (ctrl is TextBox) { if (((TextBox)(ctrl)).Text == "") { helpCalss.MessageBox

我正在使用asp.net,我有一个带有文本框的插入页面,我需要检查页面中的文本框是否为空,如果是,我需要显示一个带有空文本框的消息框

foreach (Control ctrl in Page.Controls) 
    {
        if (ctrl is TextBox)
        {
            if (((TextBox)(ctrl)).Text == "")
            {  
               helpCalss.MessageBox("Please fill the empty fields", this);
                    return;  
            }  
        }  
    }  
公共列表ListControlCollections(页面,字符串propertyName)
{
列表控制器=新列表();
AddControls(page.Form.Controls、controlList、propertyName);
返回控制器;
}
私有void AddControls(ControlCollection ControlCollection、列表控制器、字符串propertyName)
{
foreach(controlCollection中的控件c){
PropertyInfo propertyToFind=c.GetType().GetProperty(propertyName);
if(propertyToFind!=null){
添加(c);
}
if(c.HasControls()){
AddControls(c.Controls、controlList、propertyName);
}
}
}
要使用它:

public List<Control> ListControlCollections(Page page, string propertyName)
{
    List<Control> controlList = new List<Control>();
    AddControls(page.Form.Controls, controlList, propertyName);
    return controlList;
}

private void AddControls(ControlCollection controlCollection, List<Control> controlList, string propertyName)
{
    foreach (Control c in controlCollection) {
        PropertyInfo propertyToFind = c.GetType().GetProperty(propertyName);

        if (propertyToFind != null) {
            controlList.Add(c);
        }

        if (c.HasControls()) {
            AddControls(c.Controls, controlList, propertyName);
        }
    }
}
List controlList=ListControlCollections(“文本”);
对于(i=0;i
我想你可以试试这个递归函数来获取页面上的所有文本框

List<Control> controlList = ListControlCollections("Text");
for (i=0; i < controlList.length; i++)
{
   if (controlList[i].Text == string.empty)
   {
      // Do your logic here
   }
   else  
   {
      // Do your logic here
   }
}
//
///在用户控件的控件集合中递归查找文本框
/// 
/// 
/// 
/// 
私有void FindControlRecursiveByType(ControlCollection控件,ref List OutputList)
{
foreach(controls.OfType()中的WebControl控件)
{
如果(控件为文本框)
添加(控件作为文本框);
如果(control.Controls.Count>0)
FindControlRecursiveByType(control.Controls,ref OutputList);
}
}

OutputList将包含所有文本框,然后您可以检查它们是否存在空条件

正如人们指出的那样,您的方法是错误的-除非您在页面中动态添加控件,否则您应该通过验证器执行验证

下面是一段如何做到这一点的片段:

    /// <summary>
    /// Find TextBoxes Recursively in the User control's control collection
    /// </summary>
    /// <param name="controls"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    private void FindControlRecursiveByType(ControlCollection controls, ref List<TextBox> OutputList)
    {
        foreach (WebControl control in controls.OfType<WebControl>())
        {
            if (control is TextBox)
                OutputList.Add(control as TextBox);
            if (control.Controls.Count > 0)
                FindControlRecursiveByType(control.Controls, ref OutputList);
        }
    }

在页面中使用
SearchControls(this)
开始搜索。

尝试使用
Validation
控件(客户端和服务器端)或
JavaScript
(jQuery)来验证用户输入。您没有显示任何实际的消息框吗?这将在部署时导致各种问题。相关:@AVD我已经尝试使用javascript,但问题是我有一个母版页和内容页,因此id不同,当我使用clientid Proerti时javascript代码不起作用。我需要循环页面中的所有控件,如果它的类型是textbox,我需要检查它是否正确是否为空,如果为空,则会出现一个带有空文本框的消息框,并回滚以将文本放入空文本框。感谢您的代码,但它将如何帮助我解决此问题?我更新了答案。上面的代码将收集页面上的所有控件。一旦你有了所有的控件,你就可以在它们之间循环并检查它们的所有值。它在您的情况下非常有用。@OmniaElshazly-您可以在JavaScript/jQuery中设置并控制.ClientID以引用服务器控件的id。
private void SearchControls(Control controlSearch)
{
    foreach (Control control in controlSearch.Controls)
    {
        if (control != null)
        {
            if (control.Controls != null & control.Controls.Count > 0)
            {
                SearchControls(control, form);
            }

            TextBox textbox = control as TextBox;
            if (textbox != null && string.IsNullOrEmpty(textbox.Text))
            {

            }
        }
    }
}