Comment puis-je cacher un répéteur ASP.NET C# si la source de données contient pas d'éléments?
J'ai un ASP.NET page qui utilise un répéteur imbriqué dans un autre répéteur pour créer une liste de données. C'est à l'effet suivant:
<asp:Repeater>
<ItemTemplate>
<span><%#Eval("Data1") %></span>
<!-- and many more -->
<asp:Repeater DataSource='<%#Eval("Data2")%>'>
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%#Container.DataItem%></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Dans l' (C#), le code-behind, je suis à la base à l'aide de LINQ pour extraire une liste d'informations à partir d'un document XML et de lier l'information à la première répétition.
La recherche de la réponse à cette question, il semble que la méthode est de déterminer si les données pour la imbriquée répéteur est vide. Si c'est le cas, vous définissez la visibilité de la répétition de faux.
Malheureusement, je n'ai pas été en mesure de déterminer comment le faire en ligne, et non pas dans le code-behind (car il ne fonctionnera pas nécessairement pour ce que je fais).
Depuis mes pages ne sont pas de la validation de maintenant, parce que l'ul finit par être vide pour les éléments sans Data2, et parce que je tiens à conserver à l'aide d'une liste non ordonnée, je sollicite votre aide.
Des idées?
Merci!
Mise à JOUR:
Si cela peut aider, car il pourrait très bien être possible de le faire dans le code-behind, LINQ est quelque chose à cet effet:
var x = from y in z
select new {
Data1 = d,
//etcetera
Data2 = (from j in k
where j.Value != String.Empty
select j.Value).ToList()
};
blah.DataSource = x;
blah.DataBind();
OriginalL'auteur James Skemp | 2008-11-29
Vous devez vous connecter pour publier un commentaire.
Ce ne sera pas cacher le répéteur complètement, mais vous pouvez sous-classe le relais de contrôle de sorte qu'il comprend un GridView-comme vide du modèle de données:
Vous pouvez l'utiliser dans votre .aspx comme ceci:
OriginalL'auteur Matt Peterson
Essayez quelque chose comme:
pour la imbriquée répéteur
OriginalL'auteur Aleris
Pourquoi ne pas utiliser un ListView? Il offre la plupart des fonctionnalités, y compris un EmptyDataTemplate.
OriginalL'auteur Michael Silver
utiliser ceci:
OriginalL'auteur Reza
Lorsque vous obtenez votre requête LINQ exécuté, de vérifier sa propriété Count (en fournissant à ses une liste de quelque sorte). Si son 0, alors il suffit de tourner la propriété Visible à false.
Dans le cas où c'est possible, j'ai ajouté le LINQ pour la question d'origine.
OriginalL'auteur
Autant que je sache, vous devez le faire via le code-behind, il suffit d'utiliser l'événement ItemDataBound à manipuler, vous pouvez laisser presque tout comme l'est, il suffit tout simplement de saisir la logique qui obtient le jeu de données et détermine si elle a des entrées, si pas masquer le répéteur.
OriginalL'auteur Mitchel Sellers
Je ne pense pas que ce que tu fais, c'est aller au travail j'ai une erreur quand j'essaye de mettre de la source de données que vous êtes en train de le faire; cependant, dans le code-behind pour ce faire:
En supposant que vous avez ajouté à un auditeur de votre parent repeater ItemDataBoundEvent, alors vous aurez besoin de changer votre requête linq légèrement pour ne pas utiliser un type anonyme (Créer une classe protégée qui a vos propriétés) En mjy cas, je suis en utilisant dto comme le nom de la classe.
J'aimerais savoir pourquoi vous pensez que vous ne pouvez pas résoudre cela dans le code derrière.
OriginalL'auteur JoshBerke
Je sais que c'est un vieux thread, et la réponse ci-dessus est une très belle solution, mais j'ai eu un problème similaire et ont trouvé une autre varier la solution la plus simple que je pensais que je voudrais partager également. Cela confirme l'amende juste et affiche les mêmes.
Il suffit de changer votre modèle de pied de page:
Ou si votre utilisation de tables:
Espère que ça aide quelqu'un!
OriginalL'auteur
Dans le
OnItemDataBound
événement, définir la visibilité à false siItemType
est unHeader
et définir la visibilité à true siItemType
est unItem
.OriginalL'auteur Brian