Таблица, полученная из сеанса, не показана на странице - PullRequest
0 голосов
/ 29 января 2019

Я определил таблицу asp: в дизайне, как показано ниже:

    <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>

Это таблица с четырьмя строками и 9 столбцами, которая динамически заполняется кодом и успешно отображается на странице.После этого на той же странице нажимают другую кнопку:

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

Этот метод приводит к динамически создаваемым данным для Gridview.Gridview отображается, однако таблица (tblMainReport) исчезает.Причина, по-видимому, заключается в том, что управление таблицами между страницами не поддерживается как не имеющее состояния.

Поэтому я сохраняю таблицу в сеансе, как показано ниже:

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

, а затем в методе Onclick кнопки (GetDetailReconciliation) я извлекаю таблицу из сеанса как:

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 по-прежнему не отображается на странице.

Кто-нибудь знает, почему таблица не показывает, даже если она успешно получена из сеанса?

1 Ответ

0 голосов
/ 29 января 2019

К сожалению, класс System.Web.UI.WebControls.Table в ASP.NET Web Forms не сохранит никаких изменений, внесенных в него из кода, если только вы не приложите некоторые усилия для восстановления его состояния при каждой обратной передаче..

Чтобы быть как можно ближе к тому, что вы уже сделали, вы можете сделать следующее:

Отобразить 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"]);
}

Это должно восстановить сохраненный экземпляр таблицы таким способом, который позволит веб-формам отображать его.

Ниже приведен рабочий обобщенный пример этого подхода:

Разметка

<%@ 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"]);
        }
    }
}

В качестве альтернативы, вы можете просто вызывать логику, используемую для построения вашей таблицы, каждый раз, когда она вам нужна для визуализации.

...