我正在使用ASP.NET转发器,当查询从数据库返回0行时,我想显示 No Row Found 消息。我在GridView中知道它。
此致
答案 0 :(得分:12)
如果您定义了HeaderTemplate
或FooterTemplate
,则可以在其中任何一个中添加任何HtmlControl
或ServerControl
,然后以编程方式显示/隐藏它代码隐藏。
<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;
}
}
}
}
答案 1 :(得分:4)
考虑使用ListView控件,而不是在数据源没有数据时使用EmptyDataTemplate。如果您选择坚持使用Repeater
控件,请考虑测试您的查询记录,并可选择显示具有“未找到行”消息的Label
或Literal
,而不是您的转发器。
if (query.Any())
{
repeater.DataSource = query;
repeater.DataBind();
}
else
{
noRecordsLiteral.Visible = true;
}
答案 2 :(得分:3)
这是一个简单的示例,演示在 Repeater 控件中显示 No Record Found 。
<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>
这是Code-Behind
protected void Repeater1_PreRender(object sender, EventArgs e)
{
if (Repeater1.Items.Count < 1)
{
NoRecords.Visible = true;
Repeater1.Visible = false;
}
}
答案 3 :(得分:1)
您可以通过更改转发器中的逻辑或通过向转发器提供驱动所需行为的数据来实现此目的。我更喜欢转发器不在其中。如果你熟悉MVC,那就是让你的逻辑远离视图。
我通过使用List作为数据源而不是数据库结果来节省空间,但原理是相同的。如果从数据库返回,您可能会将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>
答案 4 :(得分:0)
我做了以下事情;
<asp:Repeater ID="Repeater" runat="server">
<HeaderTemplate>
<table>
<% if (Repeater.Items.Count < 1)
{ %>
<tr>
<td colspan="3">No data found.</td>
</tr>
<% }
else { %>
<tr>
<th>Case Id</th>
<th>Claim Id</th>
<th>Notes</th>
</tr>
<% } %>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td rowspan="2"><%# Eval("CaseId") %></td>
<td rowspan="2">
<a href="ClaimsManagement.aspx?id=<%# Eval("ClaimId") %>"><%# Eval("ClaimId") %></a>
</td>
<td><%# Eval("Note") %></td>
</tr>
<tr>
<td><%# Eval("CreatedBy") %> : <%# Eval("CreatedDate") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
答案 5 :(得分:0)
您也可以这样:
CSS
.div-no-display {
display: none;
}
隐藏代码-在这种情况下,如果它为空,通常不要将其绑定到div之外,但是如果绑定0项,则可以将其放在标头模板中
this.Repeater.DataSource = ChildLinksList;
this.Repeater.DataBind();
public List<Link> ChildLinksList { get; set; }
页面
<HeaderTemplate>
<div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
No child links active.
</div>
</HeaderTemplate>