PostBack все еще теряет данные, несмотря на то, что контроль находится вне проверки IsPostBack - PullRequest
0 голосов
/ 28 июня 2019

HTML

<div class="row">
    <div class="col-xs-2">
        <asp:Panel runat="server" ID="pnlContainer">
            <asp:Table runat="server" ID="tblMyTable" ClientIDMode="Static" CssClass="table table-condensed tale-bordered">
                <asp:TableHeaderRow>
                    <asp:TableHeaderCell ColumnSpan="2">
                        <h4>Header Words</h4>
                    </asp:TableHeaderCell>
                </asp:TableHeaderRow>
                **TableRows created dynamically and contain a Checkbox**
            </asp:Table>
        </asp:Panel>
    </div>
</div>
**Other HTML Markup**
<asp:Button runat="server" ID="btnClear" Text="Clear" OnClick="btnClear_Click" />

Page_Load

if (!IsPostBack)
{
    Build_Table();
    Session["Table"] = tblMyTable;
}
if (tblMyTable != null)
{
    pnlContainer.Controls.Remove(tblMyTable);
}
pnlContainer.Controls.Add((Table)Session["Table"]);

btnClear_Click

foreach (TableRow tableRow in tblMyTable.Rows)
{
    **more code**
}

У меня есть страница, которая теряет данные в своем PostBack, несмотря на загружаемые элементы управленияна каждом Page_Load.У меня есть asp:Panel, который содержит asp:Table.Таблица содержит только строку заголовка, поскольку строки строятся динамически в Page_Load с помощью метода Build_Table(), когда !IsPostBack.Метод Build_Table() отлично создает таблицу.Затем мы сохраняем таблицу в переменной Session с именем Table.За пределами !IsPostBack я удаляю таблицу из элемента управления Panel, потому что идентификаторы следующей строки будут конфликтовать (я знаю, чтобы избежать этого, мне просто нужно создать всю таблицу в методе Build_Table()).Затем я добавляю переменную Table-castted Session в Panel.До этого момента все работало нормально.Таблица корректно отображается на странице.

Проблема заключается в том, что, когда я нажимаю кнопку «Очистить» на странице, код переходит в цикле по каждой строке в таблице и снимает флажок в каждой строке.Во время отладки он говорит, что таблица имеет только 1 строку (строка статического заголовка, которую я имею в разметке HTML).В btnClear_Click я даже добавил Table test = (Table)Session["Table"];, чтобы убедиться, что переменная Session верна, и, как и ожидалось, возвращает полную таблицу.

Я всегда борюсь с PostBacks, поэтому мой вопрос, если Session ["Table"]Подтверждено, что он содержит всю таблицу как задумано, а переменная Session приведена и добавлена ​​в контейнер за пределами !IsPostBack, почему тогда таблица пуста в первой строке метода btnClear_Click?

...