C# 未找到行时在中继器中显示消息

C# 未找到行时在中继器中显示消息,c#,asp.net,C#,Asp.net,我正在使用ASP.NET repeater,当查询从数据库返回0行时,我想显示未找到行消息。我知道它在GridView里 <HeaderTemplate> <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'> No child links active. </div> </HeaderTe

我正在使用ASP.NET repeater,当查询从数据库返回0行时,我想显示未找到行消息。我知道它在GridView里

<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
关于

请考虑使用控件,该控件具有一个用于在数据源没有数据时使用的控件。如果您选择坚持使用
Repeater
控件,请考虑测试您的查询记录,并可选地显示一个
标签
文本
,其中包含“未找到行”消息,而不是中继器

if (query.Any())
{
    repeater.DataSource = query;
    repeater.DataBind();
}
else
{
    noRecordsLiteral.Visible = true;
}
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>

如果定义了
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>
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>

我的中继器数据
没有可用的记录。
...
这是背后的代码

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;
            } 
        }
    }
}
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
protectedvoid Repeater1\u ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
如果(Repeater1.Items.Count<1)
{
if(e.Item.ItemType==ListItemType.Header)
{
HtmlGenericControl noRecordsDiv=(e.Item.FindControl(“NoRecords”)作为HtmlGenericControl);
如果(noRecordsDiv!=null){
noRecordsDiv.Visible=真;
} 
}
}
}

您可以通过改变中继器中的逻辑或向中继器提供驱动您所需行为的数据来实现这一点。我宁愿不使用中继器。如果你熟悉MVC,那就不要把你的逻辑放在视线之外

<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
我在这里通过使用列表作为数据源而不是数据库结果来节省空间,但原理是一样的。如果从数据库返回,则可能会有一个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();
            }
        }
    }
}
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
使用系统;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.Web.UI.HTMLControl;
使用System.Collections.Generic;
使用System.Linq;
命名空间堆栈溢出中继器
{
公共部分类默认值:System.Web.UI.Page
{
受保护的覆盖无效OnInit(事件参数e)
{
repeater.ItemDataBound+=HandleRepeaterItemDataBound;
var data=新列表();
if(!data.Any())//也可以是data.Count<1
{
添加数据(“未找到行”);
}
repeater.DataSource=数据;
repeater.DataBind();
碱基.奥尼特(e);
}
void HandleRepeaterItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
if((e.Item.ItemType==ListItemType.AlternatingItem)| |(e.Item.ItemType==ListItemType.Item))
{
var span=(HtmlGenericControl)e.Item.FindControl(“输出”);
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>
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>

下面是一个简单的示例,演示如何在中继器控件中显示未找到记录

<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>
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>

没有可用的记录。
我的中继器数据
...
这是背后的代码

protected void Repeater1_PreRender(object sender, EventArgs e)
{
    if (Repeater1.Items.Count < 1)
    {
        NoRecords.Visible = true;
        Repeater1.Visible = false;
    }
}
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
protectedvoid Repeater1\u预渲染(对象发送方,事件参数e)
{
如果(Repeater1.Items.Count<1)
{
NoRecords.Visible=true;
中继器1.可见=假;
}
}

我做了以下事情

<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>
<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>

:                               

您也可以这样做:

<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
CSS

<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>
代码隐藏-如果它为空,通常不绑定它。在这种情况下,您必须将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>
this.Repeater.DataSource=ChildLinksList;
this.Repeater.DataBind();
公共列表ChildLinksList{get;set;}
页面

<HeaderTemplate>
    <div id="NoRecords" class='<%= ChildLinksList.Count > 0 ? "div-no-display" : "" %>'>
         No child links active.
    </div>
</HeaderTemplate>

没有活动的子链接。

我意识到这是一个古老的公认答案,但如果您使用此代码,它将不起作用。在标记端,您使用的是HeaderTemplate,在后面的代码中,您试图为ListItemType.Footer加载No Records div。为了工作,应该将隐藏的代码更新为ListItemType.Header。此外,您可以在repeater元素外部使用隐藏的div,并检查数组中是否存在可见的div;)我认为这是最好的解决办法。整洁的