如何检查空的 Gridview

Posted

技术标签:

【中文标题】如何检查空的 Gridview【英文标题】:How to check for an Empty Gridview 【发布时间】:2010-10-18 09:40:59 【问题描述】:

我有一个 ASP.NET 2.0 (C#) Web 应用程序,其中我有一个从 oracle 数据库获取数据的 gridview。

我想知道如何检查 gridview 是否为空,然后做点什么。

我已经试过了:

if(GridView.Rows.Count == 0)

// Do Something

但它不起作用......

有什么想法吗?

谢谢。

【问题讨论】:

【参考方案1】:

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

DataTable data = DAL.getdata();
if (data.Rows.Count == 0)

    ShowEmptyData();

else

    Grid.DataSource = dt;
    Grid.DataBind();

【讨论】:

【参考方案2】:

这不起作用,因为GridView 是数据绑定的,并且将在稍后呈现页面时获取实际数据。您应该通过直接查询网格视图的数据绑定源来检查这一点(查看网格视图绑定到的实际列表是否为空)。

如果您只想在内容为空时显示内容,则应在标记中使用<EmptyDataTemplate>

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

【讨论】:

【参考方案3】:

我同意其他回答。我想补充一点,你应该在databind方法之后得到rows.count:

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

GridView.DataBind();

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

【讨论】:

更多信息:如果启用分页,gridview 将仅显示分页的最大行数。所以最好检查实际的数据源 嗨@Canavar,只是想知道 GridView.DataBind();可以不绑定到任何数据源? 如果使用 EmptyDataTemplate 并且结果中内置了行,则检查行数仍然是一个问题。通常在没有返回数据的情况下为新记录添加带有插入操作的Footer,检查行数时需要对这些行进行调整。 @uɐpuɐɥƆ 是的。在将 GV 绑定到 DataTable 后使用 ViewState[] 并在需要返回 GV 时重用视图状态。去谷歌上查询。已经讨论过很多次了。【参考方案4】:

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

【讨论】:

【参考方案5】:

很简单:希望它对你有用.. :)

使用 GridView DataBound 的事件:绑定数据后触发。

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

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

 

【讨论】:

不完全。 Row.Count 包括任何页眉和页脚【参考方案6】:

首先创建一个辅助类。

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

【讨论】:

有机会为 VS2005 重写这个吗?【参考方案7】:

如果您已将 GV 配置为自动从 DB 获取数据,那么您可以在 Source 模式下添加以下行作为 GV 的第一条语句:

<EmptyDataTemplate>No data found.</EmptyDataTemplate>

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

【讨论】:

【参考方案8】:

根据已经得到的答案,GridView.Rows.Count 本身是不够的,这取决于您的GridView 的性质,特别是如果它是动态 gv,在大多数情况下是这样,而且您必须考虑 @987654323 @、页眉和页脚,它们会改变行数。

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

//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 与 HeaderRow 等检查的更简单版本...

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

我希望这会有所帮助。

简而言之,遗憾的是没有 GridView.IsEmpty() 函数,除非你枚举一个,如下所示。

【讨论】:

以上是关于如何检查空的 Gridview的主要内容,如果未能解决你的问题,请参考以下文章

如何检查扫描字符串的第一个字符,即使它是空的?

如何解决 At-clause 应该有一个非空的描述? - 检查样式 - Java

检查可为空的布尔值是不是为空[重复]

检查PHP数组是不是不为空的最简单方法[关闭]

如何检查Lua中的值是不是为空?

创建用于检查 LocalStorage 是不是为空的全局函数 - Vue.JS