在C#中,即使数据源为空,我仍如何显示gridview的标题。
我不是自动生成列,因为它们都是预定义的。
目前我正在做的事情如下。
从存储过程中获取一个DataTable,然后设置gridview的DataSource,然后调用DataBind()。
当我有数据时,这很好用,但是当不返回任何行时,我只是在网格应有的地方空白。
编辑:感谢所有的.NET 4+属性。我在.NET 3.5天内问过这个问题。现在,这要容易得多。:)
Answers:
ASP.Net 4.0添加了booleanShowHeaderWhenEmpty
属性。
http://msdn.microsoft.com/zh-CN/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()
发布后,我确实提出了一种可行的方法。但是,我认为这不是处理此问题的最佳方法。有更好的建议吗?
//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;
}
我只是在解决这个问题,而这些解决方案都不适合我。我无法使用该EmptyDataTemplate
属性,因为我正在GridView
使用自定义字段动态创建我的字段,这些字段在标头中提供过滤器。我无法使用示例almny发布,因为我使用ObjectDataSource
s而不是DataSet
or DataTable
。但是,我发现此答案发布在另一个StackOverflow问题上,该问题链接到这个精巧的解决方案,我可以针对自己的特殊情况进行工作。它涉及重写的CreateChildControls
方法,GridView
以创建如果存在真实数据将创建的相同标题行。我认为值得在这里发布,很可能其他人也可以在类似版本中找到它。
如果您使用的是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都会更新。如果未找到任何记录,则显示空行。
您可以将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();
我找到了一个非常简单的解决方案。我只是创建了两个GridViews。第一个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 =“ false”,以便第一行的大小与所有其他行的大小相同。
<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>
我正在使用asp sqlDataSource。当我将CancelSelectOnNullParameter设置为false时,它为我工作,如下所示:
<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>
<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();
您可以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();
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没有记录时,您将看到带有标题的网格以及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>