我有一个像这样的简单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 );
行时,它不会丢失文本。
提前谢谢!
答案 0 :(得分:0)
标签值丢失的原因是因为它是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 );
}
}