C# 在gridView中分页时如何保持排序顺序?
我正在使用gridView显示信息。除了一个细节外,它对我来说绝对完美。如果用户对列进行排序,然后单击转到另一页,则排序将丢失。基本上,我需要排序,以保持当分页发生,任何帮助将不胜感激。以下是我的代码:C# 在gridView中分页时如何保持排序顺序?,c#,sorting,gridview,ascx,C#,Sorting,Gridview,Ascx,我正在使用gridView显示信息。除了一个细节外,它对我来说绝对完美。如果用户对列进行排序,然后单击转到另一页,则排序将丢失。基本上,我需要排序,以保持当分页发生,任何帮助将不胜感激。以下是我的代码: public partial class DynamicGridView : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { if (_selec
public partial class DynamicGridView : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (_selectCmd != string.Empty)
BindData();
}
private void BindData()
{
DataTable dt;
if (ViewState[gridView.ClientID + "datatable"] == null || (string)ViewState[gridView.ClientID + "selectCommand"] != _selectCmd)
{
ViewState[gridView.ClientID + "selectCommand"] = _selectCmd;
dt = Classes.SQL.GetDataTable(_selectCmd);
if (dt != null)
{
ViewState[gridView.ClientID + "datatable"] = dt;
if (dt.Columns.Count != gridView.Columns.Count)
{
gridView.Columns.Clear();
foreach (DataColumn column in dt.Columns)
AddBoundField(column);
}
}
}
else
dt = (DataTable)ViewState[gridView.ClientID + "datatable"];
gridView.DataSource = dt;
gridView.DataBind();
}
private void AddBoundField(DataColumn column)
{
BoundField field = new BoundField();
HandleCustomDataFormatting(ref field, column);
field.DataField = column.ColumnName;
field.HeaderText = column.ColumnName;
field.ReadOnly = true;
field.SortExpression = column.ColumnName;
field.ControlStyle.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
field.ItemStyle.Width = System.Web.UI.WebControls.Unit.Pixel(70);
gridView.Columns.Add(field);
}
private void HandleCustomDataFormatting(ref BoundField field, DataColumn column)
{
if (column.DataType == typeof(System.DateTime))
switch (column.ColumnName)
{
case "InvalidDate":
case "NewCustomerValidated":
case "ValidatedDate":
field.DataFormatString = "{0:d}";//exclude time info
break;
default:
field.DataFormatString = "{0:g}";
break;
}
}
private string GetSortDirection(string sortColumn)
{
string sortDirection = "ASC";
string lastSortColumn = (string)ViewState[gridView.ClientID + "SortExpression"];
if (lastSortColumn != null && lastSortColumn == sortColumn)
{
string lastDirection = (string)ViewState[gridView.ClientID + "SortDirection"];
if (lastDirection != null && lastDirection == "ASC")
sortDirection = "DESC";
}
ViewState[gridView.ClientID + "SortExpression"] = sortColumn;
ViewState[gridView.ClientID + "SortDirection"] = sortDirection;
return sortDirection;
}
private string _selectCmd = string.Empty;
public string SelectCommand
{
set { _selectCmd = value; }
}
protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dt = (DataTable)ViewState[gridView.ClientID + "datatable"];
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
BindData();
}
protected void GridView_PageChange(object sender, GridViewPageEventArgs e)
{
gridView.PageIndex = e.NewPageIndex;
BindData();
}
}
您不需要在每次加载页面时进行绑定
if (_selectCmd != string.Empty)
if(!IsPostBack)
BindData();
另外,请小心在ViewState中放置的内容,放置sql查询不是一个好的做法。这种方法对我来说很有效 您可以将两个变量设置为如下所示:
protected string SortColummn
{
get { return ViewState["SortColumn"].ToString(); }
set { ViewState["SortColumn"] = value; }
}
protected string SortDirection
{
get { return ViewState["SortDirection"].ToString(); }
set { ViewState["SortDirection"] = value; }
}
在“if(!Page.IsPostBack)”块中的页面加载中为这些设置默认值。然后,在GridView_排序中,根据e.SortExpression设置这两个变量。
最后,在BindData()中,根据这两个变量设置dt.DefaultView.Sort 是否将
数据表
和sql命令存储在视图状态
中?不要那样做。前者会破坏ViewState,这会降低应用程序的速度,因为它会在客户端和服务器之间来回发送此ViewState。后者是不安全的,是否希望每个用户都能够通过解码ViewState来查看sql查询?如果需要将其持久化或从数据库中重新加载,请使用Session
。另请注意,对于会生成大量数据的查询,如果无法将整个结果集存储在Session
中,则可能需要从数据库中获取一页数据,然后每次页面更改时都去获取一个全新的页面,此应用程序仅在本地intranet上“内部”使用。此外,它将被少数人使用,因此我不太担心他们看到SQL查询。不过,我同意你提出的所有观点。谢谢。需要注意的一点是,上面关于使用会话和ViewState的评论是准确的,但是因为Chris说他不担心这些问题,所以我使用ViewState编写了我的解决方案。