【问题标题】:How to enable Automatic Sorting of IEnumerable Data in GridView?如何在 GridView 中启用 IEnumerable 数据的自动排序?
【发布时间】:2011-02-02 17:57:39
【问题描述】:

如何启用 BLL 的自动排序,它返回一个列表 CustomerList:List in a GridView?

Customer 是我自己的强类型类,CustomerList 是客户列表。

我知道一种方法是在 GridView 中将 AllowSorting 属性设置为 true 并处理 OnSorting 事件并调用在我的 CustomerList 类中定义的排序方法。

但是我想要一个自动的解决方案,因为我不必处理 OnSorting 事件,它应该像 GridView 如何处理 DataView、DataTable 和 DataSet 的自动排序一样。

我需要在 CustomerList 或 Customer 类上实现一个接口来启用该功能吗?

alt text http://img260.imageshack.us/img260/3373/aa479347gridviewfg21enu.gif

【问题讨论】:

标签: c# asp.net gridview sorting ienumerable


【解决方案1】:

好的,我想通了。这是解决方案:

  1. 将 BLL 绑定到 ObjectDataSource。
  2. 为 BLL 中的 select 方法提供重载方法,以支持分页和排序。
  3. 在 ObjectDataSource 中提供 SortParameterName。这是 BLL 中选择方法的字符串输入参数的名称。

有关更多信息,请参阅: http://msdn.microsoft.com/en-us/library/aa479347.aspx

这是一个例子,这只是一个简单的演示示例,我不支持排序方向,或优化代码等:

namespace CodeSamples.DAL
{
    public static class DAL
    {
        public static CustomerList GetCustomerList(string SortExpression)
        {
            return GetCustomerList(int.MaxValue, 0, SortExpression);
        }

        public static CustomerList GetCustomerList()
        {
            return GetCustomerList(int.MaxValue, 0,String.Empty);
        }

        public static CustomerList GetCustomerList(int maximumRows, int startRowIndex, string SortExpression)
        {
            const string query = "Select * from Customers";
            CustomerList customers = new CustomerList();


            SqlConnection conn = new SqlConnection("Data Source=Win2k8;Initial Catalog=NorthWind;User ID=sa;Password=XXXXX");
            SqlCommand command = new SqlCommand(query, conn);
            conn.Open();
            SqlDataReader reader = command.ExecuteReader();

            ArrayList rows = new ArrayList();

            while (reader.Read())
            {
                object[] values = new object[reader.FieldCount];
                reader.GetValues(values);
                rows.Add(values);
            }

            conn.Close();

            int currentIndex = 0;
            int itemsRead = 0;
            int totalRecords = rows.Count;

            foreach (object[] row in rows)
            {
                if (currentIndex >= startRowIndex && itemsRead <= maximumRows)
                {
                    customers.Add(new Customer { Name = row[1].ToString(), ID = row[0].ToString(), ContactName = row[2].ToString() });
                    itemsRead++;
                }
                currentIndex++;
            }


        CustomerList sortedCustomers = new CustomerList();

        string sortBy = SortExpression;
        bool isDescending = false;

        if (SortExpression.ToLowerInvariant().EndsWith(" desc"))
        {
            sortBy = SortExpression.Substring(0, SortExpression.Length - 5);
            isDescending = true;
        }         

        var sortedList = from customer in customers
                         select customer;

        switch (sortBy)
        {
            case "ID":
                sortedList = isDescending ? sortedList.OrderByDescending(cust => cust.ID) : sortedList.OrderBy(cust => cust.ID);
                break;

            case "Name":
                sortedList = isDescending ? sortedList.OrderByDescending(cust => cust.Name) : sortedList.OrderBy(cust => cust.Name);
                break;

            case "ContactName":
                sortedList = isDescending ? sortedList.OrderByDescending(cust => cust.ContactName) : sortedList.OrderBy(cust => cust.ContactName);
                break;

        }

        foreach (Customer x in sortedList)
        {
            sortedCustomers.Add(x);
        }    

            return sortedCustomers;
        }
    }  

    public class CustomerList : List<Customer>
    {

    } 

    public class Customer
    {
        public Customer()
        {
        }

        public Customer(string Name, string id)
        {
            this.Name = Name;
            ID = id;
        }
        public string ID
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public string ContactName
        {
            get;
            set;
        }


    }
}

在 ASPX 页面中:

  <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" DataSourceID="ObjectDataSource1" 
            AllowSorting="True">
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" />
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="ContactName" HeaderText="ContactName" SortExpression="ContactName" />
            </Columns>
        </asp:GridView>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
            SelectMethod="GetCustomerList" SortParameterName="SortExpression"
            TypeName="CodeSamples.DAL.DAL">
        </asp:ObjectDataSource>

有关更多信息,请参阅: http://msdn.microsoft.com/en-us/library/aa479347.aspx

【讨论】:

  • 在示例解决方案中,我使用数组列表来保存数据库记录,然后将数组列表保存到我的 BLL 对象中,我可以直接使用 BLL 对象来保存数据库记录,但在未来我想将数据库连接移动到 DAL,这会将数组列表返回到我的 BLL。
【解决方案2】:

您可以通过将排序表达式和方向存储在会话中来在 DAL 中执行相同的逻辑。 从 gridview 排序方法中获取 Sortexpression n 方向,并使用这些参数在 DAL 中进行排序。但是你必须注意设置 e.cancel=true 时的异常

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
     \\ Take sortexpression n direction
       e.cancel = true 
        }

也可以参考 http://forums.asp.net/t/1344883.aspx

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多