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

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

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

目前我正在做的是以下。

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

这个工作正常,当我有数据,但是当没有行被返回,那么我只是在网格应该是一个空白点。

编辑:感谢所有的.NET 4 +属性。 我在3.5天内回答了这个问题。 现在这更容易了。 🙂

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> 

注意:除非使用空值以外的东西调用DataBind(),否则不会出现标题。

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

发布后,我想出了一个办法。 但是,我不觉得这是处理这个问题的最好办法。 有更好的build议吗?

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

我正在解决这个问题,这些解决scheme都不适合我。 我无法使用EmptyDataTemplate属性,因为我使用自定义字段dynamic创build了我的GridView ,这些字段在标题中提供了filter。 我无法使用发布的示例almny,因为我使用的是ObjectDataSource而不是DataSetDataTable 。 但是,我发现这个答案张贴在另一个StackOverflow问题,链接到这个优雅的解决scheme ,我能够为我的特定情况工作。 它涉及覆盖GridViewCreateChildControls方法来创build相同的标题行,如果存在真实的数据,将会创build相同的标题行。 我认为值得在这里发表,在其他人可能发现类似的修复。

如果您正在使用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 

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

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

每次我改变下拉select一个不同的代表,Gridview被更新。 如果没有findlogging,则显示空行。

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

showheaderwhenEmpty属性

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

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

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

我发现了一个非常简单的解决scheme。 我只是创build了两个GridViews。 第一个GridView调用了一个DataSource,其查询被devise为不返回任何行。 它只是包含以下内容:

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

然后我创build了一个具有以下特征的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> 

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

这个解决scheme适用于我

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

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

另外,当GridView的数据源为空(当没有logging时),你可以尝试设置它,如下所示:c#:

  if (GridView1.DataSource == null) { GridView1.DataSource = new string[] { }; } GridView1.DataBind(); 
 <asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server"> 

这是一个使用EmptyDataText和ShowHeaderWhenEmpty的Gridview的基本示例

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

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

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

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

使用下面的EmptyDataTemplate。 当你的DataSource没有logging的时候,你会看到你的网格有标题,以及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>