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

Pra*_*bhu 5 vb.net asp.net sorting gridview

我试图找出如何排序GridView具有多个列(String,DateTime,Decimal这势必将自定义对象的泛型列表等数据类型).

MyObject.vb:

Public Property Id
Public Property Name
Public Property Date
Public Property Amount
Run Code Online (Sandbox Code Playgroud)

MyObjects.aspx.vb:

gridView.DataSource = GetMyObjects()
gridView.DataBind()
Run Code Online (Sandbox Code Playgroud)

:GetMyObjects()返回ListMyObject

基本上,我需要能够单击网格的列标题进行排序和反向排序,并且还能够存储排序方向,ViewState以便每次单击列标题时方向都会保留.

好像我可能需要MyObject实现IComparable,但我不确定如何将它们放在一起.

任何人都可以建议一个很好的教程,或指出我正确的方向?

Dan*_*iel 5

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

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

创建GridView:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" OnSorting="GridView1_Sorting">
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

处理OnSorting:

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView1.DataSource = GetObjects(e.SortDirection, e.SortExpression);
    GridView1.DataBind();
}
Run Code Online (Sandbox Code Playgroud)

GetObjects返回一个已排序的List<MyObject>.你必须在这里创建自己的排序逻辑,一种方法是使用Dynamic Linq.如果你选择那条路线,可以像这样定义GetObjects :(有更好的方法,但这足以显示理论)

private List<MyObject> GetObjects(SortDirection sd, string se)
{
    // Have we generated data before?
    if (SimulatedDB == null)
    {
        // Create a sample DB
        SimulatedDB = new List<MyObject>();
        var rnd = new Random();

        for (int i = 0; i < 20; i++)
        {
            var node = new 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());

            SimulatedDB.Add(node);
        }
    }

    // Return sorted list
    if (sd == SortDirection.Ascending)
        return SimulatedDB.AsQueryable<MyObject>().OrderBy<MyObject>(se).ToList();
    else
        return SimulatedDB.AsQueryable<MyObject>().OrderByDescending<MyObject>(se).ToList();
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.