Table 从未在页面中显示的会话中检索
Table retrieved from session not shown in page
我在设计中定义了一个asp:table如下图:
<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>
4行9列table动态填充Code behind,页面显示成功。然后在同一页面上单击另一个按钮:
<div>
<asp:Button ID="btnDetailReport" runat="server" Text="Show Detail"
OnClick="GetDetailReconciliation" />
</div>
此方法会为 Gridview 动态创建数据。 Gridview 被显示,但是 table (tblMainReport) 消失了。原因似乎是 table 控制在页面之间没有像无状态一样维护。
所以我在会话中保存 table 如下:
System.Web.UI.WebControls.Table ObjTbl = new System.Web.UI.WebControls.Table();
ObjTbl = tblMainReport;
Session["tblMyMainReport"] = ObjTbl;
然后在按钮 Onclick 方法 (GetDetailReconciliation) 中,我从会话中检索 table 作为:
if (Session["tblMyMainReport"] != null)
{
tblMainReport = (System.Web.UI.WebControls.Table)Session["tblMyMainReport"];
tblMainReport.Visible = true;
int i = tblMainReport.Rows.Count; string s;
if (i > 0)
s = tblMainReport.Rows[3].Cells[1].Text;
}
变量 i 和 s 显示正确的检索值。但是,tblMainReport 仍然没有显示在页面中。
有人知道为什么 table 即使从会话中成功检索也没有显示吗?
不幸的是,System.Web.UI.WebControls.Table class 中的 ASP.NET Web Forms 不会保留您从后面的代码中对其所做的任何更改,除非您付出一些努力来恢复它每个回发状态。
为了尽可能接近您目前所做的,您可以执行以下操作:
在 asp:PlaceHolder:
中渲染 tblMainReport
<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 窗体呈现它的方式恢复您保存的 table 实例。
下面我提供了这种方法的通用示例:
标记
<%@ 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"]);
}
}
}
或者,您可以在每次需要渲染时调用用于构建 table 的逻辑。
我在设计中定义了一个asp:table如下图:
<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>
4行9列table动态填充Code behind,页面显示成功。然后在同一页面上单击另一个按钮:
<div>
<asp:Button ID="btnDetailReport" runat="server" Text="Show Detail"
OnClick="GetDetailReconciliation" />
</div>
此方法会为 Gridview 动态创建数据。 Gridview 被显示,但是 table (tblMainReport) 消失了。原因似乎是 table 控制在页面之间没有像无状态一样维护。
所以我在会话中保存 table 如下:
System.Web.UI.WebControls.Table ObjTbl = new System.Web.UI.WebControls.Table();
ObjTbl = tblMainReport;
Session["tblMyMainReport"] = ObjTbl;
然后在按钮 Onclick 方法 (GetDetailReconciliation) 中,我从会话中检索 table 作为:
if (Session["tblMyMainReport"] != null)
{
tblMainReport = (System.Web.UI.WebControls.Table)Session["tblMyMainReport"];
tblMainReport.Visible = true;
int i = tblMainReport.Rows.Count; string s;
if (i > 0)
s = tblMainReport.Rows[3].Cells[1].Text;
}
变量 i 和 s 显示正确的检索值。但是,tblMainReport 仍然没有显示在页面中。
有人知道为什么 table 即使从会话中成功检索也没有显示吗?
不幸的是,System.Web.UI.WebControls.Table class 中的 ASP.NET Web Forms 不会保留您从后面的代码中对其所做的任何更改,除非您付出一些努力来恢复它每个回发状态。
为了尽可能接近您目前所做的,您可以执行以下操作:
在 asp:PlaceHolder:
中渲染 tblMainReport<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 窗体呈现它的方式恢复您保存的 table 实例。
下面我提供了这种方法的通用示例:
标记
<%@ 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"]);
}
}
}
或者,您可以在每次需要渲染时调用用于构建 table 的逻辑。