2009-04-08 54 views
15

我有一个ASP.NET 2.0(C#)的Web应用程序,并在其中我有一个从Oracle数据库获取其数据的GridView。如何检查一个空Gridview

我想知道如何检查gridview是否为空,并做些什么。

我已经尝试:

if(GridView.Rows.Count == 0) 
{ 
// Do Something 
} 

,但它不工作...

任何想法?

谢谢。

回答

22

您的代码应该工作。但是只有在调用GridView.DataBind()之后。一般来说,我不检查它自己的GridView,而是网格视图的数据源。

DataTable data = DAL.getdata(); 
if (data.Rows.Count == 0) 
{ 
    ShowEmptyData(); 
} 
else 
{ 
    Grid.DataSource = dt; 
    Grid.DataBind(); 
} 
4

如果您使用的是数据绑定,则数据源的行计数不是网格本身的计数。

18

这是行不通的,因为GridView是数据绑定的,并且在渲染页面的同时将在稍后时间获取实际数据。你应该通过直接查询gridview的数据绑定源来查看它(查看网格视图绑定的实际列表是否为空)。

如果你只想当它是空的,显示的东西,你应该在你的标记使用<EmptyDataTemplate>

<asp:GridView runat="server"> 
<EmptyDataTemplate>The grid is empty</EmptyDataTemplate> 
</asp:GridView> 
+2

+1 -The EmptyDataTemplate是最优雅的解决方案恕我直言 – 2009-04-08 20:30:30

+3

+1您也可以使用EmptyDataText属性 – 2009-04-09 13:10:33

6

我同意其他答复。我想补充的信息很少,你要经过数据绑定方法得到rows.count:

int rowCount = GridView.Rows.Count; // returns zero 

GridView.DataBind(); 

rowCount = GridView.Rows.Count; // returns actual row count 
+1

只需更多信息:如果启用了分页,gridview将只显示最大分页行数。所以最好检查实际数据源 – 2009-04-08 19:53:52

+0

好点,谢谢。 – Canavar 2009-04-08 19:58:02

+1

嗨@Canavar,只是想知道,如果 GridView.DataBind();是否可以不绑定到任何数据源? – 2014-05-27 11:42:40

0

它很容易:希望你的作品.. :)

GridView的数据绑定使用事件:这之后触发数据是绑定的。

protected void GridView1_DataBound(object sender, EventArgs e) 
{ 
    int rowCount = GridView1.Rows.Count; 

    if (rowCount == 0) 
    { 
     GridView1.Visible = false;     
    } 
    else 
    { 
     GridView1.Visible = true; 
    } 

} 
+0

不完全。 Row.Count包括任何页眉和页脚 – Fandango68 2017-03-24 01:33:16

0

如果你已经配置了你GV自动抓取数据从数据库中的数据,那么你还可以添加以下线路上,GV的第一个语句源代码模式:

<EmptyDataTemplate>No data found.</EmptyDataTemplate> 

然后继续使用GV中的正常代码。

1

首先创建一个辅助类。

public static class GridViewExtensions 
{ 
    public static IEnumerable<GridViewRow> AsEnumerable(this GridView grid) 
    { 
     foreach (GridViewRow row in grid.Rows) 
     { 
      yield return row; 
     } 
    } 

    public static bool IsEmpty(this GridView grid) 
    { 
     return !grid.AsEnumerable().Any(t => t.RowType == DataControlRowType.DataRow); 
    } 
} 

然后,只需根据答案已经为IsEmpty

GridView1.IsEmpty() 
+0

你有可能重写VS2005的这个机会吗? – Fandango68 2017-03-24 01:32:49

0

打电话,GridView.Rows.Count是够不上自己的,这取决于你GridView的性质,特别是如果它是一个动态的货车,在大多数情况下它是,再加上你必须考虑Paginating,页眉和页脚,这会改变行数。

我用一个简单的方法告诉我......

//checks if a gridview has any actual rows of data (not just blank rows filled in by the Load 
protected bool gvNoData(GridView gv) 
{ 
    int wsDataRow = 0; 
    foreach (GridViewRow gvRow in gv.Rows) 
     if (gvRow.RowType == DataControlRowType.DataRow) 
     { 
      HiddenField hf = (HiddenField)gvRow.FindControl("hfStudentID"); 
      if (hf != null) 
       if (hf.Value.ToString().Length > 0) 
        wsDataRow +=1; 
     } 

    //if a count was generated then there are data rows, otherwise the rows are blank or nonexistant 
    if (wsDataRow > 0) return false; 
    else return true; 
} 

所以运行这样会告诉你,如果该行真的是“ ‘DATA’行,或空或没有!

显然,在我来说,我有一个HiddenField如果GridViewRow告诉我是一个实际的数据行,因为我我的预填空白行(对于我而言)和一些数据行的GridView。

然而,一个更简单的版本基础上的DataRow VS HeaderRow,等检查...

 foreach (GridViewRow gvRow in myGridView.Rows) 
      if (gvRow.RowType == DataControlRowType.DataRow) 
      { 
//do what you need 
      } 

我希望这可以帮助。

总之,没有GridView.IsEmpty()函数不幸的是,除非你如下所示枚举之一。