2010-03-31 5 views
14

¿Cómo puedo habilitar la clasificación automática de mi BLL que devuelve una lista, CustomerList: List in a GridView?¿Cómo habilitar la clasificación automática de datos IEnumerable en GridView?

El cliente es mi propia clase fuertemente tipada y CustomerList es una lista de clientes.

Sé que un enfoque es establecer la propiedad AllowSorting en verdadero en el GridView y manejar el evento OnSorting y llamar a un método de clasificación definido en mi clase CustomerList.

Sin embargo, me gustaría una solución que sea automática en el sentido de que no tengo que manejar el evento OnSorting, debería ser como la forma en que GridView maneja la clasificación automática para DataView, DataTable y DataSet.

¿Hay alguna interfaz que deba implementar en mi CustomerList o clase de cliente que permita esa funcionalidad?

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

+0

Mucha buena información sobre la ordenación de GridView aquí: http://msdn.microsoft.com/en-us/library/hwf94875(VS.80).aspx –

Respuesta

7

bien lo he descubierto. Aquí está la solución:

  1. Ate el BLL a un ObjectDataSource.
  2. Proporcione métodos sobrecargados para el método de selección en su BLL, para admitir paginación y clasificación.
  3. Proporcione SortParameterName en ObjectDataSource. Este es el nombre del parámetro de entrada de cadena de su método de selección en su BLL.

Para más información ver: http://msdn.microsoft.com/en-us/library/aa479347.aspx

He aquí un ejemplo, esto es sólo un ejemplo Quck de demostración No he apoyado dirección de ordenación, u optimizar el código, 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; 
     } 


    } 
} 

En la página 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> 

Para más información ver: http://msdn.microsoft.com/en-us/library/aa479347.aspx

+0

En la solución de ejemplo, estoy usando una lista de arrays para guardar los registros de BD y luego los ahorros. el arraylist a mi objeto BLL, podría haber usado directamente el objeto BLL para guardar los registros DB pero en el futuro quiero mover la conexión de la base de datos a un DAL, que devolverá una lista de arreglos para mi BLL. – ace

0

Puede hacer la misma lógica en DAL almacenando la sortexpresión y la dirección en las sesiones. Obtener SortExpression dirección n del método de clasificación gridview y no en la clasificación DAL usando estos parametros .Pero u hav a cuidar de excepción en el establecimiento de e.Cancel = true

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

también referirse http://forums.asp.net/t/1344883.aspx

Cuestiones relacionadas