81

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

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

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

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

当我有数据时这很好用,但是当没有返回任何行时,我只会得到一个网格应该在的空白点。

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

4

16 回答 16

143

ASP.Net 4.0 添加了布尔ShowHeaderWhenEmpty属性。

http://msdn.microsoft.com/en-us/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()
于 2011-02-17T19:13:28.223 回答
35

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

//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;
}
于 2008-12-09T21:59:50.087 回答
5

我只是在解决这个问题,这些解决方案都不适合我。我无法使用该属性,因为我正在使用在标题中提供过滤器的自定义字段动态EmptyDataTemplate创建我的。GridView我无法使用发布的示例 almny,因为我使用的是ObjectDataSources 而不是DataSetor DataTable。但是,我发现这个答案发布在另一个 StackOverflow 问题上,该问题链接到这个优雅的解决方案,我能够针对我的特定情况进行工作。它涉及覆盖 的CreateChildControls方法GridView来创建相同的标题行,如果有真实数据则会创建。我认为它值得在这里发布,其他人可能会在类似的修复中找到它。

于 2009-07-14T21:05:12.647 回答
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. 必须包含 Else 块,这与中的查询相同if not exists (query part)
  3. 在我的情况下,如果我使用@RepID 而不是 10。它映射到 gridview 之外的 DropDownList 框。

每次我更改下拉菜单以选择不同的代表时,Gridview 都会更新。如果未找到记录,则显示空行。

于 2012-07-10T15:28:32.100 回答
3

"<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""

showheaderwhenEmpty财产

于 2012-12-20T11:21:28.963 回答
2

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

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

于 2008-12-09T22:07:01.880 回答
2

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

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

此外,当 GridView 的数据源为空时(没有记录时),您可以尝试如下设置: c#:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();
于 2016-06-29T10:24:45.370 回答
1

将此属性添加到您的网格视图: ShowHeaderWhenEmpty="True" 它可能有助于检查

于 2012-04-18T13:25:42.450 回答
1

我找到了一个非常简单的解决方案。我只是创建了两个 GridView。第一个 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,并在其中放置了一个带有 ShowHeader="false" 的 GridView,以便顶行与所有其他行的大小相同。

<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>
于 2012-06-13T17:53:30.190 回答
1
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

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

于 2013-09-06T08:31:06.477 回答
1

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

这个解决方案对我有用

于 2015-02-27T15:23:48.140 回答
0

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

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

于 2018-01-24T17:32:27.987 回答
-1
<asp:GridView ID="gvEmployee" runat="server"    
                 AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”&gt;  
                    <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();  
于 2015-07-08T08:43:44.783 回答
-2

你可以使用EmptyDataText如下图:

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

它不显示标题,它会呈现您的消息“未找到条目”。反而。

于 2012-09-21T17:40:00.650 回答
-2
    <asp:GridView ID="gvEmployee" runat="server"    
                     AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”&gt;  
                        <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/
于 2015-07-08T08:47:21.617 回答
-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>
于 2008-12-09T22:34:04.557 回答