2009-03-23 7 views
1

Dans un GridView, je suis en train de montrer soit une colonne ou un autre en utilisant une propriété booléenne publique:ASP.net: Dynamic BoundFields

<Columns> 
    ... 

    <asp:BoundField Visible="<%= !ShowPurchaseDate %>" DataField="Published" HeaderText="Publicerad" SortExpression="PriceRange" DataFormatString="{0:yyyy.MM.dd}" HtmlEncode="false" /> 

    <asp:BoundField Visible="<%= ShowPurchaseDate %>" DataField="OrderDate" HeaderText="Köpt" SortExpression="OrderDate" DataFormatString="{0:yyyy.MM.dd}" HtmlEncode="false" /> 

    ... 
    </Columns> 

Mais je reçois un message d'erreur indiquant que ce n'est pas possible de créer un System.Boolean à partir d'une chaîne contenant <%! ShowPurchaseDate%> pour la propriété Visisble.

Comment puis-je obtenir ceci?

MISE À JOUR:

<% # ShowPurchaseDate%> ne fonctionne pas non plus, car il n'y a pas de liaison de données en cours. L'utilisation d'une fonction protégée ne fonctionne pas non plus (même message d'erreur qu'avec la propriété).

+0

Avez-vous renvoyé une chaîne de la méthode? – Dan

+0

Puisque c'est un BoundField, il y a une liaison de données. Vous devez en faire un champ de modèle pour travailler. – Albert

+0

Albert a raison sur la liaison de données. Cependant, le BoundField lui-même n'est pas lié aux données. Si c'était le cas, vous auriez besoin de <% #. Convertissez-le en modèle si vous voulez l'utiliser (la <% = est une directive de rendu qui ne devrait pas être utilisée dans ce contexte). Ou définissez la visibilité dans le code derrière (comme vous l'avez fait). – Ruslan

Répondre

2

Je l'ai résolu par:

gridMain.Columns[ShowPurchaseDate ? 3 : 4].Visible = false; 

Est-ce la meilleure solution?

+0

c'est ce que je fais généralement. –

+0

Ce n'est pas la meilleure solution. Il est basé sur des index qui changent tout le temps. Faites-en un champ modèle et utilisez l'approche de liaison de données que j'ai suggérée. – Albert

+0

Avec un champ de modèle, vous pouvez faire disparaître les contrôles de la colonne mais pas toute la colonne. Donc, je suis d'accord que cela doit être fait dans le code derrière. – EfficionDave

0

Fournissez une méthode protégée dans le code derrière qui renvoie la propriété boolean sous la forme d'une chaîne.

0

Vous écrivez du code devrait être <% # ShowPurchaseDate%>

+0

Qui a donné -1? La réponse est correcte ... Le champ DataBound nécessite l'utilisation de <%# %> et non <%= %> – Ruslan

+0

J'ai oublié d'ajouter que le BoundField lui-même n'est pas un contrôle lié aux données, donc un modèle serait nécessaire. – Ruslan

0

Vous pouvez essayer d'appeler une méthode au lieu de la liaison comme shouldshowcolumn().