以下是aspx中的控件。
<asp:UpdatePanel runat="server" ID="panel" ChildrenAsTriggers="false" UpdateMode="Conditional">
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="holder"></asp:PlaceHolder>
<asp:Button runat="server" ID="bt" Text="Add" onclick="AddTxt" />
<asp:Button runat="server" ID="btn1" Text="Refresh" onclick="btn1_Click" />
</ContentTemplate>
单击按钮Add时,我正在创建一个动态表。下面是C#代码
protected void AddTxt(object sender, EventArgs e)
{
int tblRows = 3;
int tblCols = 3;
Table tbl = new Table();
for (int i = 0; i < tblRows; i++)
{
TableRow tr = new TableRow();
for (int j = 0; j < tblCols; j++)
{
TableCell tc = new TableCell();
TextBox txtBox = new TextBox();
txtBox.ID = "txt" + i.ToString() + j.ToString();
//txtBox.TextChanged += new EventHandler(txt_TextChanged);
tc.Controls.Add(txtBox);
tr.Cells.Add(tc);
if (Session["ctls"] != null)
{
Session["ctls"] += ";t";
}
else
{
Session["ctls"] = "t";
}
}
tbl.Rows.Add(tr);
}
holder.Controls.Add(tbl);
panel.Update();
}
单击“刷新”按钮发生部分回发时,我无法获取用户在文本框内更新的值。控件将包含空文本。
protected void Page_Load(object sender, EventArgs e)
{
foreach (Control c in holder.Controls)
{
if (c is TextBox)
{
}
}
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (Session["ctls"] != null)
{
string[] ctls = Session["ctls"].ToString().Split(';');
foreach (string ctlType in ctls)
{
if (string.Compare(ctlType, "t") == 0)
{
holder.Controls.Add(new TextBox());
}
}
}
}
任何人都可以帮助/给我一个提示如何解决更新面板内的动态控件。
答案 0 :(得分:2)
问题在于,当您在AddTxt
方法中动态创建控件(表,行,单元格,文本框)时,您要为文本框分配ID
值,但是当您动态创建OnInit
事件中的控件,您根本不会创建ID
值,因此ViewState
无法连接到用户键入的内容,从而丢失。
如果您创建的文本框具有与其他动态控件创建逻辑中相同的ID
值(txtBox.ID = "txt" + i.ToString() + j.ToString();
),那么您的ViewState
值将被保留并正确应用于文本框在OnInit
中重新创建它。
注意:ViewState
严重依赖于服务器控件的ID
值,以便在完全回发和部分回发之间正确关联控件的值。
答案 1 :(得分:2)
以下是更正后的代码,现在效果很好。我在这里添加这个,因为它可能会帮助一些人。
protected void AddTxt(object sender, EventArgs e)
{
add();
}
private void add()
{
int tblRows = 3;
int tblCols = 3;
Table tbl = new Table();
for (int i = 0; i < tblRows; i++)
{
TableRow tr = new TableRow();
for (int j = 0; j < tblCols; j++)
{
TableCell tc = new TableCell();
TextBox txtBox = new TextBox();
txtBox.ID = "txt" + i.ToString() + j.ToString();
//txtBox.TextChanged += new EventHandler(txt_TextChanged);
tc.Controls.Add(txtBox);
tr.Cells.Add(tc);
}
tbl.Rows.Add(tr);
}
holder.Controls.Add(tbl);
if (Session["ctls"] != null)
{
Session["ctls"] += ";t";
}
else
{
Session["ctls"] = "t";
}
panel.Update();
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (Session["ctls"] != null)
{
string[] ctls = Session["ctls"].ToString().Split(';');
foreach (string ctlType in ctls)
{
if (string.Compare(ctlType, "t") == 0)
{
add();
}
}
}
}