2010-03-31 3 views
14

Wie kann ich die automatische Sortierung meiner BLL aktivieren, die eine Liste zurückgibt, CustomerList: Liste in einer GridView?So aktivieren Sie die automatische Sortierung von IEnumerable-Daten in GridView?

Kunde ist meine eigene stark typisierte Klasse und CustomerList ist eine Liste der Kunden.

Ich weiß, eine Möglichkeit besteht darin, die AllowSorting-Eigenschaft in der GridView auf true zu setzen und das OnSorting-Ereignis zu behandeln und eine in meiner CustomerList-Klasse definierte Sortiermethode aufzurufen.

Allerdings möchte ich eine Lösung, die automatisch in dem Sinne ist, dass ich nicht mit dem OnSorting-Ereignis behandeln muss, sollte es wie GridView behandelt automatische Sortierung für DataView, DataTable und DataSet.

Gibt es eine Schnittstelle, die ich in meiner CustomerList- oder Customer-Klasse implementieren muss, um diese Funktionalität zu aktivieren?

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

+0

Viele beziehen von Gridsortierverfahren und Sortier sie in DAL unter Verwendung dieser paramters .but u HAV Ausnahme kümmern in Einstellen SortExpression n Richtung erhalten gute Informationen zum Sortieren von GridView hier: http://msdn.microsoft.com/en-us/library/hwf94875(VS.80).aspx –

Antwort

7

Okay, ich es herausgefunden. Hier ist die Lösung:

  1. Verknüpfen Sie die BLL mit einer ObjectDataSource.
  2. Stellen Sie überladene Methoden für die select-Methode in Ihrem BLL bereit, um das Paging und Sortieren zu unterstützen.
  3. Geben Sie den SortParameterName in der ObjectDataSource an. Dies ist der Name des String-Eingabeparameters Ihrer Select-Methode in Ihrem BLL. siehe

Für weitere Informationen: http://msdn.microsoft.com/en-us/library/aa479347.aspx

Hier ist ein Beispiel, das ist nur ein quck Beispiel für Demo ich nicht Sortierrichtung unterstützt hat, oder optimiert den Code etc:

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; 
     } 


    } 
} 

In die ASPX-Seite:

<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> 

weitere Informationen finden Sie unter: http://msdn.microsoft.com/en-us/library/aa479347.aspx

+0

In der Beispiellösung verwende ich eine Arraylist, um die DB-Datensätze zu speichern und dann Einsparungen die Arraylist zu meinem BLL-Objekt, hätte ich direkt das BLL-Objekt verwenden können, um die DB-Datensätze zu speichern, aber in Zukunft möchte ich die Datenbankverbindung zu einer DAL verschieben, die zurückkehrt eine Array-Liste zu meinem BLL. – ace

0

Sie können dieselbe Logik in DAL verwenden, indem Sie den Sortierausdruck und die Richtung in Sitzungen speichern. e.Cancel = true

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

auch http://forums.asp.net/t/1344883.aspx

Verwandte Themen