Come hide le colonne in un GridView di ASP.NET con colonne generate automaticamente?

GridView1.Columns.Count è sempre zero anche SqlDataSource1.DataBind ();

Ma Grid va bene

posso fare

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

Rinomino qui le intestazioni delle richieste ma

 GridView1.Columns[i].Visible = false; 

Non posso usarlo a causa di GridView1.Columns.Count è 0.

Quindi, come posso nasconderli?

Prova a inserire e.Row.Cells[0].Visible = false; all’interno dell’evento RowCreated della tua griglia.

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

In questo modo si nasconde automaticamente l’intera colonna.

Non hai accesso alle colonne generate tramite grid.Columns[i] nell’evento DataBound di gridview.

Nota: questa soluzione funziona solo se le colonne GridView sono conosciute in anticipo.

Sembra che tu stia usando una GridView con AutoGenerateColumns=true , che è l’impostazione predefinita. Consiglio di impostare AutoGenerateColumns=false e aggiungere le colonne manualmente:

        

E includere solo un BoundField per ogni campo che si desidera visualizzare. Questo ti darà la massima flessibilità in termini di visualizzazione dei dati.

La raccolta Columns viene popolata solo quando AutoGenerateColumns = false e tu stesso generi manualmente le colonne.

Una buona soluzione per questo è compilare dynamicmente la raccolta di Colonne da soli, prima di impostare la proprietà DataSource e chiamare DataBind ().

Ho una funzione che aggiunge manualmente le colonne in base al contenuto del DataTable che voglio visualizzare. Una volta che l’ho fatto (e poi ho impostato DataSource e chiamato DataBind (), posso usare la collezione Columns e il valore Count è corretto, e posso triggersre e distriggersre la visibilità della colonna come inizialmente volevo.

 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); } } 

Stavo avendo lo stesso problema – ho bisogno che il mio controllo GridView AutogenerateColumns fosse ‘true’, perché era legato da un’origine dati SQL, e quindi avevo bisogno di hide alcune colonne che non devono essere visualizzate nel controllo GridView.

Il modo per farlo è aggiungere del codice all’evento ‘_RowDataBound’ di GridView, come questo (supponiamo che l’ID di GridView sia = ‘MyGridView’):

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

Questo farà il trucco bene 😉

Prova questo per hide le colonne in un GridView di ASP.NET con colonne generate automaticamente, sia il lavoro 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 

Devi eseguire GridView1.Columns[i].Visible = false; dopo che la griglia è stata catalogata.

@nCdy: index_of_cell deve essere sostituito da un numero intero, corrispondente al numero di indice della cella che desideri hide nella raccolta .Cells.

Ad esempio, supponiamo che il tuo GridView presenti le seguenti colonne:

NOME CONTATTO | NUMERO DI CONTATTO | CUSTOMERID | LINEA INDIRIZZI 1 | CODICE POSTALE

E vuoi che la colonna CUSTOMERID non venga visualizzata. Poiché gli indici delle raccolte sono basati su 0, l’indice della colonna CUSTOMERID è ……….? Esatto, 2 !! Molto bene. Ora … indovina cosa dovresti mettere lì, per sostituire ‘ index_of_cell ‘ ??

Nel metodo rowdatabound per la seconda colonna

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

Come detto da altri, l’evento RowDataBound o RowCreated dovrebbe funzionare ma se si desidera evitare la dichiarazione di eventi e inserire l’intero codice appena sotto la chiamata della funzione DataBind, è ansible effettuare quanto segue:

 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 

Ho trovato la risposta di Steve Hibbert molto utile. Il problema che l’OP sembrava descrivere è quello di una colonna AutoGenerated su GridView.

In questa istanza è ansible impostare quali colonne saranno “visibili” e quali saranno nascoste quando si associa una tabella di dati nel codice sottostante.

Ad esempio: Un Gridview è nella pagina come segue.

   

Quindi nel codice dietro una routine PopulateGridView viene chiamata durante l’evento di caricamento della pagina.

 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(); } 

In quanto sopra GridView AutoGenerateColumns è impostato su False e il codebehind viene utilizzato per creare i campi associati. Uno sta ottenendo l’origine dati come databile attraverso il proprio processo che qui ho etichettato GetDataSource (). Quindi si esegue il ciclo attraverso la collezione di colonne del datatable. Se il nome della colonna soddisfa un determinato criterio, è ansible impostare di conseguenza la proprietà visibile del campo associato. Quindi si associano i dati al gridview. Questo è molto simile a AutoGenerateColumns = “True” ma puoi avere i criteri per le colonne. Questo approccio è molto utile quando i criteri per hide e non hide si basano sul nome della colonna.

Simile alla risposta accettata, ma consente l’uso di ColumnNames e associa 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; } 

Non sono sicuro che funzioni con RowCreated ().