L'ajout de colonnes dynamiques d'un ASP.NET Gridview

Je vais avoir un problème de façon dynamique l'ajout de colonnes à un GridView. J'ai besoin de changer la mise en page -- c'est à dire les colonnes incluses-basé sur la valeur dans une liste déroulante. Lorsque l'utilisateur modifie la sélection dans cette liste, j'ai besoin de supprimer toutes les mais la première colonne et dynamiquement ajouter des colonnes supplémentaires en fonction de la sélection.

Je n'ai qu'une colonne définie dans mon balisage -- colonne 0, une colonne de modèle, dans lequel je déclare un lien et Sélectionnez une autre application spécifique LinkButton. Cette colonne doit toujours être là. Lorsque le ListBoxSelection est fait, j'ai supprimer toutes les mais la première colonne, puis rajouter les colonnes souhaitées (dans cet exemple, j'ai simplifié à toujours ajouter un "Titre" de la colonne). Voici une partie du code:

RemoveVariableColumnsFromGrid();
BoundField b = new BoundField();
b.DataField = "Title";
this.gvPrimaryListView.Columns.Add(b);
this.gvPrimaryListView.DataBind();


private void RemoveVariableColumnsFromGrid() {
    int ColCount = this.gvPrimaryListView.Columns.Count;
    //Leave column 0 -- our select and view template column
    while (ColCount > 1) {
        this.gvPrimaryListView.Columns.RemoveAt(ColCount - 1);
        --ColCount;
    }
}

La première fois que ce code s'exécute à travers, je vois à la fois la colonne statique et de la dynamique ajouté "Titre" de la colonne. Cependant, la prochaine fois qu'une sélection est faite, la première colonne est généré vide (rien). Je vois le titre de la colonne, et je vois la première colonne, à gauche -- mais il n'y a rien généré à l'intérieur. Dans le débogueur, je peux voir que gvPrimaryListView n'a en effet toujours d'avoir deux colonnes et le premier (index 0) est en effet un modèle de colonne. En fait, la colonne conserve même c'est la largeur qui est défini comme 165 pixels dans le balisage ci-dessous (à des fins de débogage).

Des idées?

<asp:GridView ID="gvPrimaryListView" runat="server" Width="100%" AutoGenerateColumns="false"
    DataKeyNames="Document_ID" EnableViewState="true" DataSourceID="odsPrimaryDataSource"
    AllowPaging="true" AllowSorting="true" PageSize="10" OnPageIndexChanging="activeListView_PageIndexChanging"
    AutoGenerateSelectButton="False" OnSelectedIndexChanged="activeListView_SelectedIndexChanged"
    Visible="true" OnRowDataBound="CtlDocList_RowDataBound" Font-Size="8pt" Font-Names="Helvetica">
    <Columns>
        <asp:TemplateField ShowHeader="false">
            <ItemTemplate>
                <asp:LinkButton EnableTheming="false" ID="CtlSelectDocRowBtn" runat="server" Text="Select"
                    CommandName="Select" CssClass="gridbutton" OnClick="RowSelectBtn_Click" />
                <asp:ImageButton EnableTheming="false" ID="DocViewBtn" runat="server" ImageUrl="../../images/ViewDoc3.png"
                    CssClass="gridbutton" CommandName="Select" OnClick="DocViewBtn_Click" />
            </ItemTemplate>
            <ItemStyle Width="165px" />
        </asp:TemplateField>
    </Columns>
    <EmptyDataTemplate>
        <asp:Label ID="Label6" runat="server" Text="No rows found." SkinID="LabelHeader"></asp:Label>
    </EmptyDataTemplate>
</asp:GridView>

Juste quelques informations supplémentaires.

Il n'a rien à voir avec le fait que c'est la première colonne, mais tout à voir avec le fait que c'est un TemplateField. Si j'ai mis un normal de la colonne vers la gauche (dans le balisage) et de modifier l'TemplateField colonne à droite, la première colonne rend bien, et que le (deuxième) TemplateField colonne disparaît.

Une autre chose étrange -- le problème ne se pose pas la première publication, OU encore LA SECONDE, mais elle commence à la troisième publication (postback) et se poursuit ensuite pour la suite des publications. Je suis perplexe.

Je suis en train de faire la même chose à ajouter dynamiquement des colonnes dans le code-behind, cependant, le problème est que si j'ajoute 20+ colonnes dynamiquement, pour chaque boucle ralentit l'ensemble de la page, avez-vous eu le même problème?

OriginalL'auteur Howard Pinsley | 2008-10-24