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

时间:2008-12-09 21:52:21

标签: asp.net gridview header

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

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

目前我正在做的是以下内容。

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

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

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

16 个答案:

答案 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而不是DataSetDataTable。但是,我发现另一个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代码

  1. 确保将空列转换为适当的名称,否则将无效。
  2. 必须包含其他块,这与if not exists (query part)
  3. 中的查询相同
  4. 在我的情况下,如果我使用@RepID而不是10.它被映射到gridview外的DropDownList框。
  5. 每次我更改下拉列表以选择不同的代表时,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>