web-dev-qa-db-ja.com

Ifステートメントの.aspxでBind / Evalを使用するASP.NET

.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.
18
Funky

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)";
    }
}
19
Bazzz

次のようなことができると確信しています

(正確な構文をテストするのに便利なコンパイラーがないことに注意してください)

text = '<%# string.Format("{0}", (bool)Eval("IsLinkable") ? "Monkeys!" : string.Empty) %>'

はい、これはc#であり、vb.netを使用しているため、三項演算子にはvb構文を使用する必要があります。

編集-単純なデータバインドの状況に投入することができ、魅力のように機能しました。

15
asawyer

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>
7
Rakesh Angre

OMGこれを理解するには完全に時間がかかりすぎました...

<asp:PlaceHolder runat="server" Visible='<%# Eval("formula.type").ToString()=="0" %>'> Content <asp:PlaceHolder>

formula.typeは、リンクされたテーブルのint列です。私の解像度を得るために他の貢献をありがとう。

5
Alec Effrat

私はこの答えが少し遅れていることを知っていますが、ここでそれが価値があるのは、問題に対する私の解決策です:

<%# (bool)Eval("IsLinkable") ? "monkeys!!!!!!" : "" %>
4
oliver

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)";
        }
    }
}
4

値を評価し、必要な値を返すメソッドを作成できます。

<%# IsLinkableABool( Eval("IsLinkable") ) %>

コードビハインドでは、次のようにメソッドを作成できます。

protected String IsLinkableABool(String isLinkable)
{
    if (isLinkable == Boolean.TrueString)
    {
         return "monkeys!!!!!! (please be aware...";    
    }
    else
    {
         return String.Empty;
    }
}
2
Oscar

データバインドコントロール内の条件を処理する必要があるときはいつでも、 OnItemDataBound イベントを使用します。

だからあなたができる:

protected void DataBound_ItemDataBoundEvent() {
     bool IsLinkable            = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable");  
     if(IsLinkable) {
          //do stuff
     }                                     

}
1
Jack Marchetti

コードの残りの部分を確認する必要がありますが、エラーメッセージから少しヒントが得られます。データバインドコントロール内にいる場合にのみ、Evalを使用できます。リピーター、データグリッドなどのSOmething.

データバインドコントロールの外にいる場合は、値をコードビハインドの変数にロードし、パブリックにすることができます。その後、ASPXで条件付き処理に使用できます。

0
Mitchel Sellers

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";

    }
}
_
0
vejee

条件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";
        }
    }
}
0