Я работаю над небольшим изменением функциональности страницы на веб-сайте ASP.Net. На исходной странице был список флажков, написанный на странице без жестко запрограммированных элементов.
Вместо этого при начальном рендеринге cbl привязывается к результатам запроса следующим образом:
sSQL = "select query here";
using (SqlConnection dbcon = new DataAccess().OpenDb())
{
using (SqlDataReader dr = new SqlCommand(sSQL, dbcon).ExecuteReader())
{
cbl.DataTextField = "description";
cbl.DataValueField = "productid";
cbl.DataSource = dr;
cbl.DataBind();
}
dbcon.Close();
}
При постбэке следующий код:
foreach (ListItem li in cbl.Items) { if (li.Selected) rtnQS += li.Value + ","; }
С удовольствием просматривает элементы динамического списка с привязкой к данным в списке флажков и извлекает проверенные значения. Я попытался сделать то же самое, поместив на страницу пустую таблицу, а затем динамически создав строки:
sSQL = "similar select query here";
using (SqlConnection dbcon = new DataAccess().OpenDb())
{
using (SqlDataReader dr = new SqlCommand(sSQL, dbcon).ExecuteReader())
{
while (dr.Read())
{
TableRow tr = new TableRow();
TableCell tc = new TableCell();
CheckBox chk = new CheckBox();
chk.Text = dr["description"].ToString();
chk.InputAttributes.Add("id", dr["id"].ToString());
chk.Checked = true;
tc.Controls.Add(chk);
TableCell tc2 = new TableCell();
if (Convert.ToBoolean(dr["controlcondition"]))
{
CheckBoxList cbl_sub = new CheckBoxList();
cbl_sub.Attributes.Add("for", dr["id"].ToString());
sSQL = "subquery";
using (SqlConnection newcon = new DataAccess().OpenDb())
{
using (SqlDataReader br = new SqlCommand(sSQL, newcon).ExecuteReader())
{
cbl_block.DataTextField = "subname";
cbl_block.DataValueField = "subid";
cbl_block.DataSource = br;
cbl_block.DataBind();
}
}
tc2.Controls.Add(cbl_sub);
}
else
{
TextBox txtSub = new TextBox();
txtSub.Attributes.Add("for", dr["id"].ToString());
tc2.Controls.Add(txtSub);
}
tr.Cells.Add(tc);
tr.Cells.Add(tc2);
tblDispatchOpt.Rows.Add(tr);
}
}
dbcon.Close();
}
Единственная проблема заключается в том, что когда итератор приходит к таблице, он читает только жестко закодированную строку заголовка. (Таблица прекрасно отображается со всеми правильными атрибутами на исходной странице.)
Вот фрагмент кода, который пытается прочитать строки таблицы:
foreach (TableRow row in tblDispatchOpt.Rows)
{
TableCell cell = row.Cells[0];
++counter;
foreach (Control c in cell.Controls)
{
if (c is CheckBox)
{
CheckBox cb = (CheckBox)c;
if (cb.Checked && cb.Attributes["ttid"] != null) dtTTInfo.Rows.Add(cb.Attributes["ttid"].ToString(), "", "");
}
}
}
За исключением того, что проверка метки отладки с радостью сообщает мне, что есть только одна строка, и это жестко закодированная строка заголовка. Поэтому, по сути, не читает другие строки, поскольку кажется, что страница не верит, что они существуют, когда дело доходит до их чтения.
Так почему это не работает с таблицей? Или, если это не работает с таблицей по обычной причине, что вещи не работают с динамическими элементами управления для обратных передач, например. рендеринг, жизненный цикл и т. д., почему это работает со списком флажков?