Wie kann ich einen Repeater in ASP.NET C # verstecken, wenn die Datasource keine Elemente enthält?

StackOverflow https://stackoverflow.com/questions/327151

  •  11-07-2019
  •  | 
  •  

Frage

Ich habe eine ASP.NET-Seite, die einen Repeater in einem anderen Repeater verschachtelt verwendet eine Auflistung von Daten zu erzeugen. Es ist auf die Wirkung der folgenden Optionen:

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

In dem (C #) Code-behind bin ich im Grunde LINQ mit einer Auflistung von Informationen aus einem XML-Dokument zu ziehen und diese Information an dem ersten Repeater binden.

für die Antwort auf diese Suche, so scheint es, das Verfahren, ob die Daten für den verschachtelten Repeater zu bestimmen, ist leer. Wenn ja, dann stellen Sie die Sichtbarkeit des Repeaters auf false gesetzt.

Leider hat ich schon nicht in der Lage festzustellen, wie die Inline zu tun, und nicht in dem Code-behind (da es nicht unbedingt funktionieren wird für das, was ich tue).

Da meine Seiten sind jetzt nicht validiert, da die ul endet als leer für alle Elemente ohne Data2 und weil Ich mag würde mit einer ungeordneten Liste zu halten, ich such deine Hilfe.

Irgendwelche Ideen?

Danke!

UPDATE:

Wenn es hilft, da es sehr gut möglich sein könnte, in dem zu tun, Code-behind, die LINQ ist etwas in diesem Sinne:

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();
War es hilfreich?

Lösung

Dies wird nicht verbergen den Repeater vollständig, aber Sie können die Repeater-Steuerelement Unterklasse, so dass es eine Gridview-wie leere Datenvorlage enthält:

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

Sie können sie es in Ihrer ASPX wie folgt aus:

<custom:EmptyCapableRepeater runat="server" ID="rptSearchResults">
    <ItemTemplate>
        <%# Eval( "Result" )%>
    </ItemTemplate>
    <SeparatorTemplate>
        <br />
    </SeparatorTemplate>
    <EmptyDataTemplate>
        <em>No results were found.</em>
    </EmptyDataTemplate>
</custom:EmptyCapableRepeater>

Andere Tipps

Versuchen Sie so etwas wie:

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

für den verschachtelten Repeater

Warum nicht ein Listview verwenden? Es bietet viel von der gleichen Funktionalität einschließlich einem Emptydatatemplate.

verwenden:

protected void Repeater1_PreRender(object sender, EventArgs e)
{
    if (Repeater1.Items.Count < 1)
    {
        container.Visible = false;
    }
}

Wenn Sie Ihre LINQ-Abfrage ausgeführt, überprüfen seine Eigenschaft Count (seine eine Liste von einer Art bereitstellt). Wenn es 0 ist, dann nur die Visible-Eigenschaft auf false drehen.

Soweit ich weiß, Sie dies über die Code-Behind tun müssen, verwenden Sie einfach die ItemDataBound Veranstaltung kann es zu handhaben, kann man so ziemlich alles lassen wie es ist, einfach nur Eingabe einige Logik, die den Datensatz erhält und bestimmt, ob es Einträge, wenn nicht den Repeater verbergen.

Das glaube ich nicht, was Sie tun wird ich einen Fehler arbeiten, wenn ich versuche, und die Datasource, wie Sie versuchen zu tun; jedoch in der Code-behind Sie dies tun:

Angenommen, Sie einen Listener zu Ihrer Eltern Repeaters ItemDataBoundEvent hinzugefügt, dann werden Sie Ihre Linq-Abfrage leicht nicht einen anonymen Typ verwenden ändern müssen (Erstellen Sie eine geschützte Klasse, die Ihre Eigenschaften) In MJY Fall verwende ich dto als die Klasse Name.

void rep1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

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

Ich würde lieben zu lernen, warum Sie denken, dies hinter den Code nicht lösen können.

Ich weiß, das ist ein alter Thread und die Antwort oben ist eine sehr schöne Lösung, aber ich hatte ein ähnliches Problem und habe unterschiedlich einfache Lösung finde ich dachte, ich würde auch teilen. Dies bestätigt nur gut und zeigt die gleiche.

Sie Ihre Fußzeile Vorlage ändern:

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

Oder wenn Ihre Verwendung von Tabellen:

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

Hoffnung, dass jemand hilft!

Im OnItemDataBound Fall gesetzt Sichtbarkeit auf false, wenn ItemType eine Header und setzte Sichtbarkeit auf true, wenn ItemType ein Item ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top