在ASP.Net中动态呈现时,CheckBoxList项和TableRows有什么区别?
本文关键字:TableRows 项和 CheckBoxList 什么 区别 Net ASP 动态 | 更新日期: 2023-09-27 17:49:15
我正在努力稍微改变ASP中页面的功能。网的网站。在原始页面中,有一个复选框列表写入页面,没有硬编码项。
相反,在初始呈现时,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 + ","; }
happy遍历复选框列表中的动态绑定列表项并检索选中的值。我尝试做同样的事情,在页面上放置一个空表,然后动态创建行:
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(), "", "");
}
}
}
除了调试标签检查高兴地告诉我只有一行,它是硬编码的标题行。所以基本上不读取其他行,因为当它读取它们时,页面似乎不相信它们的存在。
那么为什么它不能与表一起工作呢?或者,如果它不能与表一起工作,因为通常的原因,比如渲染,生命周期等的动态控制不能工作,为什么它与复选框列表一起工作?
如果您想从中获取值,则必须在每次回发时重新创建动态控件。你应该在CreateChildControls()方法中这样做