2

次のコードスニペットについて考えてみます。

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "ItemData1") %>
        <br />&nbsp;&nbsp;
        <%# DataBinder.Eval(Container.DataItem, "ItemData2") %>
    </ItemTemplate>
</asp:TemplateField>

ItemData2が空白の場合、<br />&nbsp;&nbsp;がレンダリングされないように、これをリファクタリングする必要があります

どうすればこれを達成できるかわかりません。

編集:私はそのような条件を追加しようとしました:

<% if(DataBinder.Eval(Container.DataItem, "ItemData2") != null) { %>
    <br />&nbsp;&nbsp;
    <%# DataBinder.Eval(Container.DataItem, "ItemData2") %>
<% } %>

それはうまくいきませんでした、そして本当に醜いように見えます!

4

6 に答える 6

2

DataBinder.Evalでは、以下のように条件を渡すことができ、これが機能します。

<%#( DataBinder.Eval(Container.DataItem,"Item1)==null ?DataBinder.Eval(Container.DataItem,"Item1"):
DataBinder.Eval(Container.DataItem,"Item2"))%>
于 2013-03-14T11:24:43.383 に答える
2

dataBinder.Eval()ステートメントをコントロール内に配置asp:literalし、CodeBehindにDataBindingイベントハンドラーを追加しLiteral2.Visible = falseて、条件に基づいて設定します。<br/ >2番目の文字にあなたを置きます。

このメソッドは、HTMLスニペットを返すC#コードがないように関心の分離を維持しますが、「インライン」ではないことに注意してください。

例、リピーターを使用しますが、これらのコントロールはすべて同様に機能します。

   void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
   {

      // Execute the following logic for Items and Alternating Items.
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      {

         var dataItem = (YourDataItem)e.Item.DataItem;
         if (null == dataItem.Item2)// this is pseudo code because I don't know what your dataItem looks like 
         {
             ((literal)e.Item.FindControl("Literal2")).Visible = false;
         }
      }
   }    

アイテムテンプレートは次のようになります。

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "ItemData1") %>
        <asp:Literal Runat="server" ID="Literal2">
            <br />&nbsp;&nbsp;
            <%# DataBinder.Eval(Container.DataItem, "ItemData2") %>
        </asp:Literal>
    </ItemTemplate>
</asp:TemplateField>
于 2013-03-14T11:25:28.520 に答える
2

を使用する代わりに<br />&nbsp;&nbsp;、ブロックとして表示される要素で両方のアイテムをラップすることを検討してください。div

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <div><%# DataBinder.Eval(Container.DataItem, "ItemData1") %></div>
        <div><%# DataBinder.Eval(Container.DataItem, "ItemData2") %></div>
    </ItemTemplate>
</asp:TemplateField>

ItemData2が空白の場合、divは空白になり、スペースを占有したり、HTMLに改行を入れたりすることはありません。

例については、このJSFiddleを参照してください

于 2013-03-14T12:22:35.263 に答える
1

私はあなたが.cs取るコードの背後にあるパブリックメソッドを定義することによってこれを行うことができると思いますItemData2そしてそれが空であることを確認しますそれが空の文字列を返さない場合は必要なマークアップ文字列を返します

例::

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "ItemData1") %>        
        CheckEmptyData(Eval("ItemData2").ToString())
    </ItemTemplate>
</asp:TemplateField>

その後、コードビハインドで:

public string CheckEmptyData(string ItemData2)
{
    if (string.IsNullOrEmpty(ItemData2))
        return "";
    else
        return "<br />&nbsp;&nbsp;" + ItemData2;
}
于 2013-03-14T11:27:29.803 に答える
0

バインド時に、「ItemData2」の前に改行とスペースを追加できます。すなわち、

if(ItemData2Field.length>0){
    string item2 = ""+
    "  " + ItemData2;}

これを2行に並べます。

于 2013-03-14T11:23:52.030 に答える
0

Jodhaの答えに基づいて、これが私がそれを解決した方法です。確かに最もエレガントな解決策ではありませんが、ここで私が見ることができるものは、これ以上エレガントではないようです。

<%# DataBinder.Eval(Container.DataItem, "ItemData2") != null ? DataBinder.Eval(Container.DataItem, "ItemData1") + "<br />&nbsp;&nbsp;<span style=\"color: gray;\">" + DataBinder.Eval(Container.DataItem, "ItemData2") + "</span>" : DataBinder.Eval(Container.DataItem, "ItemData1") %></asp:Label>
于 2013-03-14T11:36:37.647 に答える