C# 持久化DataTable或GridView数据源

C# 持久化DataTable或GridView数据源,c#,asp.net,datatable,C#,Asp.net,Datatable,我有一个填充DataTable的Click事件,DataTable是我的GridView的源 然后,我有另一个click事件,尝试获取GridView数据源e,并将其转换回DataTable,如: DataTable dt=(DataTable)GridView1.DataSource 但是数据源返回null。事件,如果我将代码和Page_Init事件放置在等待右回发的位置 因此,我想知道如何持久化gridview或DataTable的数据源 按要求编辑: 以下是全部代码: ps:Page_In

我有一个填充DataTable的Click事件,DataTable是我的GridView的源

然后,我有另一个click事件,尝试获取GridView数据源e,并将其转换回DataTable,如:

DataTable dt=(DataTable)GridView1.DataSource

但是数据源返回null。事件,如果我将代码和Page_Init事件放置在等待右回发的位置

因此,我想知道如何持久化gridview或DataTable的数据源

按要求编辑:

以下是全部代码:

ps:Page_Init是获取数据源的另一次尝试

    private DataTable _dataTable;

    public DataTable dataTable
    {
        get { return _dataTable; }
        set { _dataTable = value; }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        if(Page.IsPostBack)
        {
            string ctrlname = BLL.Common.GetPostBackControlId(this.Page);

            if(ctrlname == "ButtonDownload")
            {
                DataTable dt = (DataTable)GridView1.DataSource;
            }
        }
    }


    protected void Filter_Click(object sender, EventArgs e)
    {
        string[] status = new string[2];
        status[0] = "Paga";
        status[1] = "Disponivél";

        dataTable = BLL.PagSeguro.GetTransactions(TextBoxInicio.Text, TextBoxFim.Text, status);

        GridView1.DataSource = dataTable;
        GridView1.DataBind();
    }


    protected void GetDataSource(object sender, EventArgs e)
    {
        DataTable dt = (DataTable)GridView1.DataSource;
    }

这可能对你有用

public partial class Demo : System.Web.UI.Page
{
    private DataTable _myData = null;
    protected DataTable MyData
    {
        get
        {
            if (null == _myData)
            {
                // You would load your data here.
                _myData = new DataTable();
            }
            return _myData;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Lets say you set your data source here
        myGrid.DataSource = this.MyData;
    }

    protected void Rendering(object sender, EventArgs e)
    {
        // This is some other event that also needs to get at the data.
        DataTable mydata = this.MyData;
    }

    protected void Unload(object sender, EventArgs e)
    {
        if (null != _myData)
        {
            _myData.Dispose();
            _myData = null;
        }
    }

我很确定您只能通过
DataBound
事件或
ItemDataBound
事件以这种方式访问数据源。您可能可以访问
Items
集合中每个项目的DataRowView,但我不确定:

DataRow row = ((DataRowView)GridView1.Rows[0].DataItem).Row;

至于持久化数据源,你需要考虑这是否是个好主意。存储数据源的选项有
会话
缓存
,但如果结果集相当小,则在需要数据源时进行另一次往返可能更有效。无论您决定做什么,都不要将其存储在ViewState中。

您能显示事件和设置数据源的代码吗?用代码编辑文章我知道您在做什么;您试图将数据持久化到页面生命周期之外;我在下面提供的代码将帮助您实现这一目标,但需要重新加载数据。