【发布时间】:2010-10-18 09:40:59
【问题描述】:
我有一个 ASP.NET 2.0 (C#) Web 应用程序,其中我有一个从 oracle 数据库获取数据的 gridview。
我想知道如何检查 gridview 是否为空,然后做点什么。
我已经试过了:
if(GridView.Rows.Count == 0)
{
// Do Something
}
但它不起作用......
有什么想法吗?
谢谢。
【问题讨论】:
我有一个 ASP.NET 2.0 (C#) Web 应用程序,其中我有一个从 oracle 数据库获取数据的 gridview。
我想知道如何检查 gridview 是否为空,然后做点什么。
我已经试过了:
if(GridView.Rows.Count == 0)
{
// Do Something
}
但它不起作用......
有什么想法吗?
谢谢。
【问题讨论】:
您的代码应该工作。但只有在调用了 GridView.DataBind() 之后。一般来说,我不检查 GridView 它是自己的,而是网格视图的数据源。
DataTable data = DAL.getdata();
if (data.Rows.Count == 0)
{
ShowEmptyData();
}
else
{
Grid.DataSource = dt;
Grid.DataBind();
}
【讨论】:
这不起作用,因为GridView 是数据绑定的,并且将在稍后呈现页面时获取实际数据。您应该通过直接查询网格视图的数据绑定源来检查这一点(查看网格视图绑定到的实际列表是否为空)。
如果您只想在内容为空时显示内容,则应在标记中使用<EmptyDataTemplate>:
<asp:GridView runat="server">
<EmptyDataTemplate>The grid is empty</EmptyDataTemplate>
</asp:GridView>
【讨论】:
我同意其他回答。我想补充一点,你应该在databind方法之后得到rows.count:
int rowCount = GridView.Rows.Count; // returns zero
GridView.DataBind();
rowCount = GridView.Rows.Count; // returns actual row count
【讨论】:
如果您使用数据绑定,则数据源的行数不是网格本身的计数。
【讨论】:
很简单:希望它对你有用.. :)
使用 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;
}
}
【讨论】:
首先创建一个辅助类。
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()
【讨论】:
如果您已将 GV 配置为自动从 DB 获取数据,那么您可以在 Source 模式下添加以下行作为 GV 的第一条语句:
<EmptyDataTemplate>No data found.</EmptyDataTemplate>
然后继续使用 GV 中的正常代码。
【讨论】:
根据已经得到的答案,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() 函数,除非你枚举一个,如下所示。
【讨论】: