2010-03-31 4 views
14

Comment puis-je activer le tri automatique de ma BLL qui renvoie une liste, CustomerList: List dans un GridView?Comment activer le tri automatique des données IEnumerable dans GridView?

Le client est ma propre classe fortement typée et CustomerList est une liste de clients.

Je sais qu'une approche consiste à définir la propriété AllowSorting sur true dans GridView et gérer l'événement OnSorting et appeler une méthode de tri définie dans ma classe CustomerList.

Cependant, je voudrais une solution qui est automatique dans le sens où je n'ai pas à gérer l'événement OnSorting, cela devrait ressembler à la façon dont GridView gère le tri automatique pour DataView, DataTable et DataSet.

Existe-t-il une interface que je dois implémenter sur ma classe CustomerList ou Customer qui activera cette fonctionnalité?

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

+0

Beaucoup de bonne information sur le tri de GridView ici: http://msdn.microsoft.com/en-us/library/hwf94875(VS.80).aspx –

Répondre

7

D'accord, je compris. Voici la solution:

  1. Reliez le BLL à une ObjectDataSource.
  2. Fournissez des méthodes surchargées pour la méthode select dans votre BLL afin de prendre en charge la pagination et le tri.
  3. Indiquez le SortParameterName dans ObjectDataSource. C'est le nom du paramètre d'entrée de chaîne de votre méthode select dans votre BLL.

Pour plus d'informations, voir: http://msdn.microsoft.com/en-us/library/aa479347.aspx

Voici un exemple, voici juste un exemple quck pour démonstration, je ne soutiens pas la direction de tri, ou optimisé le etc code:

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


    } 
} 

En la page 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> 

Pour plus d'informations, voir: http://msdn.microsoft.com/en-us/library/aa479347.aspx

+0

Dans la solution de l'exemple, j'utilise un arraylist pour enregistrer les enregistrements DB, puis des économies l'arraylist à mon objet BLL, j'aurais pu directement utilisé l'objet BLL pour enregistrer les enregistrements DB mais à l'avenir je veux déplacer la connexion de base de données à un DAL, qui retournera une liste de tableau à mon BLL. – ace

0

Vous pouvez faire la même logique dans DAL en stockant le sortexpression et la direction dans les sessions. Obtenir direction SortExpression n à partir de la méthode de tri GridView et ne DAL tri en utilisant ces paramters .mais u hav prendre soin de l'exception dans la mise e.Cancel = true

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

voir aussi http://forums.asp.net/t/1344883.aspx

Questions connexes