2009-09-15 10 views
8

Ho un gridview che utilizza colonne autogenerate, perché l'utente può selezionare le colonne da restituire in una query. Voglio nascondere la colonna con l'identità. Come nascondo la colonna generata automaticamente? Anche nell'evento di database, il conteggio delle colonne è zero.Nascondi colonna generata automaticamente in Gridview

risposta

14

ho scoperto come fare questo. È necessario utilizzare l'evento rowdatabound e nascondere la cella quando la riga è vincolata.

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, l'unica cosa da tenere a mente è che lo si cambia per i RowType appropriati. Ad esempio if (e.Row.RowType! = DataControlRowType.Pager) {e.Row.Cells [1] .Visible = false; } –

0

Vorrei controllare che la colonna fosse maggiore di zero, se così fosse, userei il fatto che la collezione di colonne può essere referenziata per nome di colonna così come integer per impostare la colonna di identità su nascosto.

+2

Auto generato le colonne non sono inclusi nella raccolta colonna. – SchwartzE

+0

Fallo nell'evento DataBound, a quel punto sono abbastanza sicuro che le colonne generate automaticamente si troveranno nella raccolta di colonne. – Lazarus

0

Ti serve? La cosa più semplice sarebbe non includerla nella query di selezione.

Se ne avete bisogno e sapere la posizione della colonna:

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

Ho bisogno dell'indice da includere come datakey per selezionare la riga. – SchwartzE

+0

questo non ha funzionato per me, gridView.Columns.Count è zero per le colonne generate automaticamente. – Somebody

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

ho violato attorno al problema con il seguente. Ho scritto funzioni di aiuto per darmi l'indice di colonna corretto e quindi per nascondere la colonna desiderata. Una volta che le funzioni di supporto sono a posto, è sufficiente chiamare l'unica linea dalla funzione 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

In questo modo nascondere l'intestazione di colonna generata automaticamente e la cella senza di essa guardando incasinato come il databound farà. Questa è la risposta corretta presa da 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

Problemi correlati