我有一个简单的HTML表,如下所示:
<table id="table" runat="server">
<tr>
<td>
<asp:Label runat="server" Text="Column1" />
</td>
</tr>
<tr id="tr_someId" runat="server">
<td>
<asp:Label ID="lb_someId" runat="server" />
</td>
</tr>
</table>
对于每个请求,我在 (rowIdx = 1
)之间添加动态行现有行,如下所示:
protected override void OnLoad( EventArgs e )
{
base.OnLoad( e );
if( !IsPostBack )
{
lb_someId.Text = "Some text";
}
int rowIdx = 1;
foreach( ISomething something in GetSomethings() )
{
HtmlTableRow tr = new HtmlTableRow();
tr.Cells.Add( CreateLabelCell( something ) );
table.Rows.Insert( rowIdx++, tr );
}
}
现在,我想知道为什么我的lb_someId-Label
在PostBack上丢失了它的文本?我认为这不应该发生,因为这是一个固定的控制。当我注释掉table.Rows.Insert( rowIdx++, tr );
行时,它不会丢失文本。
提前谢谢你!
发布于 2018-06-14 05:22:08
标签的值丢失的原因是因为它是在OnLoad
事件中添加新行的表的一部分。在生命周期的这一点上,动态添加的控件不再被跟踪。该表作为一个整体跟踪其视图状态,包括有关标签的一些信息。如果标签在表之外,就不会有问题。参见MSDN: Understanding ASP.NET View State。
将代码移动到OnInit
。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if( !IsPostBack )
{
lb_someId.Text = "Some text";
}
int rowIdx = 1;
foreach( ISomething something in GetSomethings() )
{
HtmlTableRow tr = new HtmlTableRow();
tr.Cells.Add( CreateLabelCell( something ) );
table.Rows.Insert( rowIdx++, tr );
}
}
或者,只需将foreach
循环移到OnInit
即可。
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if( !IsPostBack )
{
lb_someId.Text = "Some text";
}
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
int rowIdx = 1;
foreach( ISomething something in GetSomethings() )
{
HtmlTableRow tr = new HtmlTableRow();
tr.Cells.Add( new HtmlTableCell { InnerText = something } );
table.Rows.Insert( rowIdx++, tr );
}
}
https://stackoverflow.com/questions/50799472
复制相似问题