繁体   English   中英

如何在GridView中启用IEnumerable数据的自动排序?

[英]How to enable Automatic Sorting of IEnumerable Data in GridView?

如何启用我的BLL的自动排序,返回列表,CustomerList: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

好吧我明白了。 这是解决方案:

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

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

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

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

您可以通过在会话中存储sortexpression和direction来在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM