it-swarm.com.de

Standardtext für leeres Repeater-Steuerelement

Mit VS 2008 habe ich eine Repeater-Steuerung:

<asp:Repeater runat="server" ID="storesRep" DataSourceID="storeSqlDataSource" 
    OnItemDataBound="StoresRep_ItemDataBound">
    <ItemTemplate>
        <table style="padding:0px">
        <tr>
            <td style="width:200px"><asp:Label ID="infoLbl" runat="server">
              Choose stores for upload:</asp:Label>&nbsp;&nbsp;&nbsp;&nbsp;
            </td>
            <td style="width:110px">
              <asp:Label ID="storeLbl" runat="server" Text='<%# Bind("Name") %>'>
              </asp:Label>&nbsp;&nbsp;
            </td>
            <td><asp:CheckBox runat="server" ID="storeCheck" /></td>
        </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="storeSqlDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:someConnectionString %>"
    SelectCommand="SELECT [StoreId], [Name] FROM [Store] Order By [Name]">
</asp:SqlDataSource>

Jetzt möchte ich einen Standardtext wie "Keine Geschäfte gefunden" anzeigen, wenn die Datenquelle keine Elemente aus der Datenbank zurückgibt. Bisher habe ich meist GridView verwendet, bei dem ich aufgrund des EmptyDataText-Attributs keine Probleme hatte.

42

Sie können die Tatsache umgehen, dass Repeater keine eingebaute Methode unterstützt, um das auszuführen, indem Sie FooterTemplate zusammen mit dem Ereignis OnItemDataBound verwenden und die Fußzeile nur anzeigen, wenn die Datenquelle keine Elemente zurückgibt.

Beispiele, wie Sie dies tun können, finden Sie unter:

Leere Daten in einem ASP.NET-Repeater-Steuerelement behandeln

Wie leere Vorlage in ASP.NET Repeater-Steuerelement anzeigen?

27
João Angelo

Joaos Antwort kann sogar vereinfacht werden. Setzen Sie in der Fußzeile die visible-Eigenschaft Ihres Standardelements nicht auf false, sondern verwenden Sie folgenden Ausdruck

<FooterTemplate>
    <asp:Label ID="defaultItem" runat="server" 
        Visible='<%# YourRepeater.Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>

Auf diese Weise können Sie den Code hinter sich speichern.

65

Andere Möglichkeit:

<FooterTemplate>
    <asp:Label ID="lblEmptyData" runat="server" Visible='<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>

Der Vorteil dieses Code-Snippets besteht darin, dass Sie nicht von der ID abhängig sind, die Sie Ihrem Repeater zugewiesen haben.

28
breez

Noch besser: Diese Unterklasse fügt eine EmptyDataTemplate-Eigenschaft hinzu. Fügen Sie in Ihr Markup ein Element ein, genau wie Sie es tun würden. Standardmäßig werden die Kopf- und Fußzeile ausgeblendet, wenn keine Daten vorhanden sind. Sie können dies mit den Eigenschaften HeaderVisibleWhenEmpty und FooterVisibleWhenEmpty im Markup ändern.

public class RepeaterWithEmptyDataTemplate : Repeater
{
    public virtual ITemplate EmptyDataTemplate { get; set; }

    protected virtual bool DefaultHeaderVisibleWhenEmpty
    {
        get { return false; }
    }

    protected virtual bool DefaultFooterVisibleWhenEmpty
    {
        get { return false; }
    }

    public bool HeaderVisibleWhenEmpty
    {
        get { return ViewState["hve"] == null ? DefaultHeaderVisibleWhenEmpty : (bool) ViewState["hve"]; }
        set { ViewState["hve"] = value; }
    }

    public bool FooterVisibleWhenEmpty
    {
        get { return ViewState["fve"] == null ? DefaultFooterVisibleWhenEmpty : (bool) ViewState["fve"]; }
        set { ViewState["fve"] = value; }
    }

    protected override void OnDataBinding(EventArgs e)
    {
        base.OnDataBinding(e);
        if (Items.Count == 0 && EmptyDataTemplate != null)
        {
            var emptyPlaceHolder = new PlaceHolder {ID = "empty", Visible = true};
            EmptyDataTemplate.InstantiateIn(emptyPlaceHolder);

            //figure out where to put placeholder
            RepeaterItem footer =
                Controls.OfType<RepeaterItem>().FirstOrDefault(i => i.ItemType == ListItemType.Footer);
            if (footer == null)
            {
                //add to end if no footer
                Controls.Add(emptyPlaceHolder);
            }
            else
            {
                Controls.AddAt(Controls.IndexOf(footer), emptyPlaceHolder);
            }

            //hide header and footer according to properties.
            foreach (RepeaterItem x in Controls.OfType<RepeaterItem>())
            {
                switch (x.ItemType)
                {
                    case ListItemType.Header:
                        x.Visible = HeaderVisibleWhenEmpty;
                        break;
                    case ListItemType.Footer:
                        x.Visible = FooterVisibleWhenEmpty;
                        break;
                }
            }
        }
    }
}

Beispiel im Markup:

<myprefix:RepeaterWithEmptyDataTemplate runat=server>
    <ItemTemplate>blah blah blah</ItemTemplate>
    <EmptyDataTemplate>Hey, no data!</EmptyDataTemplate>
</myprefix:RepeaterWithEmptyDataTemplate>  

Bitte beachten Sie, dass die DataBind-Methode aufgerufen werden muss oder die emptydatatemplate nicht angezeigt wird.

5
Xavier J

Sie können eine Fußzeilenvorlage verwenden, um die Massage so zu verwalten

Schritt 1

<FooterTemplate>
    <%-- Label used for showing Error Message --%>
    <asp:Label ID="lblDefaultMessage" runat="server" Text="Sorry, no item is there to show." Visible="false">
    </asp:Label>
</FooterTemplate> 

Schritt 2

Behandeln Sie die Sichtbarkeit von lable im Repeater_ItemDataBound-Ereignis wie

protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
 if (Repeater.Items.Count < 1)
  {
    if (e.Item.ItemType == ListItemType.Footer)
    {
        Label lblDefaultMessage= (Label)e.Item.FindControl("lblDefaultMessage");
        lblDefaultMessage.Visible = true;
    }
  }
}
1
Nitin Singh

Auf der Grundlage der Antwort n. 3 Ich habe folgende Lösung gewählt, die mir gut genug erscheint: 

<asp:Literal ID="emptyDataRowCnt" runat="server" Visible='<%# MyRepeater.Items.Count == 0 %>'> <li class="row emptyDataRow">No data here</li> </asp:Literal>

0
erionpc

Der beste Weg, um dieses Problem zu lösen:

  1. Fügen Sie das folgende Label an einer beliebigen Stelle auf Ihrer Seite hinzu. 

    <asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label>
    
  2. Fügen Sie das OnPreRenderEvent für Ihren Repeater hinzu

    <asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender">
    
  3. Schreiben Sie nun innerhalb dieses Ereignisses in Ihren Code den Code

    protected void emptyRepeater_PreRender(object sender, EventArgs e)
    {
       lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0);
    }
    
  4. Jetzt sollte Ihr leerer Repeater überprüft werden, nachdem die Daten gebunden wurden, jedoch vor dem Rendern auf der Seite, und das Etikett angezeigt wird, wenn es leer ist.

0
rohithrrao

Unter Verwendung der sichtbaren Eigenschaften und Punkt-Literale, die in den vorigen Antworten angegeben wurden, erweiterte ich die Antwort von erionpc entweder um "keine Daten" oder die Anzahl der Datensätze anzuzeigen.

<FooterTemplate>
                <asp:Literal ID="repeaterEmptyDataRow" runat="server" Visible='<%# Results_Repeater.Items.Count == 0 %>'>
                    <tr>
                        <td>No Data Found</td>    
                    </tr>
                </asp:Literal>
                <asp:Literal ID="repeaterResultsDataRow1" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>'>
                    <tr>
                        <td>
                </asp:Literal>
                <asp:Literal ID="repeaterResultsDataRow2" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>' Text='<%# String.Concat(Results_Repeater.Items.Count.ToString(), " records.") %>' />
                <asp:Literal ID="repeaterResultsDataRow3" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>'>
                        </td>
                    </tr>
                </asp:Literal>
                </table>
            </FooterTemplate>

Ich schreibe nicht viel Asp, also gibt es vielleicht einen saubereren Weg, dies zu tun.

0
Scott