从会话中检索的表未在页面中显示

时间:2019-01-29 15:27:20

标签: c# asp.net session-state

我在设计中定义了一个asp:table,如下所示:

this.BaseTariff.provAufwand.SO

这是一个4行9列的表,后面动态填充了Code,并成功显示在页面上。之后,在同一页面上单击另一个按钮:

    <div class="scroll" style="overflow:visible">
      <asp:Table ID="tblMainReport" runat="server" CellPadding="2" 
           CellSpacing="2" HorizontalAlign="Center" GridLines="Both" Width="100%">
      </asp:Table>
    </div>

此方法可为Gridview动态创建数据。 Gridview消失,但是表(tblMainReport)消失了。原因似乎是表控件没有在页面之间保持为无状态。

所以我将表保存在会话中,如下所示:

    <div>
       <asp:Button ID="btnDetailReport" runat="server" Text="Show Detail" 
            OnClick="GetDetailReconciliation" />
    </div>

然后在按钮Onclick方法(GetDetailReconciliation)中,我从会话中检索表为:

System.Web.UI.WebControls.Table ObjTbl = new System.Web.UI.WebControls.Table();
ObjTbl = tblMainReport;
Session["tblMyMainReport"] = ObjTbl;

变量i和s显示正确的检索值。但是,tblMainReport仍未显示在页面中。

有人知道为什么即使从会话中成功检索到该表也不会显示吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,ASP.NET Web窗体中的System.Web.UI.WebControls.Table类不会保留对您在背后的代码中所做的任何更改,除非您花了一些精力在每次回发中恢复其状态

为了尽可能接近您目前所做的事情,您可以执行以下操作:

将tblMainReport呈现在asp:PlaceHolder中:

<div class="scroll" style="overflow: visible">
    <asp:PlaceHolder runat="server" ID="tblMainReportPlaceHolder">
        <asp:Table ID="tblMainReport" runat="server" CellPadding="2"
            CellSpacing="2" HorizontalAlign="Center" GridLines="Both" Width="100%">
        </asp:Table>
    </asp:PlaceHolder>
</div>

然后在您的GetDetailReconciliation方法中,将保​​存的tblMainReport会话实例添加到占位符:

if (Session["tblMyMainReport"] != null)
{
    tblMainReportPlaceHolder.Controls.Clear();
    tblMainReportPlaceHolder.Controls.Add((Control)Session["tblMyMainReport"]);
}

这应该以允许Web窗体呈现它的方式恢复保存的表实例。

下面我将提供这种方法的一个通用示例:

标记

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebSandbox.WebForm1" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button Text="Generate Table" runat="server" ID="generateTableButton" OnClick="generateTableButton_Click" />
            <asp:Button Text="Restore Table" runat="server" ID="restoreTableButton" OnClick="restoreTableButton_Click" />

            <asp:PlaceHolder runat="server" ID="tblMainReportPlaceHolder">
                <asp:Table ID="tblMainReport" runat="server" CellPadding="2"
                    CellSpacing="2" HorizontalAlign="Center" GridLines="Both" Width="100%">
                </asp:Table>
            </asp:PlaceHolder>
        </div>
    </form>
</body>
</html>

背后的代码

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebSandbox
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void generateTableButton_Click(object sender, EventArgs e)
        {
            var cell1 = new TableCell
            {
                Text = "Cell 1"
            };

            var cell2 = new TableCell
            {
                Text = "Cell 2"
            };

            var row = new TableRow();
            row.Cells.Add(cell1);
            row.Cells.Add(cell2);

            tblMainReport.Rows.Add(row);

            Session["tblMyMainReport"] = tblMainReport;
        }

        protected void restoreTableButton_Click(object sender, EventArgs e)
        {
            tblMainReportPlaceHolder.Controls.Clear();
            tblMainReportPlaceHolder.Controls.Add((Control)Session["tblMyMainReport"]);
        }
    }
}

或者,每次需要渲染表时,您都可以调用用于构建表的逻辑。