我有一个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事件期间获取所选行而无需再次重新加载所有内容?
感谢。
答案 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到总结果计数)。这样,您可以快速检索需要数据的主键,并从数据库中新获取该数据。