GridView-在空数据源上显示标题


77

在C#中,即使数据源为空,我仍如何显示gridview的标题。

我不是自动生成列,因为它们都是预定义的。

目前我正在做的事情如下。

从存储过程中获取一个DataTable,然后设置gridview的DataSource,然后调用DataBind()。

当我有数据时,这很好用,但是当不返回任何行时,我只是在网格应有的地方空白。

编辑:感谢所有的.NET 4+属性。我在.NET 3.5天内问过这个问题。现在,这要容易得多。:)

Answers:


136

ASP.Net 4.0添加了booleanShowHeaderWhenEmpty属性。

http://msdn.microsoft.com/zh-CN/library/system.web.ui.webcontrols.gridview.showheaderwhenempty.aspx


<asp:GridView runat="server" ID="GridView1" ShowHeaderWhenEmpty="true" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField HeaderText="First Name" DataField="FirstName" />
        <asp:BoundField HeaderText="Last Name" DataField="LastName" />
    </Columns>
</asp:GridView>

注意:除非使用null以外的名称调用DataBind(),否则标题不会出现。

GridView1.DataSource = New List(Of String)
GridView1.DataBind()

14
确保至少对数据进行绑定,ShowHeadersWhenEmpty至少需要一个空列表数据绑定。
Tenerezza

2
@Tenerezza提到的内容很重要,请在答案中包括该内容。这样可以节省一些时间。
James Poulose 2014年

34

发布后,我确实提出了一种可行的方法。但是,我认为这不是处理此问题的最佳方法。有更好的建议吗?

//Check to see if we get rows back, if we do just bind.

if (dtFunding.Rows.Count != 0)
{
    grdFunding.DataSource = dtFunding;
    grdFunding.DataBind();
}
else
{
  //Other wise add a emtpy "New Row" to the datatable and then hide it after binding.

     dtFunding.Rows.Add(dtFunding.NewRow());
     grdFunding.DataSource = dtFunding;
     grdFunding.DataBind();
     grdFunding.Rows[0].Visible = false;
}

1
这也可以解决问题。dtFunding.DataSource = dtFunding; dtFunding.DataBind();
Zain Ali

5

我只是在解决这个问题,而这些解决方案都不适合我。我无法使用该EmptyDataTemplate属性,因为我正在GridView使用自定义字段动态创建我的字段,这些字段在标头中提供过滤器。我无法使用示例almny发布,因为我使用ObjectDataSources而不是DataSetor DataTable。但是,我发现此答案发布在另一个StackOverflow问题上,该问题链接到这个精巧的解决方案,我可以针对自己的特殊情况进行工作。它涉及重写的CreateChildControls方法,GridView以创建如果存在真实数据将创建的相同标题行。我认为值得在这里发布,很可能其他人也可以在类似版本中找到它。


4

如果您使用的是ASP.NET 3.5及更低版本,并且您的问题相对简单(如我的),则可以从SQL查询中返回空行。

if not exists (select RepId, startdate,enddate from RepTable where RepID= 10)
     select null RepID,null StartDate,null EndDate
else
     select RepId, startdate,enddate from RepTable where RepID= 10

此解决方案不需要任何C#代码或ASP.NET代码

  1. 确保将空列转换为适当的名称,否则将无法正常工作。
  2. 必须包含其他块,该查询与 if not exists (query part)
  3. 就我而言,如果我使用@RepID而不是10,它映射到gridview外部的DropDownList框。

每次更改下拉列表以选择其他代表时,Gridview都会更新。如果未找到任何记录,则显示空行。


感谢Hammad Khan。这对我们有用。我已经读过许多线程,这是我遇到的这种仅SQL(或主要是SQL-我需要隐藏空行)方法的唯一发生。对我们来说更重要的是:它也使页脚也显示,这比显示页眉更难。:)
Zeek2 '19

1
很高兴它为您服务,相当简单的解决方案:)
Hammad Khan


2

您可以使用HeaderTemplate属性以编程方式设置头部,或者如果使用的是.NET 3.5,则可以使用ListView。

就个人而言,如果可能,我更喜欢ListView而不是GridView和DetailsView,它使您可以更好地控制html。


2

您可以将ownertableview的ShowHeadersWhenNoRecords属性设置为true。aspx:

<asp:GridView ID="RadGrid2" runat="server" >       
<MasterTableView ShowHeadersWhenNoRecords="true"  > 

同样,当GridView的数据源为null(没有记录时)时,您可以尝试按如下所示进行设置:c#:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();

1

将此属性添加到您的grid-view中:ShowHeaderWhenEmpty =“ True”可能仅对检查有用


1

我找到了一个非常简单的解决方案。我只是创建了两个GridViews。第一个GridView调用带有查询的DataSource,该查询被设计为不返回任何行。它仅包含以下内容:

    <Columns>
        <asp:TemplateField HeaderStyle-HorizontalAlign="Left">
            <HeaderTemplate>

               <asp:Label ID="lbl0" etc.>  </asp:Label>
               <asp:Label ID="lbl1" etc.>  </asp:Label>

            </HeaderTemplate>
        </asp:TemplateField>
    </Columns>

然后,我创建了一个具有以下特征的div,并在其中放置了一个GridView,其中包含ShowHeader =“ false”,以便第一行的大小与所有其他行的大小相同。

<div style="overflow: auto; height: 29.5em; width: 100%">
    <asp:GridView ID="Rollup" runat="server" ShowHeader="false" DataSourceID="ObjectDataSource">
        <Columns>
            <asp:TemplateField HeaderStyle-HorizontalAlign="Left">
                <ItemTemplate>

               <asp:Label ID="lbl0" etc.>  </asp:Label>
               <asp:Label ID="lbl1" etc.>  </asp:Label>

                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>

1
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

这是带有EmptyDataText和ShowHeaderWhenEmpty的Gridview的基本示例


1

Juste添加ShowHeaderWhenEmpty属性并将其设置为true

这个解决方案对我有用


0

我正在使用asp sqlDataSource。当我将CancelSelectOnNullParameter设置为false时,它为我工作,如下所示:

<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>


-1
<asp:GridView ID="gvEmployee" runat="server"    
                 AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”>  
                    <Columns>  
                        <asp:BoundField DataField="Id" HeaderText="Id" />  
                        <asp:BoundField DataField="Name" HeaderText="Name" />  
                        <asp:BoundField DataField="Designation" HeaderText="Designation" />  
                        <asp:BoundField DataField="Salary" HeaderText="Salary"  />  
                    </Columns>  
                    <EmptyDataTemplate>No Record Available</EmptyDataTemplate>  
                </asp:GridView>  


in CS Page

gvEmployee.DataSource = dt;  
gvEmployee.DataBind();  

1
请解释您的代码。仅代码的答案对OP而言往往没有用。
mastov

-2

您可以EmptyDataText如下所示使用:

<asp:GridView ID="_gridView" RunAt="server" AutoGenerateColumns="false"
          EmptyDataText="No entries found.">

它不显示标题,而是呈现您的消息“找不到条目”。代替。


2
这不是我所要的。我正在寻找一种显示带标题的空网格的方法。我知道我可以一直使用EmptyDataText,但如果没有数据,我的要求专门要求使用带标题的空网格。
2012年

-2
    <asp:GridView ID="gvEmployee" runat="server"    
                     AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”>  
                        <Columns>  
                            <asp:BoundField DataField="Id" HeaderText="Id" />  
                            <asp:BoundField DataField="Name" HeaderText="Name" />  
                            <asp:BoundField DataField="Designation" HeaderText="Designation" />  
                            <asp:BoundField DataField="Salary" HeaderText="Salary"  />  
                        </Columns>  
                        <EmptyDataTemplate>No Record Available</EmptyDataTemplate>  
                    </asp:GridView>  


    in CS Page

    gvEmployee.DataSource = dt;  
    gvEmployee.DataBind();  

Help.. see that link:
http://www.c-sharpcorner.com/UploadFile/d0e913/how-to-display-the-empty-gridview-in-case-of-no-records-in-d/

-3

如下使用EmptyDataTemplate。当您的DataSource没有记录时,您将看到带有标题的网格以及EmptyDataTemplate标记内的文字文本或HTML。

<asp:GridView ID="gvResults" AutoGenerateColumns="False" HeaderStyle-CssClass="tableheader" runat="server">
    <EmptyDataTemplate>
        <asp:Label ID="lblEmptySearch" runat="server">No Results Found</asp:Label>
    </EmptyDataTemplate>
    <Columns>
        <asp:BoundField DataField="ItemId" HeaderText="ID" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        ...
    </Columns>
</asp:GridView>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.