持久化DataTable或GridView DataSource

时间:2011-11-04 13:57:36

标签: c# asp.net datatable

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

然后我有另一个点击事件试图让GridView DataSource e将它转换回DataTable,如:

DataTable dt = (DataTable)GridView1.DataSource;

但Datasource返回null。事件,如果我把代码和Page_Init事件等待正确的postBack

所以我想知道如何持久保存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;
    }

2 个答案:

答案 0 :(得分:0)

这可能适合你。

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

答案 1 :(得分:0)

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

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

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