ASP.NET 2.0(C#)Webアプリがあり、その中にOracleデータベースからデータを取得するグリッドビューがあります。
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
はデータバインドされており、後でページをレンダリングするときに実際のデータをフェッチするため、これは機能しません。 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
データバインディングを使用している場合、グリッド自体の数ではなく、データソースの行数。
最初にヘルパークラスを作成します。
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()
とても簡単です。うまくいきますように.. :)
データがバインドされた後に発生する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;
}
}
DBからデータを自動的にフェッチするようにGVを構成した場合は、ソースモードでGVの最初のステートメントとして次の行を追加できます。
<EmptyDataTemplate>No data found.</EmptyDataTemplate>
次に、GVで通常のコードを続行します。
すでに回答に基づいて、GridView.Rows.Count
は、GridView
の性質に応じて、それだけでは十分ではありません。特に、動的gvである場合は、ほとんどの場合は動的であり、さらに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」行であるか、空であるか何もないかがわかります。
明らかに私の場合、GridviewRowが実際のデータ行であるかどうかを通知するHiddenFieldがあります。これは、グリッドビューに(目的のために)空白行といくつかのデータ行を事前に入力するためです。
ただし、DataRow対HeaderRowなどに基づいてチェックする、より単純なバージョン...
foreach (GridViewRow gvRow in myGridView.Rows)
if (gvRow.RowType == DataControlRowType.DataRow)
{
//do what you need
}
これがお役に立てば幸いです。
つまり、以下に示すように列挙しない限り、残念ながらGridView.IsEmpty()関数はありません。