这是我的代码 -
dtDetails = getDataSet();
foreach (DataRow dr in dtDetails.Rows) {
int rowID = 1;
HtmlTableRow row = new HtmlTableRow();
{
HtmlTableCell cell = new HtmlTableCell();
TextBox tb = new TextBox();
tb.ID = "tbJanuary" + rowID;
tb.Text = dr["Jan"].ToString();
cell.Controls.Add(tb);
row.Cells.Add(cell);
}
rowID ++;
}
当这最初运行时,我在文本框中得到正确的值。
但是,当我通过按钮点击页面更新数据库中的值时,会导致预期的PostBack。当我回到这个循环时,dr [“Jan”]。ToString()具有更改的新正确值基础,但是oage上的文本框永远不会更新。
如果我将代码更改为 -
dtDetails = getDataSet();
foreach (DataRow dr in dtDetails.Rows) {
int rowID = 1;
HtmlTableRow row = new HtmlTableRow();
{
HtmlTableCell cell = new HtmlTableCell();
Label lbl = new Label();
lbl.ID = "lblJanuary" + rowID;
lbl.Text = dr["Jan"].ToString();
cell.Controls.Add(lbl);
row.Cells.Add(cell);
}
rowID ++;
}
标签包含正确的新值。
没有显示正确值的文本框是什么?
答案 0 :(得分:0)
您永远不会递增用于生成int
ID的rowID
变量Label
。
所以我认为这导致ViewState
无法正常工作。
试试这个:
foreach (DataRow dr in dtDetails.Rows) {
int rowID = 1;
HtmlTableRow row = new HtmlTableRow();
{
HtmlTableCell cell = new HtmlTableCell();
TextBox tb = new TextBox();
tb.ID = "tbJanuary" + rowID++;
tb.Text = dr["Jan"].ToString();
cell.Controls.Add(tb);
row.Cells.Add(cell);
}
}
Apat,我强烈建议使用GridView或其他DataBound control
,因为否则你需要使用与以前相同的ID在回发上重新创建每个动态创建的控件。
答案 1 :(得分:0)
ASP.NET 2.0进行了一次设计更改,Textbox
控件标记为ReadOnly
属性为true
,会忽略客户端更改,并且会在回发时丢失相同的内容。如果你想要的功能,而不是使用属性选项使文本框只读。添加代码:
TextBox1.Attributes.Add("readonly", "readonly");
在代码隐藏中,仍会使文本框成为只读文件,并且每次回发后也会保留该值
所以,你的代码应该是这样的:
dtDetails = getDataSet();
foreach (DataRow dr in dtDetails.Rows) {
int rowID = 1;
HtmlTableRow row = new HtmlTableRow();
{
HtmlTableCell cell = new HtmlTableCell();
TextBox tb = new TextBox();
tb.ID = "tbJanuary" + rowID;
tb.Text = dr["Jan"].ToString();
tb .Attributes.Add("readonly", "readonly");
cell.Controls.Add(tb);
row.Cells.Add(cell);
}
}