.aspxで、バインドからの値に基づいてIfステートメントを追加しようとしています。私は次を試しました:
<% if(bool.Parse(Eval("IsLinkable") as string)){ %>
monkeys!!!!!!
(please be aware there will be no monkeys,
this is only for humour purposes)
<%} %>
IsLinkableは、バインダーから来るboolです。次のエラーが表示されます。
InvalidOperationException
Databinding methods such as Eval(), XPath(), and Bind() can only
be used in the context of a databound control.
ListViewのItemDataBound
イベントにロジックを追加する必要があります。 aspxでは、DataBinderのコンテキストでifステートメントを使用できません。<%# if() %>
は機能しません。
こちらをご覧ください: http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx
ListViewにバインドされる各アイテムに対してイベントが発生するため、イベントのコンテキストはアイテムに関連しています。
例、状況に合わせて調整できるかどうかを確認します。
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)";
}
}
次のようなことができると確信しています
(正確な構文をテストするのに便利なコンパイラーがないことに注意してください)
text = '<%# string.Format("{0}", (bool)Eval("IsLinkable") ? "Monkeys!" : string.Empty) %>'
はい、これはc#であり、vb.netを使用しているため、三項演算子にはvb構文を使用する必要があります。
編集-単純なデータバインドの状況に投入することができ、魅力のように機能しました。
asp:PlaceHolder
を使用でき、Visibleではevalを配置できます。以下のように
<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>
OMGこれを理解するには完全に時間がかかりすぎました...
<asp:PlaceHolder runat="server" Visible='<%# Eval("formula.type").ToString()=="0" %>'> Content <asp:PlaceHolder>
formula.typeは、リンクされたテーブルのint列です。私の解像度を得るために他の貢献をありがとう。
私はこの答えが少し遅れていることを知っていますが、ここでそれが価値があるのは、問題に対する私の解決策です:
<%# (bool)Eval("IsLinkable") ? "monkeys!!!!!!" : "" %>
Bazzzの回答でe.Item.DataItem
の取得に問題がある場合は、試してください
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)";
}
}
}
値を評価し、必要な値を返すメソッドを作成できます。
<%# IsLinkableABool( Eval("IsLinkable") ) %>
コードビハインドでは、次のようにメソッドを作成できます。
protected String IsLinkableABool(String isLinkable)
{
if (isLinkable == Boolean.TrueString)
{
return "monkeys!!!!!! (please be aware...";
}
else
{
return String.Empty;
}
}
データバインドコントロール内の条件を処理する必要があるときはいつでも、 OnItemDataBound イベントを使用します。
だからあなたができる:
protected void DataBound_ItemDataBoundEvent() {
bool IsLinkable = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable");
if(IsLinkable) {
//do stuff
}
}
コードの残りの部分を確認する必要がありますが、エラーメッセージから少しヒントが得られます。データバインドコントロール内にいる場合にのみ、Evalを使用できます。リピーター、データグリッドなどのSOmething.
データバインドコントロールの外にいる場合は、値をコードビハインドの変数にロードし、パブリックにすることができます。その後、ASPXで条件付き処理に使用できます。
FormView
Controlについては、 this link を参照してください。
これがサンプルコードです。私のaspxページFormView
コントロールは以下のようになります:
_<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>
_
<%# eval("PreviousDegreeYN") %>
の値を確認しています
eval("PreviousDegreeYN") == True
の場合、ラベルにYesを表示したい場合は、「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";
}
}
_
条件aspxページを置くことは良い考えではなく、面倒です。 Uは三項演算子を使用して実行できますが、グリッドビューのrowdataboundイベントを使用することをお勧めします。手順1-グリッドビューのプロパティに移動します。照明ボタンをクリックして、すべてのイベントを一覧表示します。手順2-rowdataboundに名前を付けてダブルクリックします
protected void onrow(オブジェクト送信者、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";
}
}
}