[英]Why does my HTML table row loses view state after dynamically adding rows to this table?
我有一个简单的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
在回发后丢失其文本? 我认为这不应该发生,因为它是固定控件。 当我注释表时,它不会丢失其文本table.Rows.Insert( rowIdx++, tr );
线路输出。
先感谢您!
标签值丢失的原因是因为它是表的一部分,在OnLoad
事件中向该表添加了新行。 在生命周期的这一点上,不再跟踪动态添加的控件。 该表将整体跟踪其视图状态,包括有关标签的一些信息。 如果标签在桌子外面,那不会有问题。 请参见MSDN:了解ASP.NET视图状态 。
将代码移至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 );
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.