在PostBack之后在GridView中保留DataSource

Ev.*_*Ev. 6 c# asp.net datatable gridview

所以我在ASPX页面中有一个GridView.

当我点击<asp:Button id="btnBindIt" runat="server" />它时绑定数据表如下:

theDataTable = GetAllTheRecords();
gvTheGridView.DataSource = theDataTable;
gvTheGridView.DataBind();
Run Code Online (Sandbox Code Playgroud)

注意:theDataTable是会员

private DataTable theDataTable;
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

现在,在很好地显示GridView之后,我想将数据导出为CSV,所以我现在单击<asp:Button id="btnExportIt" runat="server" />运行代码的那个:

exportToCsv(theDataTable);
Run Code Online (Sandbox Code Playgroud)

但是theDataTable没有.

所以我试过了

exportToCsv(gvTheGridView.DataSource)
Run Code Online (Sandbox Code Playgroud)

哪个也是null.

持久化这些数据的标准方法是什么?我真的不想再次点击数据库,因为它是一个很长的SPROC并且用户已经等了一次.

提前致谢!

Muh*_*tar 11

类级变量无法在回发时保持其值.

但是有两种方法可以在页面的PostBack上维护数据:ViewState and Session State.但我会在你的情景中建议将它放入ViewState.

ViewState["theDataTable"] = theDataTable;
Session["theDataTable"] = theDataTable;
Run Code Online (Sandbox Code Playgroud)

然后你可以在页面上回访它:

DataTable theDataTable = (DataTable)ViewState["theDataTable"];
DataTable theDataTable = (DataTable)Session["theDataTable"];
Run Code Online (Sandbox Code Playgroud)


Nit*_*ant 5

声明数据表如下,一切都将按预期工作

    private string _theDataTable="theDataTable";
    private DataTable theDataTable
    {
            get
            {
                    if(ViewState[_theDataTable]==null)
                            return new DataTable();
                    return (DataTable)ViewState[_theDataTable];
            }
            set
            {
                    ViewState[_theDataTable] = value;
            }
    }
Run Code Online (Sandbox Code Playgroud)

干杯!


Ev.*_*Ev. -1

谢谢大家的回答。

我避免将不必要的内容放入 VeiwState 或会话中,因此我认为保留这些数据的最佳方法是缓存它。

我认为MemoryCache是最合适的地方,这就是我最终实现它的方式。