tiempo - ¿Cómo ocultar columnas en un GridView de ASP.NET con columnas generadas automáticamente?
ocultar columna gridview en tiempo de ejecucion (11)
@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 '' ??
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?
Como dijeron otros, el evento RowDataBound o RowCreated debería funcionar, pero si desea evitar la declaración 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
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;
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.
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" >
</asp:GridView>
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.
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[<index_of_cell>].Visible = false;
}
}
Eso hará el truco bien ;-)
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.
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
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);
}
}
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:
<asp:GridView runat="server" ID="MyGridView"
AutoGenerateColumns="false" DataSourceID="MySqlDataSource">
<Columns>
<asp:BoundField DataField="Column1" />
<asp:BoundField DataField="Column2" />
<asp:BoundField DataField="Column3" />
</Columns>
</asp:GridView>
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.
Similar a la respuesta aceptada, pero permite el uso de ColumnNames y se une a RowDataBound ().
Dictionary<string, int> _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<TableCell>()
.ToDictionary(c => c.Text, c => index++);
}
e.Row.Cells[_headerIndiciesForAbcGridView["theColumnName"]].Visible = false;
}
No estoy seguro de si funciona con RowCreated ().
Tienes que realizar GridView1.Columns[i].Visible = false;
después de que la grilla ha sido databound.