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

Posted

技术标签:

【中文标题】GridView - 在空数据源上显示标题【英文标题】:GridView - Show headers on empty data source 【发布时间】:2010-09-26 03:28:10 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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()

【讨论】:

确保你至少数据绑定了一些东西,ShowHeadersWhenEmpty 至少需要一个空列表数据绑定。 @Tenerezza 提到的内容很重要,请在答案中包含这一点。这样可以节省一些时间。【参考方案2】:

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

//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;

【讨论】:

这也可以解决问题。 dtFunding.DataSource = dtFunding; dtFunding.DataBind();【参考方案3】:

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

【讨论】:

【参考方案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 代码

    确保将空列转换为适当的名称,否则将不起作用。 必须包含其他块,这与if not exists (query part) 中的查询相同 在我的情况下,如果我使用 @RepID 而不是 10。它映射到 gridview 外部的 DropDownList 框。

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

【讨论】:

感谢哈马德汗。这对我们有用。我已经阅读了几十个关于此的线程,这是我遇到的这种仅 SQL(或主要是 SQL-我需要隐藏空行)方法的唯一出现。对我们来说更重要的是:它会导致页脚也被显示,这比显示页眉更难。 :) 很高兴它对你有用,相当简单的解决方案:)【参考方案5】:

设置"&lt;asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""

showheaderwhenEmpty 属性

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

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

另外当GridView的数据源为null时(无记录时),你可以尝试如下设置: 时间:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

我找到了一个非常简单的解决方案。我只是创建了两个 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>

【讨论】:

【参考方案10】:
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

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

【讨论】:

【参考方案11】:

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

这个解决方案适合我

【讨论】:

【参考方案12】:

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

&lt;asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"&gt; &lt;/asp:SqlDataSource&gt;

【讨论】:

【参考方案13】:
<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();  

【讨论】:

请解释您的代码。仅代码的答案往往对 OP 没有用处。【参考方案14】:

您可以使用EmptyDataText,如下所示:

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

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

【讨论】:

这不是我所要求的。我正在寻找一种显示空网格的方法,带有标题。我知道我可以一直使用 EmptyDataText,但我的要求特别要求一个空网格,如果不存在数据,则带有标题。【参考方案15】:
    <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/

【讨论】:

【参考方案16】:

使用如下所示的 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>

【讨论】:

以上是关于GridView - 在空数据源上显示标题的主要内容,如果未能解决你的问题,请参考以下文章

显示来自sqlite数据库的数据时“尝试在空对象引用上调用虚拟方法”[重复]

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

回收站视图 - 在空对象引用上

如何从数据库中选择数据并将其显示在gridview的新行上

是否可以在空数据网格中显示消息

从 ftp 在 gridview 上显示数据 查看更多:C#ASP.NET