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

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

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

我已经试过了:

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

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

有什么想法吗?

谢谢。

【问题讨论】:

    标签: c# asp.net gridview null


    【解决方案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() 函数,除非你枚举一个,如下所示。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多