【问题标题】:Sorting a GridView bound to a list of custom generic Objects对绑定到自定义通用对象列表的 GridView 进行排序
【发布时间】:2012-09-20 14:37:17
【问题描述】:

我试图弄清楚如何对绑定到自定义对象的通用列表的多列(StringDateTimeDecimal 等数据类型)的GridView 进行排序。

MyObject.vb

Public Property Id
Public Property Name
Public Property Date
Public Property Amount

MyObjects.aspx.vb

gridView.DataSource = GetMyObjects()
gridView.DataBind()

注意GetMyObjects() 返回List of MyObject

基本上,我需要能够单击网格的列标题进行排序和反向排序,并且还能够将排序方向存储在ViewState 中,因此每次单击列标题时方向都会保持不变.

看来我可能需要MyObject 来实现IComparable,但我不确定如何将它们组合在一起。

谁能为此推荐一个好的教程,或指出正确的方向?

【问题讨论】:

  • GridViews 有一个内置的排序选项。这将一次处理一列。可以吗?
  • 它有内置选项吗?一次一列就可以了...
  • 也许这个教程可以帮到你:csharpdotnetfreak.blogspot.com/2012/06/…
  • 试试“gridView.AllowSorting = true;”
  • 在该教程中,gridview 绑定到一个 dataview,所以这对我不起作用。我的网格绑定到一个通用列表。

标签: asp.net vb.net sorting gridview


【解决方案1】:

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

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

创建您的 GridView

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" OnSorting="GridView1_Sorting">
</asp:GridView>

处理OnSorting

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

GetObjects 返回排序后的List&lt;MyObject&gt;。您必须在此处创建自己的排序逻辑,一种替代方法是使用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();
}

希望对你有帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2011-04-29
  • 2021-07-11
相关资源
最近更新 更多