Как проверить наличие пустой Gridview

У меня есть веб-приложение ASP.NET 2.0 (С#), и в нем у меня есть 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 привязана к данным и собирается отображать фактические данные позднее при рендеринге страницы. Вы должны проверить это, напрямую обратившись к источнику привязки данных gridview (см. Если пустой список, связанный с сеткой, пуст или нет).

Если вы просто хотите отобразить что-то, когда оно пустое, вы должны использовать <EmptyDataTemplate> в своей разметке:

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

Ответ 3

Я согласен с другими ответами. Я хочу добавить небольшую информацию, вы должны получить rows.count после метода привязки данных:

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

GridView.DataBind();

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

Ответ 4

Если вы используете привязку данных, количество строк в источнике данных не является подсчетом самой сетки.

Ответ 5

Сначала создайте вспомогательный класс.

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

Ответ 6

Это очень просто: надеюсь, что это сработает для вас..:)

Использовать событие 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;
     }

 }

Ответ 7

Если вы настроили свой GV для автоматической выборки данных из БД, вы можете добавить следующую строку в качестве первого оператора вашего GV в режиме источника:

<EmptyDataTemplate>No data found.</EmptyDataTemplate>

И затем продолжайте с нормальным кодом в своем GV.

Ответ 8

На основе уже полученных ответов 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", или пусты или ничего!

Очевидно, что в моем случае у меня есть HiddenField, чтобы сказать мне, является ли GridViewRow фактической строкой данных, поскольку я предварительно заполняю gridview пустыми строками (для моих целей) и некоторыми datarows.

Тем не менее, более простая версия для проверки на основе DataRow vs HeaderRow и т.д.

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

Надеюсь, это поможет.

Короче говоря, нет функции GridView.IsEmpty(), к сожалению, если вы не перечислите ее, как показано ниже.