2010-03-31 53 views
14

如何啓用我的BLL的自動排序,它返回一個列表,CustomerList:GridView中的列表?如何在GridView中自動排序IEnumerable數據?

客戶是我自己的強類型類,CustomerList是客戶列表。

我知道一種方法是在GridView中將AllowSorting屬性設置爲true,並處理OnSorting事件並調用我的CustomerList類中定義的排序方法。

但是我想要一個自動化的解決方案,我不必處理OnSorting事件,它應該像GridView如何處理DataView,DataTable和DataSet的自動排序。

是否有我需要在我的CustomerList或Customer類上實現的接口來啓用該功能?

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

+0

大量的有關在這裏排序GridView的好信息:http://msdn.microsoft.com/en-us/library/hwf94875(VS.80).aspx – 2010-03-31 02:18:22

回答

7

好吧我想通了。以下是解決方案:

  1. 將BLL綁定到ObjectDataSource。
  2. 爲BLL中的select方法提供重載方法,以支持分頁和排序。
  3. 在ObjectDataSource中提供SortParameterName。這是BLL中選擇方法的字符串輸入參數的名稱。

欲瞭解更多信息,請參閱: 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

+0

在示例解決方案中,我使用arraylist來保存數據庫記錄,然後節省我的BLL對象的arraylist,我可以直接使用BLL對象來保存數據庫記錄,但將來我想將數據庫連接移動到DAL,它將返回一個數組列表給我的BLL。 – ace 2010-03-31 20:00:13

0

通過在會話中存儲排序表達式和方向,您可以在DAL中執行相同的邏輯。 獲取從gridview的分選方法的SortExpression N的方向和使用這些paramters在DAL不排序。但ü甲肝照顧例外的在設置e.cancel =真

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

也參閱 http://forums.asp.net/t/1344883.aspx