.net代码隐藏页中的GetElementsByTagName功能?
时间:2020-03-06 14:41:06 来源:igfitidea点击:
我正在用C.NET编写网页。在javascript中,有一个名为GetElementsByTagName的函数...对于从.aspx页调用的javascript来说,这很不错。我的问题是,有什么办法可以让我的Ccode后台拥有这种功能?
--
对于那些好奇的场景:我使用了一个asp:repeater来生成许多按钮,现在我基本上是在尝试制作一个将它们全部单击的按钮。我尝试在创建按钮时将所有按钮存储在列表中,但是在每次回发时都会清除该列表,因此我认为我可以尝试上述方法。
解决方案
FindControl(),或者遍历页面上的控件...
For each ctl as Control in Me.Controls If ctl.Name = whatYouWant Then do stuff Next 'ctl
-如果要创建控件,则应设置其ID
Dim ctl as New Control() ctl.ID = "blah1"
等等...
好了,我们可以使用页面的FindControl方法查找控件,但是Repeater元素具有由.net生成的名称。
顺便说一句,如果我们确实愿意,可以将按钮列表存储在页面的ViewState中(或者按钮名称列表)。
无论何时执行任何回发,都将重新创建所有内容,包括数据绑定控件。
如果列表不见了,那么按钮控件也就不见了。除非我们当然要重新创建它们,否则在这种情况下,我们也应该重新创建列表。
试试这个:
foreach (Control ctl in myRepeater.Controls) { if (ctl is Button) { ((Button)ctl).Click(); } }
嗯...
我不完全了解单击所有按钮的意思。但是下面的代码将如何为我们工作?我不知道,我还没有测试...
protected void Page_Load(object sender, EventArgs e) { foreach (Control control in GetControlsByType(this, typeof(TextBox))) { //Do something? } } public static System.Collections.Generic.List<Control> GetControlsByType(Control ctrl, Type t) { System.Collections.Generic.List<Control> cntrls = new System.Collections.Generic.List<Control>(); foreach (Control child in ctrl.Controls) { if (t == child.GetType()) cntrls.Add(child); cntrls.AddRange(GetControlsByType(child, t)); } return cntrls; }
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <asp:Repeater runat="server" ID="Repeater1"> <ItemTemplate> <asp:Button runat="server" ID="Button1" Text="I was NOT changed" /> </ItemTemplate> </asp:Repeater> </form> </body> </html>
ASPX.CS:
using System; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(Object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("column")); DataRow dr = null; for (Int32 i = 0; i < 10; i++) { dr = dt.NewRow(); dr["column"] = ""; dt.Rows.Add(dr); } this.Repeater1.DataSource = dt; this.Repeater1.DataBind(); foreach (RepeaterItem ri in this.Repeater1.Controls) { foreach (Control c in ri.Controls) { Button b = new Button(); try { b = (Button)c; } catch (Exception exc) { } b.Text = "I was found and changed"; } } } }
或者我自己的代码的变体,仅更改ASPX.CS:
using System; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; using System.Collections.Generic; public partial class _Default : System.Web.UI.Page { protected void Page_Load(Object sender, EventArgs e) { #region Fill Repeater1 with some dummy data DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("column")); DataRow dr = null; for (Int32 i = 0; i < 10; i++) { dr = dt.NewRow(); dr["column"] = ""; dt.Rows.Add(dr); } this.Repeater1.DataSource = dt; this.Repeater1.DataBind(); #endregion foreach (Button b in this.FindButtonsInRepeater(ref this.Repeater1)) { b.Text = "I was found and changed"; } } private List<Button> FindButtonsInRepeater(ref Repeater repeater) { List<Button> buttonsFound = new List<Button>(); foreach (RepeaterItem ri in repeater.Controls) { foreach (Control c in ri.Controls) { try { buttonsFound.Add((Button)c); } catch (Exception exc) { } } } return buttonsFound; } }