Как установить значение HtmlTableCell динамически в веб-формах ASP.NET?

У меня есть файл aspx, и его небольшая часть кода

      <table class="table table-responsive-sm table-bordered table-hover" runat="server" style="align-content:center;">
   <tr><th>Header1</th></tr>
   <tr><td id="name1"></td></tr>
</table>

<table class="table table-responsive-sm table-bordered table-hover" runat="server" style="align-content:center;">
   <tr><th>Header2</th></tr>
   <tr><td id="name2"></td></tr>
</table>

<%-- Similary there are manly table lets say upto 20 --%>

<table class="table table-responsive-sm table-bordered table-hover" runat="server" style="align-content:center;">
   <tr><th>Header20</th></tr>
   <tr><td id="name20"></td></tr>
</table>

его код похож на установку значения каждого td:

      public void Page_Load()
{
   name1.InnerText = "1"
   name2.InnerTex = "2"
   //similary all td is assigned like this
   name20.InnerText = "20"
}

Это работает нормально, но в будущем может появиться много таблиц, скажем, 100. Тогда мне нужно установить все значения, как в приведенном выше коде. Есть ли другой способ?

Я пробовал использовать следующий код:

      for(int i=1; i<21; i++)
{
   tableId = (HtmlTableCell)this.Page.Master.FindControl("name" + i.ToString());
   tableId = (HtmlTableCell)this.Page.FindControl("name" + i.ToString());
   tableId = (HtmlTableCell)this.FindControl("name" + i.ToString());

   tableId.InnerText = i.toString();

}

но значение tableId всегда равно нулю.

Как я могу это решить?

1 ответ

Решение

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

Я не думаю, что имеет смысл указывать здесь 10 или даже 20 таблиц.

Давайте подумаем над этим вопросом:

Мне нужно 20 целочисленных переменных.

Да, я делаю это:

      int x1;
int x2;
int x3;
... and so on for 20 variables?

Нет, мы этого не делаем. Мы бы сделали это:

      int[20] x;

Теперь я могу использовать цикл for, даже foreach или что-то еще.

Та же проблема относится и к вашей проблеме.

У вас есть группа или вещь, которых вам нужно «много».

Как предлагают другие в комментариях, повторитель (или listview, datalist, gridview) - это элементы управления или «система», которая позволяет вам с большой легкостью «повторять» что-то.

Итак, мне нравится, что «массиву» может понадобиться 2 или 50 таких «штучек».

Нет смысла пытаться написать код для записи html или какой-то цикл для создания этой повторяющейся вещи. Мы можем сделать это в коде.

Итак, давайте воспользуемся репитером.

Скажите так:

           <asp:Repeater ID="Repeater1" runat="server" 
            OnItemDataBound="Repeater1_ItemDataBound">
            <ItemTemplate>

               <asp:Label id="MyHeader" runat="server" 
                 Text='<%# Eval("TableGroup") %>'
                 Font-Size="X-Large" >
            </asp:Label>

            </ItemTemplate>
        </asp:Repeater>

Очень простой. Итак, мы хотим 2 группы таблиц или 60 из них?

Наш код для загрузки вышеуказанного может выглядеть так:

Мы просто создадим список того, «что» мы хотим повторить.

Итак, давайте создадим что-нибудь с табличной структурой. Фактически, давайте создадим таблицу .net !!!

Скажем, мы помещаем кнопку наверху, а затем этот код:

          protected void Button1_Click(object sender, EventArgs e)
    {

        DataTable TblList = new DataTable();
        TblList.Columns.Add("TableGroup");

        for (int i = 1;i<=3;i++)
        {
            DataRow OneRow = TblList.NewRow();
            OneRow["TableGroup"] = "Table " + i;
            TblList.Rows.Add(OneRow);
        }

        Repeater1.DataSource = TblList;
        Repeater1.DataBind();
    }

Обратите внимание на то, насколько чисто, насколько просто, и КАК нам не пришлось «пробовать» писать код для вывода разметки. И хотя цикл for / равен 3, мы могли бы сделать его 30.

Теперь наш результат такой:

Итак, обратите внимание, как то, что мы «сделали», повторяется 3 раза. Но с таким же успехом можно повторить 20 или 100 раз.

Теперь внутри каждого репитера нам нужен стол. И снова мы «могли» использовать таблицу. но если вы подумаете об этом, таблице нужен заголовок, затем строки, и для каждой строки нам нужно будет определить столбец.

Еще раз, это довольно большая работа. Итак, давайте использовать элемент управления, который может отображать + визуализировать ВСЕ таблицу за один раз!

Я предлагаю сетку. Итак, теперь в указанном выше повторителе давайте перейдем к представлению сетки.

И мы даже используем указанные вами классы начальной загрузки (так как они выглядят ОЧЕНЬ красиво - молодцы с вашей стороны !!!!).

Хорошо, теперь наш репитер становится таким:

              <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
            <ItemTemplate>

               <asp:Label id="MyHeader" runat="server" 
                 Text='<%# Eval("TableGroup") %>'
                 Font-Size="X-Large" >
            </asp:Label>

             <asp:GridView ID="GTable" runat="server"
                 class="table table-responsive-sm table-bordered table-hover" Width="20%">
             </asp:GridView>

            </ItemTemplate>
        </asp:Repeater>
        <br />

Обратите внимание, НАСКОЛЬКО у нас пока мало разметки. И Gridview - действительно просто хорошая таблица, но с ней меньше работы и хлопот.

Итак, теперь нам нужно добавить код для заполнения таблицы для каждой группы.

Оказывается, для нас есть ПРИЯТНОЕ событие, которое срабатывает при каждом создании группы !!!!

Итак, давайте просто приготовим таблицу - назовите имя пользователя и возраст.

Итак, мы используем событие ItemDataBound. Это событие срабатывает для каждой группы !!!

Итак, 3 группы или 60 - значения не имеет.

Итак, мы можем закодировать таблицу, а затем ЗАФИЛИРОВАТЬ ее прямо в нашу сетку.

этот код:

          protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {

        // each new group/thing, lets fill the grid/table
        GridView gV = (GridView)e.Item.FindControl("GTable");

        DataTable TestTable = new DataTable();

        TestTable.Columns.Add("Name");
        TestTable.Columns.Add("Age");

        int TableGroup = e.Item.ItemIndex + 1;
        // add 3 rows
        for (int i = 1; i <= 3; i++)
        {
            DataRow OneRow = TestTable.NewRow();
            OneRow["Name"] = "Group " + TableGroup + " Name " + i;
            OneRow["Age"] = i * 15;
            TestTable.Rows.Add(OneRow);
        }

        gV.DataSource = TestTable;
        gV.DataBind();

    }

Еще раз обратите внимание:

Мы пишем код ТОЛЬКО для ОДНОЙ вещи. Может повторяться снова и снова, но нам все равно. Отметьте также, насколько «легко» думать таким образом.

Теперь я включил "индекс" повторителя, чтобы, по крайней мере, добавить несколько разных строк для каждой таблицы.

Еще раз обратите внимание, как приятно создавать эту таблицу. Он дает нам заголовки, строки, столбцы

  • все в красивой простой структуре.

И наш результат теперь такой:

Это не круто что ли?

Итак, теперь с автоматическим рендерингом выше.

Что ты хочешь делать? Взять конкретный репитер? Может быть, добавить кнопку в каждую строку сетки? Мы можем сделать это, сделать это один раз, и это повторится для нас.

но вы можете сказать вторую строку следующим образом:

         protected void Button2_Click(object sender, EventArgs e)
    {
        // get 2nd repeater (0 based, so get #1)

        int RepeatNum = 1;

        RepeaterItem MyRepItem = Repeater1.Items[RepeatNum];

        // ok, got the item, get <h2> header item
        // 
        Label MyHead = (Label)MyRepItem.FindControl("MyHeader");
        Debug.Print(MyHead.Text);

        // now get our grid
        GridView GV = (GridView)MyRepItem.FindControl("GTable");

        foreach (GridViewRow gRow in GV.Rows)
        {
            Debug.Print("Name = " + gRow.Cells[0].Text);
            Debug.Print("Age  = " + gRow.Cells[1].Text);
        }

окно вывода:

      Table 2
Name = Group 2 Name 1
Age  = 15
Name = Group 2 Name 2
Age  = 30
Name = Group 2 Name 3
Age  = 45

Так что думайте группами. У меня ОЧЕНЬ мало разметки. И ЛУЧШЕ то, как код позади не пытается выплюнуть ZILLION "tr" "th" "table" и т. Д. Я не пишу весь этот HTML - но использую встроенные инструменты.

Что приятно, теперь я могу передумать и сказать «рендеринг», как сказать «две вещи», проходящие по странице - что-то вроде «карточного просмотра».

Итак, мы написали ОДНО для группы.

Итак, мы написали ОДНУ вещь для таблицы.

Затем мы повторяли снова и снова.

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