【发布时间】:2013-11-09 21:56:21
【问题描述】:
我有一个gridview,我正在尝试保持它的状态。目前我有它,用户可以在其中编辑内联(从网格视图中)。我经常得到这个工作:
protected void GridViewTower_RowEditing(object sender, GridViewEditEventArgs e)
{
//Set the edit index.
GridViewTower.EditIndex = e.NewEditIndex;
//Bind/Re-LoadData data to the GridView control.
LoadData();
Populate();
}
protected void GridViewTower_CancelEditRow(object sender, GridViewCancelEditEventArgs e)
{
//Reset the edit index.
GridViewTower.EditIndex = -1;
//Bind/Re-LoadData data to the GridView control.
LoadData();
Populate();
}
问题是,我还有 3 个其他功能,例如排序、过滤 gridview 的下拉菜单和过滤 girdview 的按钮搜索。在其中任何 3 种模式中进行内联编辑时,我无法控制 gridview 所处的状态。在我的 gridview 标记中,我将 EnableViewState 和 ViewStateMode 都设置为 true。
如何在这些模式下保持网格视图的状态?
public void LoadData()
{
if (Session["GridView"] != null)
{
GridViewTower.DataSource = Session["GridView"];
GridViewTower.DataBind();
//Response.Redirect("TowerManagement.aspx"); //
//Session["GridView"] = null;
}
else
{
WISSModel.WISSEntities context = new WISSModel.WISSEntities();
var tower = (from t in context.Towers
where t.isDeleted == false
select new
{
t.TowerId,
t.TowerName,
RangeName = t.Range.RangeName
}).ToList();
GridViewTower.DataSource = tower;
GridViewTower.DataBind();
ViewState["Sort"] = 0;
}
}
protected void Gridview_Sort(object sender, GridViewSortEventArgs e)
{
WISSModel.WISSEntities context = new WISSModel.WISSEntities();
var towers = (from t in context.Towers
where t.isDeleted == false
select new
{
t.TowerId,
t.TowerName,
rangeName = t.Range.RangeName
}).ToList();
DataTable gridviewTable = towers.CopyToDataTable();
gridviewTable.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridViewTower.DataSource = gridviewTable;
GridViewTower.DataBind();
Session["GridView"] = GridViewTower.DataSource;
}
【问题讨论】:
-
我建议将用于排序、过滤和搜索的值保留在 gridview 之外的三个隐藏字段中。在 LoadData() 中检查这些值并在绑定 gridview 之前优化数据源。
-
只是一个想法,但是否可以将数据源存储在视图状态对象中?类似于:ViewState[Gridview.Datasource,"currentGridView"];
-
有可能,但我不建议将数据源保存在视图状态中。每个回发都会向服务器发送大量视图状态数据。 1)我会使用 hiddenfield 来存储一些值并在每个回发中重新查询数据源。 2)在最坏的情况下,我会将源保存到 Session 而不是视图状态。
-
@afzalulh 我不太确定如何做 1),但我正在尝试 2)。所以它似乎保持了gridview的状态,但是当我尝试编辑时,它不会更新db。我不确定为什么。我在三个功能的底部都有会话变量。 Session["GridView"] = GridViewTower.DataSource; 然后在 LoadData 方法中检查会话是否为空。如果没有,我使用 gridview 会话来绑定。
-
您必须将底层源(例如数据表、数据视图)保存到会话,而不是 GridVew.DataSource。发布 LoadData() 的代码;填充();和排序/过滤数据,建议任何东西都会更容易。
标签: c# asp.net gridview viewstate