很简单,但我无法弄清楚它为什么不起作用。
我有五个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
。
答案 0 :(得分:1)
由于您的TextBoxes
位于ContentPlaceHolder
内,因此您需要将this
关键字替换为ContentPlaceHolder
(MainContent
)。这可以按你的意愿工作:
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;
}
}