2012-01-23 18 views
6

Pueden existir preguntas similares, pero ninguna de ellas parece ser útil. Así que trataré de explicar un caso más específico, y veré si alguien puede ayudarme :)Cómo reordenar columnas en gridview dinámicamente

Aquí está la cosa, tengo una vista en cuadrícula con campos de plantilla, y quiero que el usuario especifique el orden de esas columnas son exhibidos. Entonces, el usuario crea una vista y decide qué columna mostrar primero, segundo, y así sucesivamente.

Básicamente, necesito cambiar el orden de las columnas justo después de que la cuadrícula se carga con datos.

Sonidos fáciles ¿eh? Bueno, aparentemente no lo es. Al menos no pude lograr eso por el momento.

Algunas notas: - Por supuesto, tengo AutogenerateColumns establecido en falso. - Cambiar el orden de las columnas de selección sql no funcionará debido al elemento anterior. - Y me gustaría no generar las columnas por el código.

¿Alguna idea?

+0

Aquí se muestra cómo reordenar las columnas de forma dinámica: http://stackoverflow.com/a/28611217/215752 – Hogan

Respuesta

18

Puede modificar la colección Columns de Gridview en su código subyacente. Entonces, una forma de hacerlo es eliminar la columna de su posición actual en la colección y luego volver a insertarla en la nueva posición.

Por ejemplo, si desea mover la segunda columna para que sea la primera columna se podía hacer:

var columnToMove = myGridView.Columns[1]; 
myGridView.Columns.RemoveAt(1); 
myGridView.Columns.Insert(0, columnToMove); 

Si tiene que mover a todos ellos en torno al azar, entonces es posible que desee para tratar de clonar el colección de campo, desactive la colección en el GridView, y luego a todos volver a insertar en el orden que desee que estén en.

var columns = myGridView.Columns.CloneFields(); 
myGridView.Columns.Clear(); 
myGridView.Columns.Add(columns[2]); 
myGridView.Columns.Add(columns[0]); 
etc.. 

no estoy 100% seguro de si todo esto va a funcionar después de la unión a los datos , entonces, a menos que haya una razón para no hacerlo, lo haría en Page_Init o en algún lugar antes del enlace gramo.

+0

¡Funcionó muy bien! Pero solo una cosa ... Tengo un botón en esa grilla, donde aplico algo de lógica en el evento OnRowCommand. Bueno, ahora, después de que las filas se reordenan, ese método nunca se ejecuta y algunas de las columnas están vacías después de presionar el botón ... – Ragalante

+0

He encontrado usando 'myGridView.Columns.CloneFields();' hace un clon de todos los objetos de columna también (lo que puede ser un problema). Por ejemplo, si tiene su propia columna personalizada que hereda de 'BoundField', clonará su objeto a' BoundField'. Para solucionar esto, haz lo siguiente: 'myGridView.Columns.OfType (). ToList();' ya que esto solo creará una nueva colección mientras se mantienen las referencias a los objetos originales de la columna. –

Cuestiones relacionadas