Подтвердить что ты не робот

Текст по умолчанию для пустого управления ретрансляторами

Используя VS 2008, у меня есть элемент управления Repeater:

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

Теперь я хотел бы отобразить текст по умолчанию, например "Нет магазинов", если источник данных не возвращает никаких элементов из базы данных. До сих пор я обычно использовал GridView, где у меня не было проблем из-за атрибута EmptyDataText.

4b9b3361

Ответ 1

Вы могли бы обойти стороной тот факт, что Repeater не поддерживает встроенный способ выполнить то, что вы делаете, используя FooterTemplate в сочетании с событием OnItemDataBound и отображая нижний колонтитул только тогда, когда источник данных не возвращает никаких элементов.

Примеры того, как вы можете это сделать, можно найти по адресу:

Обработка пустых данных в элементе управления ASP.NET Repeater

Как показать пустой шаблон в элементе управления ASP.NET Repeater?

Ответ 2

Ответ на Joaos может быть даже упрощен. В нижнем колонтитуле не устанавливайте свойство visible вашего объекта по умолчанию false, но используйте следующее выражение:

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

Таким образом, вы можете сохранить код позади.

Ответ 3

Другая возможность:

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

Преимущество этого фрагмента кода заключается в том, что вы не зависите от идентификатора, назначенного вашему ретранслятору.

Ответ 4

Еще лучше: этот подкласс добавляет свойство EmptyDataTemplate. В вашей разметке введите элемент так же, как и элемент. По умолчанию это скроет верхний и нижний колонтитулы, если нет данных; вы можете изменить это с помощью свойств HeaderVisibleWhenEmpty и FooterVisibleWhenEmpty в разметке.

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

Пример разметки:

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

Обратите внимание, что метод DataBind должен быть вызван, или emptydatatemplate не будет отображаться.

Ответ 5

Вы можете использовать шаблон нижнего колонтитула для управления массажем, например

Шаг 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> 

Шаг 2

Обработка видимости lable в событии Repeater_ItemDataBound, например

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

Ответ 6

На основании ответа n. 3 я принял следующее решение, которое кажется мне достаточно хорошим:

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

Ответ 7

Используя видимые свойства и литералы asp, представленные в предыдущих ответах, я продлил ответ erionpc либо на отображение "нет данных", либо количество записей.

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

Я не пишу много asp, поэтому возможно более чистый способ сделать это.

Ответ 8

Лучший способ найти это:

  • Добавьте следующую метку в любом месте вашей страницы -

    <asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label>
    
  • Добавьте OnPreRenderEvent для вашего ретранслятора

    <asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender">
    
  • Теперь внутри этого события в вашем коде, напишите код

    protected void emptyRepeater_PreRender(object sender, EventArgs e)
    {
       lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0);
    }
    
  • Теперь ваш пустой ретранслятор должен быть проверен после привязки данных, но перед отображением на странице, и покажите метку, если она пуста.

Ответ 9

Если вы не хотите помещать HTML-код в скрытые элементы (мне очень не хочется скрывать вещи с помощью JS):

У вас, вероятно, уже есть статический класс Utils, в котором есть статические свойства. (Если нет, нажмите на решение и добавьте → класс)

Установить public static String hidden = "";//в новом созданном классе Utils

В вашем коде за файлом .cs сделайте следующее:

DataTable coll = ....
if(coll.Rows.Count < 1)
   Utils.hidden = "<span>Sorry, there were no items</span>

Затем в вашем .ascx файле <FooterTemplate> выглядит следующим образом:

<FooterTemplate>
   <%# Utils.hidden %>
</FooterTemplate>