2009-03-26 21 views
7

Parece que no hay forma de manipular las columnas de un Gridview si AutoGenerateColumns = true. Aquí está mi situación:¿Alguna forma de manipular las columnas en GridView con AutoGenerateColumns = true?

Tengo un GridView genérico que muestra los resultados de varias consultas LINQ diferentes según lo que el usuario seleccione. Me gusta el hecho de que AutoGenerateColumns funciona como debería y no tengo que especificar todas las columnas de BoundField, TemplateField, etc ...

Además de eso, también estoy agregando otras columnas programáticamente según sea necesario. Las columnas que se agregan mediante programación se representan a la izquierda de las columnas autogeneradas. ¿Qué pasa si quiero moverlos a la derecha?

GridView.Columns.Count solo cuenta los que están programados, no autogenerados, por lo que no puedo reorganizar las columnas que quiero. Puedo conectar el evento RowDataBound y "ocultar" algo si es necesario, pero no puedo reorganizarlo.

¿Tengo que renunciar a AutoGeneratedColumns = true y presentarlos con BoundFields para cada consulta? ¿Hay algo que pueda hacer?

Respuesta

3

Puede manipular las cosas en los datos con destino así:

Private Sub MyGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Me.RowDataBound 
    If Me.AutoGenerateColumns = True Then 
    If e.Row.RowType = DataControlRowType.DataRow Then 
      e.row.cells.add(some code here to add your special column) 
    End If 
    End If 
End Sub 

Habría que crear su propio encabezado a pero es muy factible.

0

No creo que sea posible controlar las columnas autogeneradas, al menos con el GridView actual.

mediante la creación de un nuevo control que hereda de la GridView, es posible que tenga un poco más de control de la forma en que se crean las columnas, pero no estoy invariablemente si es factible (que podría valer la pena a la investigación)

de la documentación de MSDN:

Cuando la propiedad AutoGenerateColumns se establece en true, un objeto AutoGeneratedField se crea automáticamente para cada campo del origen de datos. Cada campo se visualiza como una columna en el control GridView en el orden en que los campos aparecen en la fuente de datos. Esta opción proporciona un modo conveniente para visualizar todos los campos en la fuente de datos ; sin embargo, tiene un control limitado de cómo se muestra un campo de columna generado automáticamente o se comporta .

Los campos de columna enlazada generados automáticamente no se agregan a la colección Columnas .

lugar de dejar que el control GridView automáticamente generan los campos de columna, puede definir manualmente los campos de columna mediante el establecimiento de los AutoGenerateColumns propiedad en false y luego la creación de una colección de columnas personalizado. Además a los campos de columna enlazada, también puede mostrar un campo de botón de la columna, un campo de columna casilla de verificación , un campo de orden, un campo de columna hipervínculo, un campo de imagen , o un campo de columna en función de su propia personalizada plantilla definida Para obtener más información sobre , consulte Columnas.

1

La respuesta de Brendan me recordó que tenía esto por ahí .. Bueno para el formateo.

GridView ...

<asp:GridView .... OnRowDataBound="myGridView_RowDataBound"> 

Código Detrás ...

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     ' Display the data in italics. 
     e.Row.Cells(1).Text = "<i>" & e.Row.Cells(1).Text & "</i>" 
    End If 
End Sub 
0

Si alguien todavía tiene que responder: sólo tiene que utilizar e.Row.Cells.Count de RowDataBound.

0

Basándose en la respuesta aceptada, se puede crear un diccionario para asignar nombres de columna a indices de columna en el evento RowDataBound para permitir el uso de nombres de encabezado. También se muestra un intercambio de columna.

Dictionary<string, int> _columnIndiciesForAbcGridView = null; 

protected void detailsReportGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (_columnIndiciesForAbcGridView == null) 
    { 
     int index = 0; 
     _columnIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells 
      .Cast<TableCell>() 
      .ToDictionary(c => c.Text, c => index++); 
    } 

    // Add a column, this shifts the _columnIndiciesForAbcGridView though. 

    TableCell cell = new TableCell(); 
    cell.Text = "new Column"; 
    e.Row.Cells.AddAt(2, cell); 

    // Swap 0 and 1 

    int c0 = _columnIndiciesForAbcGridView["ConfigId"]; 
    int c1 = _columnIndiciesForAbcGridView["CreatedUtc"]; 

    string text = e.Row.Cells[c0].Text; 
    e.Row.Cells[c0].Text = e.Row.Cells[c1].Text; 
    e.Row.Cells[c1].Text = text; 
} 
Cuestiones relacionadas