Как установить значение 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 - но использую встроенные инструменты.
Что приятно, теперь я могу передумать и сказать «рендеринг», как сказать «две вещи», проходящие по странице - что-то вроде «карточного просмотра».
Итак, мы написали ОДНО для группы.
Итак, мы написали ОДНУ вещь для таблицы.
Затем мы повторяли снова и снова.