GridView1.Columns.Count est toujours égal à zéro, même SqlDataSource1.DataBind ();
Mais la grille est ok
Je peux faire
for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++)
Je renomme les en-têtes de requête ici Mais
GridView1.Columns[i].Visible = false;
Je ne peux pas l'utiliser à cause de GridView1.Columns.Count est 0.
Alors, comment puis-je les cacher?
Essayez de placer le e.Row.Cells[0].Visible = false;
dans l'événement RowCreated
de votre grille.
protected void bla_RowCreated(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Visible = false; // hides the first column
}
De cette façon, il masque automatiquement toute la colonne.
Vous n'avez pas accès aux colonnes générées via grid.Columns[i]
dans l'événement DataBound
de votre gridview.
Remarque: cette solution ne fonctionne que si vos colonnes GridView
sont connues à l'avance.
On dirait que vous utilisez une GridView
avec AutoGenerateColumns=true
, qui est la valeur par défaut. Je recommande de configurer AutoGenerateColumns=false
et d'ajouter les colonnes manuellement:
<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>
Et incluez seulement une BoundField
pour chaque champ que vous voulez afficher. Cela vous donnera la plus grande flexibilité quant à la manière dont les données sont affichées.
La collection Columns est uniquement renseignée lorsque AutoGenerateColumns = false et que vous générez vous-même les colonnes manuellement.
Une bonne solution consiste à renseigner vous-même la collection Columns de manière dynamique, avant de définir la propriété DataSource et d’appeler DataBind ().
J'ai une fonction qui ajoute manuellement les colonnes en fonction du contenu du DataTable que je veux afficher. Une fois que j'ai fait cela (puis que j'ai défini DataSource et appelé DataBind (), je peux utiliser la collection Columns et la valeur Count est correcte, et je peux activer et désactiver la visibilité des colonnes comme je le souhaitais initialement.
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);
}
}
J'avais le même problème: il faut que les commandes AutogenerateColumns de mon contrôle GridView soient vraies, car elles sont liées par une source de données SQL. J'ai donc dû masquer certaines colonnes qui ne doivent pas être affichées dans le contrôle GridView.
Pour ce faire, ajoutez du code à l'événement '_RowDataBound' de votre GridView, tel que celui-ci (supposons que l'ID de votre GridView soit = 'MyGridView'):
protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[<index_of_cell>].Visible = false;
}
}
Ça va très bien faire l'affaire ;-)
Essayez ceci pour masquer des colonnes dans un GridView ASP.NET avec des colonnes générées automatiquement, les deux travaux 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
Vous devez exécuter le GridView1.Columns[i].Visible = false;
après que la grille ait été liée aux données.
Dans la méthode rowdatabound
pour la 2e colonne
GridView gv = (sender as GridView);
gv.HeaderRow.Cells[2].Visible = false;
e.Row.Cells[2].Visible = false;
@ nCdy: index_of_cell doit être remplacé par un entier correspondant au numéro d'index de la cellule que vous souhaitez masquer dans la collection .Cells.
Par exemple, supposons que votre GridView présente les colonnes suivantes:
NOM DU CONTACT | NUMÉRO DE CONTACT | CUSTOMERID | ADRESSE LIGNE 1 | POST CODE
Et vous souhaitez que la colonneCUSTOMERIDne soit pas affichée . Comme les index des collections sont basés sur 0, votre indexCUSTOMERIDest celui de .......... C'est vrai, 2 !! Très bien . Maintenant ... devinez quoi vous devriez mettre dedans, pour remplacer ' index_of_cell ' ??
J'ai trouvé la réponse de Steve Hibbert très utile. Le problème que l'OP semblait décrire est celui d'un AutoGeneratedColumns sur un GridView.
Dans ce cas, vous pouvez définir quelles colonnes seront "visibles" et lesquelles seront masquées lorsque vous lierez une table de données dans le code qui se trouve derrière.
Par exemple: Un Gridview est sur la page comme suit.
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" >
</asp:GridView>
Et puis dans le code derrière une routine PopulateGridView est appelée pendant l'événement de chargement de page.
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();
}
Dans ce qui précède, GridView AutoGenerateColumns est défini sur False et le codebehind est utilisé pour créer les champs liés. L’une consiste à obtenir la source de données sous forme de données via son propre processus, que j’ai nommé GetDataSource (). Ensuite, on parcourt la collection de colonnes du datatable. Si le nom de la colonne répond à un critère donné, vous pouvez définir la propriété visible du champ lié en conséquence. Ensuite, vous liez les données à la grille. Ceci est très similaire à AutoGenerateColumns = "True" mais vous obtenez des critères pour les colonnes. Cette approche est particulièrement utile lorsque les critères de masquage et de dé-masquage sont basés sur le nom de la colonne.
Similaire à la réponse acceptée mais autorise l'utilisation de ColumnNames et lie 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;
}
Vous ne savez pas si cela fonctionne avec RowCreated ().
Comme d'autres l'ont dit, les événements RowDataBound ou RowCreated devraient fonctionner, mais si vous souhaitez éviter la déclaration d'événements et placer le code entier juste en dessous de l'appel de la fonction DataBind, vous pouvez effectuer les opérations suivantes:
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