如何避免每次回发重新加载GridView数据?

时间:2015-09-16 08:23:00

标签: c# asp.net gridview page-lifecycle

我有一个GridView,可以在Load上加载一些数据:

protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        if (!Page.IsPostBack)
        {
            DataTable dataSource = LoadObjects();
            gvObjects.DataSource = dataSource;
        }
    }

我还添加了一个SelectedIndexChanged事件处理程序,我想在每次选择行时执行某些功能。问题是除非我从OnLoad方法中删除IsPostBack检查,否则当选择一行时,GridView.SelectedRow属性不是我选择的行。

理想情况下,我不想在每次回发时从数据库加载我的所有数据。是否有任何最佳实践可以在SelectedIndexChanged事件期间获取所选行而无需再次重新加载所有内容?

感谢。

3 个答案:

答案 0 :(得分:1)

默认情况下,GridView会根据索引选择一行。尝试指示GridView根据Keys选择行。

EnablePersistedSelection属性设置为true,以便行选择基于数据键值。现在,如果您之前选择的行以任何方式更改其索引或位置,它将保持选中状态。

答案 1 :(得分:1)

我通常让我的GridViews充满了动态控件,如果他们没有在PostBack上重新创建他们不能工作,那么这些控件可以很有趣#34;

您似乎只对SelectedRow感兴趣,但是如果您开始使用动态控件,这个解决方案也可以帮助您解决问题

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    gvObjects.DataSource = LoadCachedObjects();
    gvObjects.DataBind();
}


private DataTable LoadCachedObjects()
{
    var result = new DataTable();
    if ((Session["CachedDataTable"] != null) && (IsPostBack))
    {
        //cached DataTable will only be used on PostBack
        result = Session["CachedDataTable"] as DataTable;
    }
    if (result.Rows.Count == 0)
    {
        result = LoadObjects(); //Get data from the database
        Session["CachedDataTable"] = result;
    }
    return result;
}

这只会在发生回发事件时加载会话中的数据,因此您在页面加载时会有一个初始数据库命中。此外,如果您最终在其他页面上使用该代码,则不必非常关注为会话变量赋予唯一名称

答案 2 :(得分:0)

如果你无法阻止回发,你显然必须重新加载。 因此,解决方案是尝试尽可能少地重新加载。

一种好方法是在某处缓存数据,例如在Session对象中。 但只能将主键与结果索引一起缓存(1到总结果计数)。这样,您可以快速检索需要数据的主键,并从数据库中新获取该数据。