【问题标题】:GetElementsByTagName functionality from .net code-behind page?.net 代码隐藏页面中的 GetElementsByTagName 功能?
【发布时间】:2008-09-24 19:39:24
【问题描述】:

我正在用 C# .NET 编写网页。在 javascript 中有一个名为 GetElementsByTagName 的函数...这对于从 .aspx 页面调用的 javascript 来说非常好。我的问题是,有什么方法可以从我的 C# 代码隐藏中获得这种功能?

--

那些好奇的人的场景:我使用了一个 asp:repeater 来生成很多按钮,现在我基本上是在尝试制作一个可以点击所有按钮的按钮。我尝试在创建它们时将所有按钮存储在一个列表中,但是在每次回发期间该列表都会被清除,所以我想我可以尝试上述方法。

【问题讨论】:

    标签: c# .net asp.net


    【解决方案1】:

    试试这个:

    foreach (Control ctl in myRepeater.Controls)
    { 
      if (ctl is Button)
      {
        ((Button)ctl).Click();
      }
    }
    

    HTH...

    【讨论】:

    • 你会错过容器中的按钮,比如面板和使用这种方法的东西。我会使用递归函数。
    • 但他说它在中继器中。递归将是矫枉过正,不是吗?
    【解决方案2】:

    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"
    

    等等……

    【讨论】:

    • 对不起 vb。如果需要我可以翻译
    • FindControl(string) 不起作用,因为我不知道他们的 ID。 VB 是有道理的,但我不知道我会在 C# 中使用什么来代替 Me.Controls
    • this.Controls 相当于 C#
    【解决方案3】:

    嗯,您可以使用页面的 FindControl 方法找到控件,但 Repeater 元素的名称由 .net 生成。

    顺便说一句,如果你真的想要,你可以将按钮列表存储在页面的 ViewState 中(或者可能是它们的名称列表)。

    【讨论】:

    • 我尝试将 List
    【解决方案4】:

    我不知道你所说的全部点击是什么意思。但是以下代码如何为您工作?不知道,没测试过……

    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;
    }
    

    【讨论】:

    • 更好的是,您可以在 Control 上添加一个名为 GetControlsByType 的扩展方法或其他类似的东西...我实际上更喜欢扩展方法,它们在我身上越来越多。
    【解决方案5】:

    每当您进行任何回发时,都会重新创建一切,包括您的数据绑定控件。

    如果您的列表消失了,按钮控件也会消失。当然,除非您重新创建了它们,在这种情况下,您也应该重新创建列表。

    【讨论】:

    • 不幸的是顺序是这样的:-创建按钮/列表-单击单击所有其他按钮的新按钮:-这会导致回发,因此屏幕变白,然后立即尝试展开按钮...不存在。我可能做错了,我不知道。
    • 听起来您的问题是设计问题。
    【解决方案6】:

    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";
                }
            }
        }
    }
    

    【讨论】:

    • 那个内部循环会好多更好:Button b = c as Button; if (b != null) b.Text = "我被发现并改变了";
    【解决方案7】:

    或者我自己的代码的变体,只是改变了 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;
        }
    }
    

    【讨论】:

    • 除非您更改中继器指向的对象,否则不需要 ref 参数。
    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多