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>
</td>
<td style="width:110px">
<asp:Label ID="storeLbl" runat="server" Text='<%# Bind("Name") %>'>
</asp:Label>
</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
をほとんど使用していました。
Repeater
をFooterTemplate
イベントと組み合わせて使用し、次の場合にのみフッターを表示することにより、OnItemDataBound
が実行していることを達成する組み込みの方法をサポートしないという事実を回避できます。データソースはアイテムを返しません。
これを行う方法の例は、次の場所にあります。
Joaosの答えは単純化することさえできます。フッターでは、デフォルトアイテムのvisible-propertyをfalseに設定せずに、次の式を使用します。
<FooterTemplate>
<asp:Label ID="defaultItem" runat="server"
Visible='<%# YourRepeater.Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>
この方法で、コードビハインドを保存できます。
別の可能性:
<FooterTemplate>
<asp:Label ID="lblEmptyData" runat="server" Visible='<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>
このコードスニペットの利点は、リピーターに割り当てたIDに依存しないことです。
さらに良いこと:このサブクラスは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は表示されません。
このように、フッターテンプレートを使用してマッサージを管理できます
ステップ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
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;
}
}
}
回答nに基づいて。 3私は次のソリューションを採用しました。
<asp:Literal ID="emptyDataRowCnt" runat="server" Visible='<%# MyRepeater.Items.Count == 0 %>'>
<li class="row emptyDataRow">No data here</li>
</asp:Literal>
私がこれを解決するために見つけた最良の方法:
ページのどこかに次のラベルを追加します-
<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);
}
データがバインドされた後、ページにレンダリングする前に空のリピーターをチェックし、空の場合はラベルを表示する必要があります。
以前の回答で提供された表示可能なプロパティと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を書いていないので、おそらくこれを行うためのよりクリーンな方法があります。