我试图让 gridview 手动排序和分页,但没有成功。
问题是,当用户单击他们想要排序的列时,它会对该页面进行排序,但不会对 gridview 后面的数据源(dataview)进行排序。 因此,当他们进入不同的页面时,他们的排序就会丢失。 我几乎正在寻找一种能够真正对 gridview 后面的数据源进行排序的排序。 这是我到目前为止所拥有的:
protected void GridView_OnSort(object sender, GridViewSortEventArgs e)
{
String sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
DataView myDataView = new DataView(mybll.GetItemsOrdered());
myDataView.Sort = sortExpression + " DESC";
GridView.DataSource = myDataView;
GridView.DataBind();
}
else
{
DataView myDataView = new DataView(mybll.GetItemsOrdered());
myDataView.Sort = sortExpression + " ASC";
GridView.DataSource = myDataView;
GridView.DataBind();
}
}
如有任何帮助,我们将不胜感激。 谢谢。
将排序顺序保存在 ViewState 中。
private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";
public SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
return (SortDirection) ViewState["sortDirection"];
}
set { ViewState["sortDirection"] = value; }
}
protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
string sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
GridViewSortDirection = SortDirection.Descending;
SortGridView(sortExpression, DESCENDING);
}
else
{
GridViewSortDirection = SortDirection.Ascending;
SortGridView(sortExpression, ASCENDING);
}
}
private void SortGridView(string sortExpression,string direction)
{
// You can cache the DataTable for improving performance
DataTable dt = GetData().Tables[0];
DataView dv = new DataView(dt);
dv.Sort = sortExpression + direction;
GridView1.DataSource = dv;
GridView1.DataBind();
}
为什么您不想使用现有的排序功能?您随时可以自定义它。
在 GridView Web 服务器控件中对数据进行排序(位于 MSDN)
这是一个自定义示例:
<asp:GridView
ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true">
<Columns>
<asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid" />
<asp:BoundField DataField="bookname" HeaderText="BOOK NAME" />
<asp:BoundField DataField="writer" HeaderText="WRITER" />
<asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook" />
<asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" />
</Columns>
</asp:GridView>
隐藏代码:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
string query = "SELECT * FROM book";
DataTable DT = new DataTable();
SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
DA.Fill(DT);
GridView1.DataSource = DT;
GridView1.DataBind();
}
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {
string query = "SELECT * FROM book";
DataTable DT = new DataTable();
SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
DA.Fill(DT);
GridView1.DataSource = DT;
GridView1.DataBind();
if (DT != null) {
DataView dataView = new DataView(DT);
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridView1.DataSource = dataView;
GridView1.DataBind();
}
}
private string GridViewSortDirection {
get { return ViewState["SortDirection"] as string ?? "DESC"; }
set { ViewState["SortDirection"] = value; }
}
private string ConvertSortDirectionToSql(SortDirection sortDirection) {
switch (GridViewSortDirection) {
case "ASC":
GridViewSortDirection = "DESC";
break;
case "DESC":
GridViewSortDirection = "ASC";
break;
}
return GridViewSortDirection;
}
}
塔库斯的回答效果很好。 不过,我建议用 SESSION 替换 VIEWSTATE。
当前页面的 VIEWSTATE 仅在当前页面回发到自身时起作用,并且在用户重定向到另一个页面后消失。 SESSION 不仅在当前页面的回发上保留排序顺序。 它在整个会话期间持续存在。 这意味着用户可以浏览其他页面,并且当他返回给定页面时,他上次使用的排序顺序仍然保留。 这通常更方便。
还有其他方法,例如保留用户配置文件。
我推荐这篇文章,它对 ViewState 及其如何与网页生命周期配合使用进行了很好的解释:https://msdn.microsoft.com/en-us/library/ms972976.aspx
要了解 VIEWSTATE、SESSION 和其他持久变量方式之间的区别,我推荐这篇文章:https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx
我找到了一种更简单的方法,它允许您仍然使用标准 gridview 的内置排序/分页...
创建 2 个标签。 将它们设置为可见= false。 我把我的称为 lblSort1 和 lblSortDirection1
然后编写 2 个简单事件...页面排序(写入不可见标签的文本)以及页面索引更改(使用它们)...
Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting
lblSort1.Text = e.SortExpression
lblSortDirection1.Text = e.SortDirection
End Sub
Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging
gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text))
End Sub
这比使用全局变量有点草率,但我发现在 asp 中,尤其是全局变量是不可靠的......
更简单的方法...:
Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable)
Dim dv As New DataView(dt)
If GridView1.Attributes("dir") = SortDirection.Ascending Then
dv.Sort = e.SortExpression & " DESC"
GridView1.Attributes("dir") = SortDirection.Descending
Else
GridView1.Attributes("dir") = SortDirection.Ascending
dv.Sort = e.SortExpression & " ASC"
End If
GridView1.DataSource = dv
GridView1.DataBind()