¿Cómo ocultar columnas en un GridView de ASP.NET con columnas generadas automáticamente?

GridView1.Columns.Count siempre es cero incluso SqlDataSource1.DataBind ();

Pero Grid está bien

puedo hacer

for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++) 

Renombre los encabezados de solicitud aquí, pero

 GridView1.Columns[i].Visible = false; 

No puedo usarlo debido a GridView1.Columns.Count es 0.

Entonces, ¿cómo puedo ocultarlos?

Intenta poner e.Row.Cells[0].Visible = false; dentro del evento RowCreated de tu grilla.

 protected void bla_RowCreated(object sender, GridViewRowEventArgs e) { e.Row.Cells[0].Visible = false; // hides the first column } 

De esta forma, oculta automáticamente toda la columna.

No tiene acceso a las columnas generadas a través de grid.Columns[i] en el evento DataBound su gridview.

Nota: Esta solución solo funciona si sus columnas GridView se conocen con anticipación.

Parece que está utilizando un GridView con AutoGenerateColumns=true , que es el valor predeterminado. Recomiendo configurar AutoGenerateColumns=false y agregar las columnas manualmente:

        

Y solo incluya un BoundField para cada campo que desee que se muestre. Esto le dará la mayor flexibilidad en términos de cómo se muestran los datos.

La colección Columnas solo se llena cuando AutoGenerateColumns = false, y tú mismo generas manualmente las columnas.

Una buena solución para esto es rellenar dinámicamente la colección Columns, antes de configurar la propiedad DataSource y llamar a DataBind ().

Tengo una función que agrega manualmente las columnas en función de los contenidos del DataTable que quiero mostrar. Una vez que he hecho eso (y luego configuro DataSource y llamé DataBind (), puedo usar la colección Columns y el valor Count es correcto, y puedo activar y desactivar la visibilidad de la columna como inicialmente quise.

 static void AddColumnsToGridView(GridView gv, DataTable table) { foreach (DataColumn column in table.Columns) { BoundField field = new BoundField(); field.DataField = column.ColumnName; field.HeaderText = column.ColumnName; gv.Columns.Add(field); } } 

Estaba teniendo el mismo problema: necesito que las columnas AutogenerateColumns de mi control GridView sean ‘verdaderas’, debido a que están vinculadas por un origen de datos SQL, y por lo tanto necesitaba ocultar algunas columnas que no deben mostrarse en el control GridView.

La forma de lograr esto es agregar algún código al evento ‘_RowDataBound’ de su GridView, como este (supongamos que su ID de GridView es = ‘MyGridView’):

 protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Cells[].Visible = false; } } 

Eso hará el truco bien 😉

Intente esto para ocultar columnas en un GridView de ASP.NET con columnas generadas automáticamente, también funcionan RowDataBound / RowCreated.

 Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Or _ e.Row.RowType = DataControlRowType.Header Then // apply to datarow and header e.Row.Cells(e.Row.Cells.Count - 1).Visible = False // last column e.Row.Cells(0).Visible = False // first column End If End Sub Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowCreated If e.Row.RowType = DataControlRowType.DataRow Or _ e.Row.RowType = DataControlRowType.Header Then e.Row.Cells(e.Row.Cells.Count - 1).Visible = False e.Row.Cells(0).Visible = False End If End Sub 

Tienes que realizar GridView1.Columns[i].Visible = false; después de que la grilla ha sido databound.

@nCdy: index_of_cell debe reemplazarse por un entero, que corresponde al número de índice de la celda que desea ocultar en la colección .Cells.

Por ejemplo, supongamos que su GridView presenta las siguientes columnas:

NOMBRE DE CONTACTO | NÚMERO DE CONTACTO | CUSTOMERID | DIRECCIÓN LÍNEA 1 | CÓDIGO POSTAL

Y desea que la columna CUSTOMERID no se muestre. Como los índices de colecciones están basados ​​en 0, el índice de su columna CUSTOMERID es ……….? ¡Así es, 2! Muy bien. Ahora … adivina qué deberías poner ahí, para reemplazar ‘ index_of_cell ‘ ??

En el método rowdatabound para la 2da columna

 GridView gv = (sender as GridView); gv.HeaderRow.Cells[2].Visible = false; e.Row.Cells[2].Visible = false; 

Como dijeron otros, el evento RowDataBound o RowCreated debería funcionar, pero si desea evitar la statement de eventos y poner todo el código justo debajo de la llamada a la función DataBind, puede hacer lo siguiente:

 GridView1.DataBind() If GridView1.Rows.Count > 0 Then GridView1.HeaderRow.Cells(0).Visible = False For i As Integer = 0 To GridView1.Rows.Count - 1 GridView1.Rows(i).Cells(0).Visible = False Next End If 

Encontré que la respuesta de Steve Hibbert fue muy útil. El problema que el OP parecía describir es el de un AutoGeneratedColumns en un GridView.

En esta instancia, puede establecer qué columnas serán “visibles” y cuáles se ocultarán cuando vincule una tabla de datos en el código subyacente.

Por ejemplo: una vista de cuadrícula está en la página de la siguiente manera.

   

Y luego, en el código detrás de una rutina PopulateGridView se llama durante el evento de carga de página.

 protected void PopulateGridView() { DataTable dt = GetDataSource(); gv.DataSource = dt; foreach (DataColumn col in dt.Columns) { BoundField field = new BoundField(); field.DataField = col.ColumnName; field.HeaderText = col.ColumnName; if (col.ColumnName.EndsWith("ID")) { field.Visible = false; } gv.Columns.Add(field); } gv.DataBind(); } 

En lo anterior, GridView AutoGenerateColumns se establece en False y el código subyacente se usa para crear los campos enlazados. Uno es obtener el origen de datos como una tabla de datos a través del propio proceso que aquí etiqueto GetDataSource (). Luego uno recorre la colección de columnas de la tabla de datos. Si el nombre de la columna cumple un criterio dado, puede establecer la propiedad visible del campo enlazado en consecuencia. Luego vincula los datos a la vista de grilla. Esto es muy similar a AutoGenerateColumns = “Verdadero” pero puede tener criterios para las columnas. Este enfoque es más útil cuando los criterios para ocultar y des-ocultar se basan en el nombre de la columna.

Similar a la respuesta aceptada, pero permite el uso de ColumnNames y se une a RowDataBound ().

 Dictionary _headerIndiciesForAbcGridView = null; protected void abcGridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (_headerIndiciesForAbcGridView == null) // builds once per http request { int index = 0; _headerIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells .Cast() .ToDictionary(c => c.Text, c => index++); } e.Row.Cells[_headerIndiciesForAbcGridView["theColumnName"]].Visible = false; } 

No estoy seguro de si funciona con RowCreated ().