dans mon .aspx, je cherche à ajouter une instruction If basée sur une valeur provenant de la liaison. J'ai essayé ce qui suit:
<% if(bool.Parse(Eval("IsLinkable") as string)){ %>
monkeys!!!!!!
(please be aware there will be no monkeys,
this is only for humour purposes)
<%} %>
IsLinkable est un bool venant du classeur. Je reçois l'erreur suivante:
InvalidOperationException
Databinding methods such as Eval(), XPath(), and Bind() can only
be used in the context of a databound control.
Vous devez ajouter votre logique à l'événement ItemDataBound
de ListView. Dans l'aspx, vous ne pouvez pas avoir une instruction if dans le contexte d'un DataBinder: <%# if() %>
ne fonctionne pas.
Regardez ici: http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx
L'événement sera déclenché pour chaque élément lié à votre ListView. Par conséquent, le contexte de l'événement est lié à l'élément.
Exemple, voyez si vous pouvez l’adapter à votre situation:
protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
Label monkeyLabel = (Label)e.Item.FindControl("monkeyLabel");
bool linkable = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable");
if (linkable)
monkeyLabel.Text = "monkeys!!!!!! (please be aware there will be no monkeys, this is only for humour purposes)";
}
}
Je suis sûr que vous pouvez faire quelque chose comme ce qui suit
(Notez que je n'ai pas de compilateur à portée de main pour tester la syntaxe exacte)
text = '<%# string.Format("{0}", (bool)Eval("IsLinkable") ? "Monkeys!" : string.Empty) %>'
Oui, c # et votre utilisation de vb.net, vous devrez donc utiliser la syntaxe vb pour un opérateur ternaire.
Edit - a été capable de plonger dans une situation de liaison de données simple, a fonctionné comme un charme.
Vous pouvez utiliser asp:PlaceHolder
et dans Visible can put eval. Comme ci-dessous
<asp:PlaceHolder ID="plc" runat="server" Visible='<%# Eval("IsLinkable")%>'>
monkeys!!!!!!
(please be aware there will be no monkeys, this is only for humour purposes)
</asp:PlaceHolder>
Je sais qu'il est un peu tard dans la journée pour cette réponse, mais voici ce que je peux faire pour résoudre ce problème:
<%# (bool)Eval("IsLinkable") ? "monkeys!!!!!!" : "" %>
OMG cela a pris trop de temps à comprendre ...
<asp:PlaceHolder runat="server" Visible='<%# Eval("formula.type").ToString()=="0" %>'>
Content
<asp:PlaceHolder>
formula.type est la colonne int d'une table liée. Merci pour les autres contributions pour obtenir ma résolution.
Si vous rencontrez des problèmes pour obtenir e.Item.DataItem
dans la réponse de Bazzz, essayez
protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
using (ListViewDataItem listViewDataItem = (ListViewDataItem) e.Item)
{
if (listViewDataItem != null)
{
Label monkeyLabel = (Label)e.Item.FindControl("monkeyLabel");
bool linkable = (bool)DataBinder.Eval(listViewDataItem , "IsLinkable");
if (linkable)
monkeyLabel.Text = "monkeys!!!!!! (please be aware there will be no monkeys, this is only for humour purposes)";
}
}
}
Vous pouvez créer une méthode pour évaluer la valeur et renvoyer la valeur souhaitée.
<%# IsLinkableABool( Eval("IsLinkable") ) %>
Sur le code derrière vous pouvez créer la méthode comme suit
protected String IsLinkableABool(String isLinkable)
{
if (isLinkable == Boolean.TrueString)
{
return "monkeys!!!!!! (please be aware...";
}
else
{
return String.Empty;
}
}
Chaque fois que j'ai besoin de gérer des conditions dans un contrôle databound, j'utilise l'événement ItemDataBound .
Alors tu pourrais faire:
protected void DataBound_ItemDataBoundEvent() {
bool IsLinkable = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable");
if(IsLinkable) {
//do stuff
}
}
Nous aurions besoin de voir le reste de votre code, mais le message d'erreur me donne un indice. Vous ne pouvez utiliser Eval que lorsque vous êtes à l'intérieur d'un contrôle lié aux données. Quelque chose comme un répéteur, une grille de données, etc.
Si vous êtes en dehors d'un contrôle lié aux données, vous pouvez charger la valeur dans une variable du code-behind et la rendre publique. Ensuite, vous pouvez l’utiliser sur l’ASPX pour le traitement conditionnel.
Pour FormView
Control, reportez-vous à ce lien .
Voici l exemple de code. Mon page aspx FormView
Control ressemble à ce qui suit:
<asp:FormView ID="fv" runat="server" Height="16px" Width="832px"
CellPadding="4" ForeColor="#333333" ondatabound="fv_DataBound">
<ItemTemplate>
<table>
<tr>
<td align="left" colspan="2" style="color:Blue;">
<asp:Label ID="lblPYN" runat="server" Text='<%# Eval("PreviousDegreeYN") %>'></asp:Label>
</td>
</tr>
</table>
</ItemTemplate>
</asp:FormView>
Je vérifie la valeur pour <%# eval("PreviousDegreeYN") %>
Si ma eval("PreviousDegreeYN") == True
, je souhaite afficher Yes dans mon libellé "lblPYN"
protected void fv_DataBound(object sender, EventArgs e)
{
FormViewRow row = fv.Row;
//Declaring Variable lblPYN
Label lblPYN;
lblPYN = (Label)row.FindControl("lblPYN");
if (lblPYN.Text == "True")
{
lblPYN.ForeColor = Color.Blue;
lblPYN.Text = "Yes";
}
else
{
lblPYN.ForeColor = Color.Blue;
lblPYN.Text = "No";
}
}
Mettre une page aspx conditionnelle n’est pas une bonne idée.aussi désordonné . U peut le faire à l’aide de l’opérateur ternaire.Mais je vous conseille d’utiliser des événements rowdatabound de la vue en grille . Étape 1-aller aux propriétés de la vue grille.Cliquez sur l’éclairage bouton pour lister tous les événements. Étape 2: donnez un nom à rowdatabound et double-cliquez
onid void onrow (expéditeur d'objet, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TableCell statusCell = e.Row.Cells[8];//Means column 9
if (statusCell.Text == "0")
{
statusCell.Text = "No Doc uploaded";
}
else if (statusCell.Text == "1")
{
statusCell.Text = "Pending";
}
else if (statusCell.Text == "2")
{
statusCell.Text = "Verified";
}
}
}