Asp.net 对绑定到自定义通用对象列表的GridView进行排序

Asp.net 对绑定到自定义通用对象列表的GridView进行排序,asp.net,vb.net,sorting,gridview,Asp.net,Vb.net,Sorting,Gridview,我正在尝试找出如何对绑定到自定义对象的通用列表的具有多列(String、DateTime、Decimal等数据类型)的GridView进行排序 MyObject.vb: Public Property Id Public Property Name Public Property Date Public Property Amount gridView.DataSource = GetMyObjects() gridView.DataBind() <asp:GridView ID="G

我正在尝试找出如何对绑定到自定义对象的通用列表的具有多列(
String
DateTime
Decimal
等数据类型)的
GridView
进行排序

MyObject.vb

Public Property Id
Public Property Name
Public Property Date
Public Property Amount
gridView.DataSource = GetMyObjects()
gridView.DataBind()
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" OnSorting="GridView1_Sorting">
</asp:GridView>
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView1.DataSource = GetObjects(e.SortDirection, e.SortExpression);
    GridView1.DataBind();
}
MyObjects.aspx.vb

Public Property Id
Public Property Name
Public Property Date
Public Property Amount
gridView.DataSource = GetMyObjects()
gridView.DataBind()
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" OnSorting="GridView1_Sorting">
</asp:GridView>
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView1.DataSource = GetObjects(e.SortDirection, e.SortExpression);
    GridView1.DataBind();
}
注意
GetMyObjects()
返回
MyObject的
列表

基本上,我需要能够单击网格的列标题进行排序和反向排序,还需要能够在
ViewState
中存储排序方向,以便每次单击列标题时该方向都保持不变

似乎我可能需要
MyObject
来实现
IComparable
,但我不太确定如何将它们放在一起


有谁能为我推荐一个好的教程,或者给我指出正确的方向吗?

您需要启用排序()并处理事件

注意:示例代码使用C#,但VB版本应该类似。

创建您的网格视图

Public Property Id
Public Property Name
Public Property Date
Public Property Amount
gridView.DataSource = GetMyObjects()
gridView.DataBind()
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" OnSorting="GridView1_Sorting">
</asp:GridView>
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView1.DataSource = GetObjects(e.SortDirection, e.SortExpression);
    GridView1.DataBind();
}
GetObjects返回排序后的
列表
。您必须在这里创建自己的排序逻辑,一种替代方法是使用。如果选择该路径,GetObjects可以这样定义:(有更好的方法,但这足以说明理论)

private List GetObjects(SortDirection sd,string se)
{
//我们以前生成过数据吗?
if(SimulatedDB==null)
{
//创建一个示例数据库
SimulatedDB=新列表();
var rnd=新随机数();
对于(int i=0;i<20;i++)
{
var node=新的MyObject();
node.Id=i;
node.Name=String.Format(“Name{0}”,i);
node.CreationDate=DateTime.Now.AddDays(rnd.Next(100));
node.Amount=(rnd.Next(1000)*rnd.NextDouble());
模拟数据库添加(节点);
}
}
//返回排序列表
if(sd==SortDirection.升序)
返回SimulatedDB.AsQueryable().OrderBy(se.ToList();
其他的
返回SimulatedDB.AsQueryable().OrderByDescending(se.ToList();
}

希望有帮助。

GridView有一个内置的排序选项。这将一次对一列起作用。可以吗?它有一个内置选项?一次一列就可以了……也许本教程可以帮助您:试试“gridView.AllowSorting=true”;在该教程中,gridView绑定到dataview,因此对我来说不起作用。我的网格绑定到一个通用列表。实际上,我最终使用了这里给出的答案:然而,您的代码看起来也可以工作,因此将其标记为答案。