您必须创建两个视图状态,一个用于排序方向,另一个用于排序表达式,以便在排序时进行检查。
首先,从 gridview 检索排序方向为“升序”和“降序”,当您想要在数据表中归档数据时,您必须使用传递 gridview 排序方向的“ASC”和“DESC”,然后在当对数据进行排序。
其次,一个翻转功能,将传递一个排序方向并将其翻转,当您第一次单击列时使用它,例如它会排序“ASC”,然后您第二次单击它时,它必须是“DESC”这就是我翻转它的原因。
第三,视图状态用于保留前一个排序的值。
第四,创建一个视图状态来保存 PageIndexChanging 事件的排序数据表,当然您必须检查视图状态是否为空,然后您必须获取数据并绑定它,否则您必须将网格视图与排序数据表绑定。
protected void GridView_Users_Sorting(object sender, GridViewSortEventArgs e)
{
if (String.IsNullOrEmpty(ViewState["sortExpression"].ToString()) && String.IsNullOrEmpty(ViewState["sortDirection"].ToString()))
{
//Sort and bind data as ASCENDING for the first time
DefaultSortBind(e);
}
else
{
if (ViewState["sortExpression"].ToString() == e.SortExpression.ToString())
{
string sortDirection = string.Empty;
if (ViewState["sortDirection"].ToString() == e.SortDirection.ToString())
{
sortDirection = flipSortDirection(GetSortDirection(e.SortDirection.ToString()));
}
else
{
sortDirection = GetSortDirection(e.SortDirection.ToString());
}
DataTable dt = new UserInfoTableTableAdapter().GetData();
dt.DefaultView.Sort = e.SortExpression + " " + sortDirection;
GridView_Users.DataSource = dt.DefaultView;
GridView_Users.DataBind();
ViewState["sortedDt"] = dt.DefaultView.ToTable();
ViewState["sortDirection"] = sortDirection;
}
else
{
//Sort and bind data as ASCENDING
DefaultSortBind(e);
}
}
}
private void DefaultSortBind(GridViewSortEventArgs e)
{
ViewState["sortExpression"] = e.SortExpression;
ViewState["sortDirection"] = e.SortDirection;
//Fetch data again, because if we try to get data from gridview it will give null
DataTable dt = new UserInfoTableTableAdapter().GetData();
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortDirection.ToString());
GridView_Users.DataSource = dt.DefaultView;
GridView_Users.DataBind();
ViewState["sortedDt"] = dt.DefaultView.ToTable();
}
//Get sort direction
private string GetSortDirection(string sortDirection)
{
if (sortDirection == "Ascending")
{
return "ASC";
}
else
{
return "DESC";
}
}
//Flip sort direction
private string flipSortDirection(string sortDirection)
{
if (sortDirection == "ASC")
{
return "DESC";
}
else
{
return "ASC";
}
}