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,因为我使用的是 ObjectDataSource
s 而不是 DataSet
或 DataTable
。但是,我发现 this answer 发布在另一个 *** 问题上,该问题链接到 this elegant solution,我能够针对我的特定情况进行工作。它涉及覆盖GridView
的CreateChildControls
方法,以创建与如果有真实数据会创建的相同标题行。我认为它值得在这里发布,其他人可能会在类似的修复中找到它。
【讨论】:
【参考方案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】:设置"<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 时,它对我有用,如下所示:
<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>
【讨论】:
【参考方案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数据库的数据时“尝试在空对象引用上调用虚拟方法”[重复]