获取页面中的所有TextBox

时间:2016-07-31 13:12:11

标签: c# asp.net

很简单,但我无法弄清楚它为什么不起作用。 我有五个TextBox和一个Button,点击即可计算TextBox的数量。

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Testing._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:Label ID="Label1" runat="server" Text="Test"></asp:Label> </br>   
<asp:TextBox ID="TextBox1" runat="server" Width="40px"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" Width="40px"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server" Width="40px"></asp:TextBox>
<asp:TextBox ID="TextBox4" runat="server" Width="40px"></asp:TextBox>
<asp:TextBox ID="TextBox5" runat="server" Width="40px"></asp:TextBox>
</br>
<asp:Button ID="Button1" runat="server" Text="Generate" OnClick="Button1_Click" />
</asp:Content>

背后的代码

protected void Button1_Click(object sender, EventArgs e)
{
    var List = this.Controls.OfType<TextBox>();
    Label1.Text = List.Count().ToString();
}

但结果会给我0

2 个答案:

答案 0 :(得分:1)

由于您的TextBoxes位于ContentPlaceHolder内,因此您需要将this关键字替换为ContentPlaceHolderMainContent)。这可以按你的意愿工作:

var List = (Page.Master.FindControl("MainContent") as ContentPlaceHolder)
            .Controls.OfType<TextBox>();
Label1.Text = List.Count().ToString();

答案 1 :(得分:0)

如果文本框位于表格或 div 中,则大多数解决方案将不起作用。唯一的方法是在所有控件中递归查找它们。将以下函数粘贴到某个类中。

public static List<Control> GetAllControls(List<Control> controls, Type t, Control parent) //first call pass this.Page as the 'Parent' parameter
    {
        foreach (Control c in parent.Controls)
        {
            if (c.GetType() == t)
                controls.Add(c);
            if (c.HasControls())
                controls = GetAllControls(controls, t, c);
        }
        return controls;
    }

然后在您的 asp 页面中按如下方式调用它。

List<Control> list = new List<Control>();
list = GetAllControls(list, typeof(TextBox), this.Page);

这将获取您传递的类型的所有控件(在我的示例中为 TextBox)

然后您可以遍历 Textbox 控件列表。

foreach (Control ctl in list)
{
    if (ctl.GetType() == typeof(TextBox))   //this should always test true but you i left it here for clarity     
    {
        //do something  
        ((TextBox)ctl).Attributes.Add("onfocus", "this.select()");
    }
 }

这是我将 select() 属性添加到所有文本框的实现。

//my asp page
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        Utils.SetTextBoxFocusSelect(this.Page);
}

//in a utilities class
public class Utils
{
    public static void SetTextBoxFocusSelect(Page page)
    {
        List<Control> list = new List<Control>();
        list = GetAllControls(list, typeof(TextBox), page);

        foreach (Control ctl in list)
        {
            if (ctl.GetType() == typeof(TextBox))
            {
                ((TextBox)ctl).Attributes.Add("onfocus", "this.select()");
            }
        }
    }

    public static List<Control> GetAllControls(List<Control> controls, Type t, Control parent /* can be Page */)
    {
        foreach (Control c in parent.Controls)
        {
            if (c.GetType() == t)
                controls.Add(c);
            if (c.HasControls())
                controls = GetAllControls(controls, t, c);
        }
        return controls;
    }
}