2010-09-08 85 views

回答

11

如果你有HeaderTemplateFooterTemplate定義,你可以添加任何HtmlControlServerControl它們中的任內,然後編程顯示/隱藏它的代碼隱藏。

<asp:Repeater id="Repeater1" runat="server" OnItemDataBound=""> 
<HeaderTemplate> 
    <h1>My Repeater Data</h1> 
    <div id="NoRecords" runat="server" visible="false"> 
    No records are available. 
    </div> 
</HeaderTemplate> 
<ItemTemplate> 
... 
</ItemTemplate> 
</asp:Repeater> 

這裏的背後

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (Repeater1.Items.Count < 1) 
    { 
     if (e.Item.ItemType == ListItemType.Header) 
     { 
      HtmlGenericControl noRecordsDiv = (e.Item.FindControl("NoRecords") as HtmlGenericControl); 
      if (noRecordsDiv != null) { 
       noRecordsDiv.Visible = true; 
      } 
     } 
    } 
} 
+0

我意識到這是一個老公認的答案,但如果您使用此代碼將無法正常工作。在標記端使用HeaderTemplate,並且在代碼隱藏中,您嘗試爲ListItemType.Footer加載No Records div。爲了工作,代碼隱藏應該更新爲ListItemType.Header。 – Sam 2012-08-23 21:11:38

+0

@Sam ok我更新了答案。很好的接收。 – jessegavin 2012-08-23 21:15:06

+0

你也可以使用隱藏的div中繼元素之外,並檢查陣列可見的是什麼;) – 2014-11-10 12:34:50

4

想一想使用ListView控制代替,其具有用於使用當數據源沒有任何數據。如果你選擇堅持使用Repeater控制,想測試你的查詢記錄和可選顯示LabelLiteral有你的「沒有行發現」的消息,而不是你的中繼器。

if (query.Any()) 
{ 
    repeater.DataSource = query; 
    repeater.DataBind(); 
} 
else 
{ 
    noRecordsLiteral.Visible = true; 
} 
1

的代碼你可以通過改變中繼邏輯或來驅動你想要的行爲中繼器提供數據做到這一點。我更喜歡中繼器不在其中。如果你熟悉MVC,那麼你的邏輯就不在視圖之內。

我用列表作爲數據源,而不是數據庫的結果在這裏節省了空間,但原理是一樣的。如果您從數據庫返回,您可能會收集IDataRecord作爲源。

using System; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.HtmlControls; 
using System.Collections.Generic; 
using System.Linq; 

namespace StackOverflowRepeater 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
     protected override void OnInit(EventArgs e) 
     { 
      repeater.ItemDataBound += HandleRepeaterItemDataBound; 

      var data = new List<string>(); 

      if (!data.Any()) // could also be data.Count < 1 
      { 
       data.Add("No Row Found"); 
      } 

      repeater.DataSource = data; 
      repeater.DataBind(); 

      base.OnInit(e); 
     } 

     void HandleRepeaterItemDataBound (object sender, RepeaterItemEventArgs e) 
     { 
      if ((e.Item.ItemType == ListItemType.AlternatingItem) || (e.Item.ItemType == ListItemType.Item)) 
      { 
       var span = (HtmlGenericControl) e.Item.FindControl("output"); 
       span.InnerText = e.Item.DataItem.ToString(); 
      } 
     } 
    } 
} 

這假設以下加價:

<%@ Page Language="C#" Inherits="StackOverflowRepeater.Default" %> 
<html> 
<body> 
    <form runat="server"> 
     <asp:Repeater id='repeater' runat="server"> 
      <ItemTemplate> 
       <span id='output' runat="server" /> 
      </ItemTemplate> 
     </asp:Repeater> 
    </form> 
</body> 
</html> 
3

下面是一個簡單的例子來演示顯示無記錄在中繼控制實測值

<div id="NoRecords" runat="server" visible="false"> 
     No records are available. 
</div> 
<asp:Repeater id="Repeater1" runat="server" OnPreRender="Repeater1_PreRender"> 
<HeaderTemplate> 
    <h1>My Repeater Data</h1> 

</HeaderTemplate> 
<ItemTemplate> 
... 
</ItemTemplate> 
</asp:Repeater> 

這裏是代碼隱藏

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

這是我認爲最好的解決方案。整齊。 – Resource 2015-12-18 15:23:07