在C#中,即使数据源为空,我仍然可以显示gridview的标题。
我不是自动生成列,因为它们都是预定义的。
目前我正在做的是以下内容。
从存储过程中获取DataTable,然后设置gridview的DataSource,然后调用DataBind()。
当我有数据时这很好用,但是当没有返回任何行时,我只得到一个空白点,网格应该是。
编辑:感谢所有.NET 4+属性。我在.NET 3.5天里问过这个问题。现在这更容易了。 :)
答案 0 :(得分:125)
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()
答案 1 :(得分:32)
发布后我确实提出了一种有效的方法。但是,我觉得这不是解决这个问题的最佳方法。有关更好的建议吗?
//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;
}
答案 2 :(得分:5)
我刚刚解决了这个问题,这些解决方案都不适用于我。我无法使用EmptyDataTemplate
属性,因为我使用自定义字段动态创建GridView
,自定义字段在标头中提供过滤器。我无法使用发布的almny示例,因为我使用的是ObjectDataSource
而不是DataSet
或DataTable
。但是,我发现另一个StackOverflow问题发布了this answer,该问题链接到this elegant solution我能够为我的特定情况工作。它涉及覆盖CreateChildControls
的{{1}}方法,以创建在有真实数据时创建的相同标题行。我认为值得发布在这里,其他人可能会在类似的修复程序中找到它。
答案 3 :(得分:3)
如果您正在使用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)
每次我更改下拉列表以选择不同的代表时,Gridview都会更新。如果未找到记录,则显示空行。
答案 4 :(得分:3)
设置"<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""
showheaderwhenEmpty
财产
答案 5 :(得分:2)
如果您使用的是.NET 3.5,则可以使用HeaderTemplate属性以编程方式设置头部,或使用ListView。
就个人而言,如果可能的话,我更喜欢ListView而不是GridView和DetailsView,它可以让你更好地控制你的html。
答案 6 :(得分: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();
答案 7 :(得分:1)
将此属性添加到网格视图中:ShowHeaderWhenEmpty =“True” 它可能有助于检查
答案 8 :(得分: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,并在其中放置了一个GridView,其中包含ShowHeader =&#34; false&#34;以便顶行与所有其他行的大小相同。
<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>
答案 9 :(得分:1)
<asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">
这是使用EmptyDataText和ShowHeaderWhenEmpty的Gridview的基本示例
答案 10 :(得分:1)
Juste添加ShowHeaderWhenEmpty属性并将其设置为true
此解决方案适合我
答案 11 :(得分:0)
我使用的是asp sqlDataSource。当我将CancelSelectOnNullParameter设置为false时,它对我有用,如下所示:
select name, array_agg(distinct key) as not_null_columns
from my_table t
cross join jsonb_each(to_jsonb(t)- 'name')
where value <> 'null'
group by name;
name | not_null_columns
------+------------------
jake | {a,b,d}
mike | {c,d}
phil | {a,b,c}
(3 rows)
答案 12 :(得分:-1)
您可以使用EmptyDataText
,如下所示:
<asp:GridView ID="_gridView" RunAt="server" AutoGenerateColumns="false"
EmptyDataText="No entries found.">
它不显示标题,它会显示您的消息“找不到条目”。代替。
答案 13 :(得分:-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();
答案 14 :(得分:-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();
Help.. see that link:
http://www.c-sharpcorner.com/UploadFile/d0e913/how-to-display-the-empty-gridview-in-case-of-no-records-in-d/
答案 15 :(得分:-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>