7

別のリピーター内にネストされたリピーターを使用してデータのリストを生成する ASP.NET ページがあります。それは、次のような効果があります。

<asp:Repeater>
    <ItemTemplate>
        <span><%#Eval("Data1") %></span>
        <!-- and many more -->
        <asp:Repeater DataSource='<%#Eval("Data2")%>'>
            <HeaderTemplate>
                <ul>
            </HeaderTemplate>
            <ItemTemplate>
                <li><%#Container.DataItem%></li>
            </ItemTemplate>
            <FooterTemplate>
                </ul>
            </FooterTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

(C#) コード ビハインドでは、基本的に LINQ を使用して XML ドキュメントから情報のリストを取得し、その情報を最初のリピーターにバインドしています。

これに対する答えを探していると、ネストされたリピーターのデータが空かどうかを判断する方法のようです。そうである場合は、リピーターの可視性を false に設定します。

残念ながら、コード ビハインドではなく、インラインで行う方法を特定できませんでした (これは、私が行っていることで必ずしも機能するとは限らないためです)。

私のページは現在検証されていないため、Data2 のないアイテムの ul は空になってしまい、順序付けられていないリストを使い続けたいので、あなたの助けを求めます.

何か案は?

ありがとう!

アップデート:

コードビハインドで実行できる可能性が非常に高いため、それが役立つ場合、LINQ はこの効果をもたらすものです。

var x = from y in z
    select new {
        Data1 = d,
        // etcetera
        Data2 = (from j in k
            where j.Value != String.Empty
            select j.Value).ToList()
    };

blah.DataSource = x;
blah.DataBind();
4

9 に答える 9

10

これでリピーターが完全に非表示になるわけではありませんが、Repeater コントロールをサブクラス化して、GridView のような空のデータ テンプレートを含めることができます。

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

public class EmptyCapableRepeater : Repeater
{
    public ITemplate EmptyDataTemplate { get; set; }

    protected override void OnDataBinding ( EventArgs e )
    {
        base.OnDataBinding( e );

        if ( this.Items.Count == 0 )
        {
            EmptyDataTemplate.InstantiateIn( this );
        }
    }
}

次のように .aspx で使用できます。

<custom:EmptyCapableRepeater runat="server" ID="rptSearchResults">
    <ItemTemplate>
        <%# Eval( "Result" )%>
    </ItemTemplate>
    <SeparatorTemplate>
        <br />
    </SeparatorTemplate>
    <EmptyDataTemplate>
        <em>No results were found.</em>
    </EmptyDataTemplate>
</custom:EmptyCapableRepeater>
于 2008-12-01T02:50:56.557 に答える
4

次のようなものを試してください:

<asp:Repeater runat="server" DataSource='<%#Eval("Data2")%>' 
    Visible='<%# ((IEnumerable)Eval("Data2")).GetEnumerator().MoveNext() %>'>

ネストされたリピーターの場合

于 2008-11-29T08:53:30.633 に答える
2

ListViewを使用してみませんか?EmptyDataTemplateを含む同じ機能の多くを提供します。

于 2009-11-04T14:40:38.750 に答える
1

これを使って:

protected void Repeater1_PreRender(object sender, EventArgs e)
{
    if (Repeater1.Items.Count < 1)
    {
        container.Visible = false;
    }
}
于 2013-05-13T14:03:31.017 に答える
0

コードビハインドを介してこれを行う必要があることを私が知っている限り、ItemDataBoundイベントを使用して処理するだけで、ほとんどすべてをそのままにしておくことができます。データセットを取得し、エントリがあるかどうかを判断するロジックを入力するだけです。リピーター。

于 2008-11-29T04:40:16.667 に答える
0

OnItemDataBoundイベントで、 が の場合ItemTypeは可視性を false に設定し、が の場合はHeader可視性を true に設定します。ItemTypeItem

于 2010-05-20T16:01:24.193 に答える
0

あなたがやろうとしていることがうまくいくとは思いません。あなたがやろうとしているように DataSource を設定しようとするとエラーが発生します。ただし、コード ビハインドでは次のようにします。

親リピーターの ItemDataBoundEvent にリスナーを追加したと仮定すると、匿名型を使用しないように linq クエリを少し変更する必要があります (プロパティを持つ保護されたクラスを作成します) mjy の場合、クラス名として dto を使用しています。

void rep1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

    Repeater rep2 = (Repeater)e.Item.FindControl("rep2");
    rep2.DataSource = ((dto)e.Item.DataItem).y;
    rep2.DataBind();
}

コードビハインドでこれを解決できないと思う理由を知りたいです。

于 2008-11-30T06:20:48.023 に答える
0

これは古いスレッドであり、上記の回答は非常に優れた解決策であることは知っていますが、同様の問題があり、別のさまざまな単純な解決策を見つけて、共有したいと思いました。これは問題なく検証され、同じものが表示されます。

フッター テンプレートを次のように変更するだけです。

<FooterTemplate> 
            <li style="display:none;">This will not show.</li></ul> 
</FooterTemplate> 

または、テーブルを使用している場合:

<FooterTemplate> 
            <tr> style="display:none;"><td>But something must be in here.</td></tr></table> 
</FooterTemplate> 

それが誰かを助けることを願っています!

于 2010-01-08T18:26:02.457 に答える
0

LINQ クエリを実行したら、その Count プロパティを確認します (ある種のリストを提供します)。0 の場合は、Visible プロパティを false にします。

于 2008-11-29T04:13:05.380 に答える