2008-11-05 11 views
3

J'essaie de faire ce qui suit dans ASP.NET 3.5. Fondamentalement, je lie une LINQDataSource à un DataList. Il y a une propriété appelée "Supprimé" et si c'est vrai, je veux afficher un balisage différent. Le code suivant génère des erreurs:DataList, instructions conditionnelles dans <ItemTemplate>?

<asp:DataList runat="server"> 
    <ItemTemplate> 
     <% If CBool(Eval("Deleted")) Then%> 
      ... 
     <% Else%> 
      ... 
     <% End If%> 
    </ItemTemplate> 
</asp:DataList> 

Est-ce possible? Si non, quelles sont les alternatives?

+1

vous devriez vraiment regarder dans la solution @ Aydsman, il est supérieur à la réponse acceptée lorsque vous avez plusieurs contrôles dans votre

+0

@roman Merci, les deux sont d'excellentes réponses. Mais je pense que je préfère la solution de RandomNoob pour utiliser l'événement RowDataBound puisque Eval peut être évité complètement. – Kevin

Répondre

1

Pourquoi ne pas simplement utiliser l'événement RowDataBound et vérifier la valeur de vos champs alors? RowDatabound est idéal pour les situations dans lesquelles vous souhaitez modifier les données d'une grille en fonction des valeurs du jeu de résultats.

RowDataBound Event from MSDN

+0

Une réponse devrait commencer par un oui ou un non et une explication. Et puis éventuellement fournir des alternatives. Pour répondre à votre question "pourquoi?" - "Parce que je ne dois pas mélanger le code back-end avec la logique de l'interface utilisateur, car je veux une logique d'interface utilisateur dans le balisage et non dans le code back-end." –

+0

@EdwardOlamisan ceci a été répondu en 2008. Encore 2008. Laissez cela couler pendant un moment. – kd7

1

Peut-être utiliser l'événement ItemDataBound d'un datalist. Pour gridview c'est l'événement rowdatabound qui est idéal pour modifier l'affichage des valeurs basées sur d'autres valeurs dans le jeu de résultats. ItemDataBound event

Donc, fondamentalement, sur itemdatabound, vous pouvez jouer avec vos conditionnels. Encore une fois, il s'agit d'une supposition éclairée, car je l'ai généralement fait avec l'événement RowDataBound sur gridview.

+0

Je suis d'accord avec la supposition éclairée, et le lien vers l'événement ItemDataBound fait un bon travail de l'expliquer. La route de Ben Griswold fonctionnera également; Cependant, je le trouve un peu plus propre et plus flexible pour se connecter à l'événement ItemDataBound de DataList comme mentionné. –

5

Une option comme solution de rechange serait d'utiliser un panneau.

<asp:DataList runat="server"> 
    <ItemTemplate> 
     <asp:Panel Visible="<%# Eval("Deleted") %>"> 
      ...(deleted content here)... 
     </asp:Panel> 
     <asp:Panel Visible="<%# Not Eval("Deleted") %>"> 
      ...(other content here)... 
     </asp:Panel> 
    </ItemTemplate> 
</asp:DataList> 
+1

façon de le faire !!! –

+0

Meilleure solution !!! Pour contourner l'erreur "L'étiquette du serveur n'est pas bien formée", remplacez les guillemets externes de guillemets simples par des guillemets simples comme ceci: Visible = '<% # Eval ("Supprimé")%>' –

10

Je suggérerais garder le code avant maigre et écrire le texte souhaité par un résultat de la fonction:

<asp:DataList runat="server"> 
    <ItemTemplate> 
     <%# GetText(Container.DataItem) %> 
    </ItemTemplate> 
</asp:DataList> 

Et le code-behind:

protected static string GetText(object dataItem) 
{   
    if (Convert.ToBoolean(DataBinder.Eval(dataItem, "Deleted")) 
     return "Deleted"; 

    return "Not Deleted"; 
} 

Je l'espère aide.

+0

Salut Ben, Merci beaucoup ce. C'est parfait et utile. – Matrich