Функциональность GetElementsByTagName со страницы кода программной части .NET?

Я пишу веб-страницу на C# .NET. В javascript есть функция GetElementsByTagName ... это хорошо для javascript, вызываемого со страницы .aspx. Мой вопрос: могу ли я получить такую ​​функциональность из кода программной части C#?

-

Сценарий для любопытных: я использовал asp: Repeater для создания множества кнопок, а теперь я, по сути, пытаюсь создать кнопку, которая нажимала бы их все. Я попытался сохранить все кнопки в списке по мере их создания, но список очищается при каждой обратной передаче, поэтому я подумал, что могу попробовать описанный выше метод.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 810
7

Ответы 7

FindControl () или перебрать элементы управления на странице ...

For each ctl as Control in Me.Controls
  If ctl.Name = whatYouWant Then
    do stuff
Next 'ctl

- Если вы создаете элементы управления, вы должны установить их идентификаторы

Dim ctl as New Control()
ctl.ID = "blah1"

так далее...

извините за vb. Я могу перевести если нужно

StingyJack 24.09.2008 23:41

FindControl (строка) не работает, потому что я не знаю их идентификаторы. VB имеет смысл, но я не знаю, что бы я использовал в C# в леях этого Me.Controls.

Aaron 24.09.2008 23:44

this.Controls - это эквивалент C#

Mark Brackett 25.09.2008 02:59

Что ж, вы можете найти элементы управления с помощью метода FindControl страницы, но элементы Repeater имеют имена, созданные с помощью .net.

Кроме того, если вы действительно хотите, вы можете сохранить список кнопок в ViewState своей страницы (или, возможно, список их имен).

Я попытался сохранить List <Button> в ViewState, но получилось некрасиво - вещь разбилась, сказав, что не может сериализовать кнопки. List <String> может работать, но я попробую, если это не сработает. Спасибо.

Aaron 24.09.2008 23:45

Всякий раз, когда вы выполняете какую-либо обратную передачу, все воссоздается, включая элементы управления привязкой данных.

Если вашего списка больше нет, то исчезнут и кнопки управления. Если, конечно, вы не воссоздали их, и в этом случае вам также следовало воссоздать список.

К сожалению, последовательность выглядит так: -Создать кнопки / Список -Нажмите кнопку «Новая», которая нажимает все остальные кнопки: -Это вызывает обратную передачу, поэтому экран становится белым, и сразу после того, как он пытается развернуть кнопки ... которые не существовать. Я мог делать это неправильно, не знаю.

Aaron 24.09.2008 23:47

Похоже, ваша проблема связана с дизайном.

devlord 24.09.2008 23:52

Попробуй это:

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

HTH ...

вы пропустите кнопки, которые находятся в контейнерах, например, панели и прочее с этим методом. Я бы использовал рекурсивную функцию.

stephenbayer 24.09.2008 23:56

Но он сказал, что это в ретрансляторе. Рекурсия была бы излишней, не так ли?

devlord 25.09.2008 00:35

Я не знаю точно, что вы имеете в виду, говоря "щелкают их все". Но как этот следующий код будет работать для вас? Не знаю, не тестировал ...

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 или что-то еще в этой строке ... Мне на самом деле больше нравятся методы расширения, они меня растут.

stephenbayer 24.09.2008 23:54

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 = "Меня нашли и изменили";

Mark Brackett 25.09.2008 01:03

Или вариант моего собственного кода, изменяющий только 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 нет необходимости.

Mark Brackett 25.09.2008 01:04

Другие вопросы по теме