Почему моя строка таблицы HTML теряет состояние просмотра после динамического добавления строк в эту таблицу? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть простая 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 );.

Заранее спасибо!

1 Ответ

0 голосов
/ 14 июня 2018

Причина, по которой значение метки теряется, заключается в том, что она является частью таблицы, в которую добавляются новые строки в событии 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 );
    } 
}
...