代码之家  ›  专栏  ›  技术社区  ›  Mathieu Pagé

可以在GridView上进行自定义排序吗

  •  7
  • Mathieu Pagé  · 技术社区  · 16 年前

    网格视图 (不是DataGridView,这不是同一件事)这需要一个复杂的排序,我不知道如何才能做到。我有两列,一列包含日期,另一列包含优先级。

    假设今天是2010年1月13日,以这种方式订购的一些数据可能如下所示

       date       priority  Explanation
    -----------   --------  --------------------------------------------
    2010-jan-13      3      This comes first because it has the higer priority of all items whith a date <= today
    2010-jan-12      2      Since this items and the next have the same priority they're ordered by date
    2010-jan-13      2
    2010-jan-14      5      This item and the followings have date > today, so they are ordered by date then by priority.
    2010-jan-14      0
    2010-jan-15      5
    2010-jan-16      5
    

    是否可以手动或通过传递比较函子对网格视图进行排序?

    数据源是一个数据表。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

    从…起 在GridView Web服务器控件中排序数据 http://msdn.microsoft.com/en-us/library/hwf94875.aspx

    自定义排序

    如果默认排序行为不足以满足您的要求,则可以自定义网格的排序行为。自定义排序的基本技术是处理排序事件。在处理程序中,可以执行以下操作:

    • 创建自己的排序逻辑。例如,如果您使用的数据源不支持排序, 您可以在自己的代码中执行排序,然后将网格绑定到已排序的数据。

    Dim oDataSet As DataSet = GatherDataSet()
    Dim oDataTable As DataTable = oDataSet.Tables(0)
    Dim oSort1 As New DataView(oDataTable, "Date > #2010/01/13#", "Date, Priority", DataViewRowState.CurrentRows)
    Dim oSort2 As New DataView(oDataTable, "Date <= #2010/01/13#", "Priority, Date", DataViewRowState.CurrentRows)
    Dim oGridDataTable As DataTable
    oGridDataTable = oSort1.ToTable
    oGridDataTable.Merge(oSort2.ToTable)
    
    oGridView.DataSource = oGridDataTable
    
    '...
    'you can then merge any changes back into the data set, if needed
    oDataSet.Merge(oGridDataTable)
    
        2
  •  0
  •   Danny T.    16 年前

    向马修致敬,

    class DatePriority: IComparable
    {
        private DateTime date;
        public DateTime Date
        {
            get { return date; }
        }
        private int priority;
        public int Priority
        {
            get { return priority; }
        }
    
        public DatePriority(DateTime date, int priority)
        {
            this.date = date;
            this.priority = priority;
        }
    
        public int CompareTo(object obj)
        {
            if (obj is DatePriority)
            {
                DatePriority comparedDatePriority = obj as DatePriority;
    
                // Comparison logic
                // If the compared elements are today or before today, order by priority in descending order. Same priorities are ordered by date in ascending order
                // If the compared elements are for the future, order by date in ascending order. Same dates are order by priority in descending order
                if ((this.Date <= DateTime.Today && comparedDatePriority.Date <= DateTime.Today))
                {
                    if (Priority == comparedDatePriority.Priority)
                        return Date.CompareTo(comparedDatePriority.Date);
                    else
                        return -Priority.CompareTo(comparedDatePriority.Priority);
                }
                else
                {                    
                    if (Date == comparedDatePriority.date)
                        return -Priority.CompareTo(comparedDatePriority.Priority); // Descending order
                    else
                        return Date.CompareTo(comparedDatePriority.Date);
                }
            }
            throw new ArgumentException("Not a DatePriority");
        }
    }    
    
        3
  •  0
  •   this. __curious_geek    16 年前

    是的,你能做到。这是你怎么做到的。

        [DataObjectAttribute()]
        public static class UserManager
        {
            [DataObjectMethod(DataObjectMethodType.Select, true)]
            public static UserCollection GetUsers()
            {
                return UserDB.GetAll();
            }
    
            [DataObjectMethod(DataObjectMethodType.Select, false)]
            public static UserCollection GetUsers(string sortExpression)
            {
                UserCollection users = UserDB.GetAll();
                users.Sort(new EntityComparer<User>(sortExpression));
                return users;
            }
        }
    

    在重载的GetUsers方法中查看这行代码。

    users.Sort(new EntityComparer<User>(sortExpression));
    

    下面是我的GridView的外观。。

             <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataSourceID="ObjectDataSource1">
                <Columns>
                    <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
                    <asp:BoundField DataField="UserName" HeaderText="UserName" 
                        SortExpression="UserName" />
                    <asp:BoundField DataField="Password" HeaderText="Password" 
                        SortExpression="Password" />
                    <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                    <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
                    <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" 
                        SortExpression="CompanyName" />
                </Columns>
            </asp:GridView>
            <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
                OldValuesParameterFormatString="original_{0}" SelectMethod="GetUsers" 
                TypeName="FilePark.BusinessLayer.UserManager"></asp:ObjectDataSource>
    

        4
  •  -1
  •   Denis Palnitsky    16 年前

    dataGrinView的排序过程使用数据源的排序过程。 若要手动对数据排序,请创建实现IBindingListView的类,按照需要实现它的排序方法,并将该类用作DataGridView中的数据源

    推荐文章