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.
OriginalL'auteur Howard Pinsley | 2008-10-24
Vous devez vous connecter pour publier un commentaire.
J'ai récemment conquis silmilar des problèmes avec les colonnes dynamiques dans gridviews, peut-être cela aidera.
Premier tour le viewstate hors
Deuxième ajoutez les colonnes par programmation dans une fonction tiré dans le oninit événement
Enfin, j'ai utilisé les méthodes suivantes de la classe helper pour provoquer les cases à cocher pour instancier lors de la RowDataBound événement a débuté. Oui, certains de il est codé en dur.
Diable ici, c'est tout le code. Avoir à elle 🙂 Garantie que est, bla bla bla...
Enfin depuis que je suis tout juste d'obtenir mes pieds mouillés DotNet des conseils seraient appréciés [c'est à dire ne pas les déchirer moi aussi beaucoup 🙂 ]. Et oui "emprunté" le code initial à partir du web quelque part, désolé, je ne peux pas me rappeler du haut de ma tête 🙁
- Le feu ce en protected override void OnInit
-- Classe Helper
OriginalL'auteur Dining Philanderer
meilleure solution pour ajouter de la dynamique de la colonne pour afficher la grille (ASP) placé sur le code du projet par adresse ci-dessous :
s'il vous plaît vérifier :
http://www.codeproject.com/Articles/13461/how-to-create-columns-dynamically-in-a-grid-view
OriginalL'auteur Ali
diningphilanderer.myopenid.com a une approche similaire à ce que je recommanderais.
Le problème, c'est que vous avez à relier la grille à chaque fois qu'une publication se produit et, par conséquent, vous devez reconstruire les colonnes. J'aime avoir une méthode appelée BindGrid() qui efface d'abord les Colonnes GridView1.Les colonnes.Clear(); puis de les ajouter par programmation, puis définit la source de données et les appels databind. Assurez-vous d'avoir l'état d'affichage désactivé pour la grille et vous avez autogeneratecolumns = false;
OriginalL'auteur Marcus King
J'ai trouvé cela plus tôt aujourd'hui: TemplateField dans un GridView ne dispose pas de son ViewState restauré lors de la BoundFields sont insérés.
Ressemble à un bug que Microsoft n'a pas l'intention de fixation, de sorte que vous aurez à essayer l'une des solutions ci-dessus. Je vais avoir le même problème-j'ai une certaine DataBoundFields et certains TemplateFields, et après la publication, le TemplateField les colonnes de perdre leur contrôle et de données.
OriginalL'auteur Gyuri
J'ai écrit un court article sur le même sujet qui traitent de remplissage dynamique GridView colonne basée sur les colonnes sélectionnées par l'utilisateur dans le CheckBoxList de contrôle. Espérons que cela permettra à ceux qui recherchent la simple démonstration Comment générer GridView colonnes dynamiquement en fonction de la sélection de l'utilisateur?.
OriginalL'auteur Sheo Narayan
OriginalL'auteur helper
J'ai trouvé cette petite pépite dans la documentation, dans le cadre de la DataControlFieldCollection Classe.
Si vous utilisez le contrôle GridView ou de contrôle DetailsView, le DataControlField les objets qui sont créés automatiquement (par exemple, lorsque le AutoGenerateColumns propriété est vraie) ne sont pas stockées dans la mise à disposition du public une collection de champs. Vous ne pouvez accéder et de manipuler DataControlField objets qui ne sont pas générées automatiquement.
Je suppose que la réponse est de faire tout votre colonne de manipulation dans le code, et ensuite, votre démarche doit fonctionner correctement.
OriginalL'auteur Ken Pespisa
Au lieu de l'ajout dynamique de colonnes, pourriez-vous définir au début et cacher/montrer que nécessaire (soit Visible="false" ou de réglage de la CssClass de contrôle/en-tête/pied de page à une classe avec un "display: none;")? J'utilise cette méthode dans certains de mon code, y compris le modèle de colonnes, pas de problèmes.
OriginalL'auteur gfrizzle
Désolé, Decker. J'ai raté quelques points clés évidemment.. 🙂
Si c'est encore un problème pour vous, je me demande si cela fait une différence que vous avez dans votre modèle d'élément? Si vous venez de mettre du texte en y, puis actualiser la page plusieurs fois, le texte apparaît sur la première charge, puis de ne pas le deuxième?
Aussi, lorsque le problème se pose, est-il des balises html dans les cellules ou sont-ils complètement vide?
OriginalL'auteur Ken Pespisa