2009-09-15 24 views
8

Tengo una vista de cuadrícula que usa columnas autogeneradas, porque el usuario puede seleccionar las columnas para devolver en una consulta. Quiero ocultar la columna con la identidad. ¿Cómo oculto la columna autogenerada? Incluso en el evento de databound, las columnas cuentan como cero.Ocultar columna autogenerada en Gridview

Respuesta

14

he descubierto cómo hacer esto. Necesita usar el evento rowdatabound y ocultar la celda cuando la fila está enlazada.

Protected Sub ResultGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles ResultGrid.RowDataBound 
     e.Row.Cells(1).Visible = False 
End Sub 
+4

+1, lo único a tener en cuenta es que lo cambie por los RowTypes apropiados. Por ejemplo, si (e.Row.RowType! = DataControlRowType.Pager) {e.Row.Cells [1] .Visible = false; } –

0

Verificaría que la columna fuera mayor que cero, de ser así, utilizaría el hecho de que la colección de columnas puede referenciarse por nombre de columna así como también por enteros para ocultar la columna de identidad.

+2

automático genera columnas no están incluidos en la colección de columnas. – SchwartzE

+0

Hazlo en el evento DataBound en cuyo punto estoy bastante seguro de que las columnas autogeneradas estarán en la colección de columnas. – Lazarus

0

¿Lo necesita? Lo más simple sería no incluirlo en la consulta de selección.

Si lo necesita y conoce la posición de la columna:

gridView.Columns[KnownColumnIndex].Visible = false; 
+0

Necesito el índice para incluir como la clave de datos para seleccionar la fila. – SchwartzE

+0

esto no funcionó para mí, gridView.Columns.Count es cero para columnas generadas automáticamente. – Somebody

1
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    e.Row.Cells[1].Visible = false; 
} 
1

he hackeado en torno al tema con la siguiente. Escribí funciones de ayuda para darme el índice de columna correcto y luego para ocultar la columna deseada. Una vez que las funciones auxiliares están en su lugar, simplemente se llama al trazador de líneas de la función gridview_databound.

protected void grd_DataBound(object sender, EventArgs e) 
{ 
    try 
    { 
     HideAutoGeneratedGridViewColumn(grd, "nContractID");   
    } 
    catch (Exception ex) 
    { 

    } 
} 

    public int getColumnIndex(GridView grd, string sColumnName) 
{ 
    return getColumnIndex(grd, sColumnName, false); 
} 
/// <summary> 
/// Returns the columns index of the specified column based on the header text. 
/// </summary> 
/// <param name="grd"></param> 
/// <param name="sColumnName"></param> 
/// <returns></returns> 
public int getColumnIndex(GridView grd, string sColumnName, bool bAutoGeneratedColumn) 
{ 
    int ReturnVal = -1; 
    try 
    { 
     if (grd != null) 
     { 
      if (!bAutoGeneratedColumn) 
      { 
       #region Static Columns 
       if (grd.Columns.Count > 0) 
       { 
        for (int x = 0; x < grd.Columns.Count; x++) 
        { 
         if (grd.Columns[x] != null) 
         { 
          if (grd.Columns[x].HeaderText.ToLower() == sColumnName.ToLower()) 
          { 
           ReturnVal = x; 
           break; 
          } 
         } 
        } 
       } 
       #endregion 
      } 
      else 
      { 
       #region AutoGenerated Columns 
       if (grd.HeaderRow != null) 
       { 
        for (int x = 0; x < grd.HeaderRow.Cells.Count; x++) 
        { 
         if (grd.HeaderRow.Cells[x] != null) 
         { 
          if (grd.HeaderRow.Cells[x].Text.ToLower() == sColumnName.ToLower()) 
          { 
           ReturnVal = x; 
           break; 
          } 
         } 
        } 
       } 
       #endregion 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ReturnVal = - 1; 
     LogMessage("getColumnIndex(GridView grd, string sColumnName, bool bAutoGeneratedColumn) Error", ex.Message); 
    } 
    return ReturnVal; 
} 
/// <summary> 
/// Returns the columns index of the specified column based on the header text. 
/// </summary> 
/// <param name="sColumnName"></param> 
/// <param name="r"></param> 
/// <returns></returns> 
public int getColumnIndex(string sColumnName, GridViewRow r) 
{ 
    int ReturnVal = -1; 
    try 
    { 
     if (r != null) 
     { 
      if (r.Cells.Count > 0) 
      { 
       for (int x = 0; x < r.Cells.Count; x++) 
       { 
        if (r.Cells[x] != null) 
        { 
         if (((System.Web.UI.WebControls.DataControlFieldCell)(r.Cells[x])).ContainingField.HeaderText == sColumnName) 
         { 
          ReturnVal = x; 
          break; 
         } 
        } 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ReturnVal = -1; 
    } 
    return ReturnVal; 
} 
public void HideAutoGeneratedGridViewColumn(GridView grd, string sColumnName) 
{ 
    HideAutoGeneratedGridViewColumn(grd, getColumnIndex(grd, sColumnName, true)); 
} 
public void HideAutoGeneratedGridViewColumn(GridView grd, int nColumnIndex) 
{ 
    try 
    { 
     grd.HeaderRow.Cells[nColumnIndex].Visible = false; 
     for (int x = 0; x < grd.Rows.Count; x++) 
     { 
      grd.Rows[x].Cells[nColumnIndex].Visible = false; 
     } 
    } 
    catch (Exception ex) 
    { 
     LogMessage("HideAutoGeneratedGridViewColumn(GridView grd, int nColumnIndex) Error", ex.Message); 
    } 
} 
0

Esto ocultará el encabezado de la columna y autogenerado celular sin su aspecto desordenado como el enlace de datos va a hacer. Esta es la respuesta correcta toma de here

Protected Sub Gdvisitor_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Gdvisitor.RowCreated 
 
    If (e.Row.Cells.Count > 1) Then 
 
     e.Row.Cells(1).Visible = False 
 
    End If 
 
End Sub

Cuestiones relacionadas