我有一个gridview(实际上是一个SPgridview)
我使列名可点击,以便用户可以使用数据对行进行排序。这很好用。
当用户在对数据进行排序后尝试选择一行时,就会出现此问题。我可以看到gridview有点“忘记”行是如何排序的,并在排序之前选择了单击索引处的行。
我该如何解决?在用户选择一行后,我尝试再次对该行进行排序,但这似乎不起作用。网格视图是否应该记住它刚刚排序的事实?
提前致谢 :)
我有一个gridview(实际上是一个SPgridview)
我使列名可点击,以便用户可以使用数据对行进行排序。这很好用。
当用户在对数据进行排序后尝试选择一行时,就会出现此问题。我可以看到gridview有点“忘记”行是如何排序的,并在排序之前选择了单击索引处的行。
我该如何解决?在用户选择一行后,我尝试再次对该行进行排序,但这似乎不起作用。网格视图是否应该记住它刚刚排序的事实?
提前致谢 :)
当您处理排序事件时,设置一个会话变量,将其设置为排序方向,并在您重新绑定数据源时使用它。
protected void gridview_Sorting()
{
// BIND DATA Function
BindData();
DataTable dt = gridview.DataSource as DataTable;
if (dt != null)
{
//Sort the data.
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
Session["sort"] = dt.DefaultView.Sort;
gridview.DataSource = dt;
gridview.DataBind();
}
}
// bind data function//
private void BindData()
{
DataTable dt = GetDataTable();
if (Session["sort"] != null)
{
//Sort the data.
dt.DefaultView.Sort = Session["sort"].ToString();
}
gridview.DataSource = dt;
gridview.DataBind();
}
确保您没有在回发后重新绑定网格。
if(!IsPostBack)
{
gridView.DataSource = yourDataSource;
gridView.DataBind();
}
当我偶然发现这个问题时,我已经制作了许多可排序的 GridView,但在今天之前没有使用行命令交互。我的是一个“普通”的 GridView,而不是 SPgridview。我发现这有效:
if (Session["dtbl"] == null) { Session["dtbl"] = method_to_fetch_datatable(); } gv.DataSource = Session["dtbl"] as DataTable; gv.DataBind();
Session["dtbl"] = method_to_fetch_datatable(); if (ViewState["SortExpression"] != null) { DataTable dt = Session["dtbl"] as DataTable; dt.DefaultView.Sort = ViewState["SortExpression"] as string; } bindData();
您是通过行索引还是通过要编辑的数据的唯一标识符来获取选定的行?如果您按行索引获取,则可能会“忘记”,因为您正在 OnPostBack 上重新创建 Grid。尝试遍历数据并通过它的唯一 ID 选择它,而不是它的行索引。
查看 Johans 关于SPGridView 和 LinqDataSource的博客
我让它工作了。(有点)
在排序事件中,我保存了排序表达式(用于排序的列的名称)和升序或降序的排序方向。
然后我为gridview和databind创建数据源,在数据绑定之后,我使用gridview.sort命令按我保存在viewstate中的值进行排序。
效果很好,只有一个问题。排序时,我在多次按下同一列后切换方向。现在它认为我一直按列标题,所以它一直在反转排序。
但我只是暂时使它只在一个方向上排序。现在我在排序事件中使用发送者对象,我想如果我能获得一些关于导致事件的原因的信息,我可以告诉它只根据发送者切换方向。
谢谢 :)