2010-03-31 12 views
14

Come posso abilitare l'ordinamento automatico del mio BLL che restituisce un elenco, Elenco clienti: Elenco in un GridView?Come abilitare l'ordinamento automatico dei dati IEnumerable in GridView?

Il cliente è la mia classe fortemente tipizzata e CustomerList è un elenco di clienti.

Un approccio è impostare la proprietà AllowSorting su true in GridView e gestire l'evento OnSorting e chiamare un metodo di ordinamento definito nella classe CustomerList.

Tuttavia, vorrei una soluzione automatica, nel senso che non devo gestire l'evento OnSorting, dovrebbe essere come GridView gestisce l'ordinamento automatico per DataView, DataTable e DataSet.

C'è un'interfaccia che devo implementare sulla mia lista clienti o classe cliente che abiliterà tale funzionalità?

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

+0

sacco di buone informazioni sull'ordinamento di GridView qui: http://msdn.microsoft.com/en-us/library/hwf94875(VS.80).aspx –

risposta

7

Ok ho capito. Ecco la soluzione:

  1. Legare il BLL a un ObjectDataSource.
  2. Fornire metodi sovraccaricati per il metodo select nel BLL, per supportare il paging e l'ordinamento.
  3. Fornire SortParameterName in ObjectDataSource. Questo è il nome del parametro di input della stringa del metodo selezionato nel BLL.

Per ulteriori informazioni si veda: http://msdn.microsoft.com/en-us/library/aa479347.aspx

Ecco un esempio, questo è solo un esempio quck per demo non ho appoggiato direzione di ordinamento, o ottimizzate il codice ecc:

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

Per ulteriori informazioni si veda: http://msdn.microsoft.com/en-us/library/aa479347.aspx

+0

Nella soluzione di esempio sto usando un arraylist per salvare i record del DB e quindi risparmi l'array al mio oggetto BLL, avrei potuto usare direttamente l'oggetto BLL per salvare i record del DB, ma in futuro voglio spostare la connessione del database a un DAL, che restituirà una lista di array per il mio BLL. – ace

0

È possibile eseguire la stessa logica in DAL memorizzando la sortexpressione e la direzione nelle sessioni. Ottenere SortExpression direzione n da GridView metodo di ordinamento e non l'ordinamento in DAL utilizzando questi paramters .ma u hav a prendersi cura di eccezione nella creazione e.Cancel = true riferimento

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

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

Problemi correlati