web-dev-qa-db-fra.com

Comment masquer des colonnes dans un ASP.NET GridView avec des colonnes générées automatiquement?

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?

33
Cynede

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.

44
Jan Jongboom

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.

11
Eilon

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);
    }
}
11
Steve Hibbert

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

5
Werner Moecke

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
3
markmolamhoi

Vous devez exécuter le GridView1.Columns[i].Visible = false; après que la grille ait été liée aux données.

2
ddc0660

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;
1
guestdj

@ 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 ' ??

1
Werner Moecke

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.

0
TennesseePaul

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 ().

0
crokusek

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
0
Matt Roy