【问题标题】:Dynamically-created table loses rows on postback动态创建的表在回发时丢失行
【发布时间】:2019-11-02 13:41:44
【问题描述】:

我有一个表,其中只有一个由 5 列(单元格)组成的 TableHeaderRow。第一个单元格/列有一个复选框,我希望它成为代码隐藏中动态创建的行的“全选”。

表:

<asp:Table runat="server" ID="tblReports" CssClass="table table-condensed table-bordered">
                    <asp:TableHeaderRow>
                        <asp:TableHeaderCell CssClass="text-center">
                            <asp:UpdatePanel runat="server" ID="updatePanelCheckAllReports" ChildrenAsTriggers="true">
                                <ContentTemplate>
                                    <asp:CheckBox runat="server" ID="cbCheckAllReports" OnCheckedChanged="cb_CheckedChanged" AutoPostBack="true" />
                                </ContentTemplate>
                            </asp:UpdatePanel>
                        </asp:TableHeaderCell>
                        <asp:TableHeaderCell>
                        </asp:TableHeaderCell>
                        <asp:TableHeaderCell CssClass="text-center">
                                <h4>Reports</h4>
                        </asp:TableHeaderCell>
                        <asp:TableHeaderCell CssClass="text-center">
                                <h5>Oldest<br />ONLINE<br />ArchiveDate</h5>
                        </asp:TableHeaderCell>
                        <asp:TableHeaderCell CssClass="text-center">
                                <h5>Newest<br />OFFLINE<br />ArchiveDate</h5>
                        </asp:TableHeaderCell>
                    </asp:TableHeaderRow>
                </asp:Table>

Build_Reports_Table:

using (DBContext dc = new DBContext())
            {
                List<string> reports = dc.Database.SqlQuery<string>("SELECT name FROM sys.tables WHERE name like 'report%history' ORDER BY name").ToList();

                foreach (string report in reports)
                {
                    TableRow tableRow = new TableRow();
                    TableCell tableCellCheckBox = new TableCell();
                    TableCell tableCellLabel = new TableCell();
                    CheckBox checkBox = new CheckBox();
                    Label label = new Label();
                    checkBox.ID = "cb" + report;
                    tableCellCheckBox.Controls.Add(checkBox);
                    label.Text = report;
                    tableCellLabel.Controls.Add(label);
                    tableRow.Cells.Add(new TableCell());
                    tableRow.Cells.Add(tableCellCheckBox);
                    tableRow.Cells.Add(tableCellLabel);
                    tableRow.Cells.Add(new TableCell());
                    tableRow.Cells.Add(new TableCell());
                    tblReports.Rows.Add(tableRow);
                }
            }

cb_CheckedChanged 方法:

CheckBox checkBox = (CheckBox)sender;
            if (checkBox.ID == "cbCheckAllReports")
            {
                if (checkBox.Checked)
                {
                    foreach (TableRow tableRow in tblReports.Rows)
                    {
                        if (!(tableRow is TableHeaderRow) && !(tableRow is TableFooterRow))
                        {
                            CheckBox cbReport = (CheckBox)tableRow.Cells[1].Controls[1];
                            cbReport.Checked = true;
                        }
                    }
                }
                else
                {
                    foreach (TableRow tableRow in tblReports.Rows)
                    {
                        if (!(tableRow is TableHeaderRow) && !(tableRow is TableFooterRow))
                        {
                            CheckBox cbReport = (CheckBox)tableRow.Cells[1].Controls[1];
                            cbReport.Checked = false;
                        }
                    }
                }
            }

在 Page_Load 中运行 Build_Reports_Table 后,表格构建良好。

问题是,cb_CheckedChanged 触发“全选”复选框必须有AutoPostBack = true。使用该设置,当页面回发时,表会丢失所有动态添加的行,而表中只有静态 TableHeaderRow。

我尝试在桌子周围放置一个 UpdatePanel,但没有成功。因此,我将 UpdatePanel 放在 Checkbox 控件周围,但没有奏效。两次我调试cb_CheckedChanged 函数 tblReports.Rows 时只有静态 TableHeaderRow 行。

更新

母版页上有一个ScriptManager

【问题讨论】:

    标签: c# asp.net checkbox updatepanel postback


    【解决方案1】:

    尝试:仅在第一次加载时构建,而不是在回发时构建。

    if(!Page.IsPostBack)
    {
        // build reports table.
    }
    

    【讨论】:

      【解决方案2】:

      我最终用 jQuery 解决了它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多