GridView - Показать заголовки в пустом источнике данных

В C # как мне по-прежнему показывать заголовки gridview, даже если источник данных пуст.

Я не создаю столбцы автоматически, поскольку все они предопределены.

В настоящее время я делаю следующее.

Получите DataTable из хранимой процедуры, затем установите DataSource для gridview, а затем вызовите DataBind ().

Это отлично работает, когда у меня есть данные, но когда строки не возвращаются, я просто получаю пустое место на месте сетки.

Изменить: спасибо всем за свойство .NET 4+. Я спросил об этом еще в .NET 3.5 дня. Теперь это намного проще. :)


person Joshua Hudson    schedule 09.12.2008    source источник


Ответы (15)


В ASP.Net 4.0 добавлено логическое свойство ShowHeaderWhenEmpty.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.showheaderwhenempty.aspx


<asp:GridView runat="server" ID="GridView1" ShowHeaderWhenEmpty="true" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField HeaderText="First Name" DataField="FirstName" />
        <asp:BoundField HeaderText="Last Name" DataField="LastName" />
    </Columns>
</asp:GridView>

Примечание: заголовки не появятся, если DataBind () не будет вызван с чем-то другим, кроме null.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()
person zacharydl    schedule 17.02.2011
comment
Убедитесь, что вы привязываете что-нибудь к данным, для ShowHeadersWhenEmpty требуется хотя бы пустая привязка данных списка. - person Tenerezza; 11.05.2012
comment
То, что упомянул @Tenerezza, важно, включите это в ответ. Это сэкономит кому-нибудь время. - person James Poulose; 10.08.2014

После публикации я нашел способ, который работает. Однако я не считаю, что это лучший способ справиться с этим. Есть предложения по лучшему?

//Check to see if we get rows back, if we do just bind.

if (dtFunding.Rows.Count != 0)
{
    grdFunding.DataSource = dtFunding;
    grdFunding.DataBind();
}
else
{
  //Other wise add a emtpy "New Row" to the datatable and then hide it after binding.

     dtFunding.Rows.Add(dtFunding.NewRow());
     grdFunding.DataSource = dtFunding;
     grdFunding.DataBind();
     grdFunding.Rows[0].Visible = false;
}
person Joshua Hudson    schedule 09.12.2008
comment
Это тоже поможет. dtFunding.DataSource = dtFunding; dtFunding.DataBind (); - person Zain Ali; 21.04.2012

Я просто работал над этой проблемой, и ни одно из этих решений не помогло мне. Я не мог использовать свойство EmptyDataTemplate, потому что я создавал свой GridView динамически с настраиваемыми полями, которые предоставляют фильтры в заголовках. Я не мог использовать опубликованный пример, потому что я использую ObjectDataSources вместо DataSet или DataTable. Однако я нашел этот ответ опубликовано на другом вопросе StackOverflow, который ссылается на это элегантное решение, которое я смог применить в моей конкретной ситуации. Он включает в себя переопределение метода CreateChildControls GridView для создания той же строки заголовка, которая была бы создана, если бы были реальные данные. Я подумал, что стоит опубликовать здесь, где это может быть найдено другими людьми в аналогичном исправлении.

person StriplingWarrior    schedule 14.07.2009

Если вы работаете с ASP.NET 3.5 и ниже и ваша проблема относительно проста, как моя, вы можете просто вернуть пустую строку из запроса SQL.

if not exists (select RepId, startdate,enddate from RepTable where RepID= 10)
     select null RepID,null StartDate,null EndDate
else
     select RepId, startdate,enddate from RepTable where RepID= 10

Это решение не требует кода C # или кода ASP.NET.

  1. Убедитесь, что вы присвоили пустым столбцам подходящие имена, иначе это не сработает.
  2. Должен быть включен другой блок, который является тем же запросом, что и в if not exists (query part)
  3. В моем случае, если я использую @RepID вместо 10. Что отображается в поле DropDownList вне gridview.

Каждый раз, когда я меняю раскрывающийся список для выбора другого представителя, Gridview обновляется. Если запись не найдена, отображается пустая строка.

person Hammad Khan    schedule 10.07.2012
comment
Спасибо Хаммад Хану. У нас это сработало. Я прочитал десятки потоков по этому поводу, и это единственный случай использования этого подхода, основанного только на SQL (или в основном на SQL - мне нужно скрыть нулевую строку), с которым я столкнулся. Что еще более важно для нас: это приводит к тому, что отображается нижний колонтитул, что является более сложной проблемой, чем отображение заголовков. :) - person Zeek2; 17.12.2019
comment
Рад, что у вас сработало, довольно простое решение :) - person Hammad Khan; 21.12.2019

установить "<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""

showheaderwhenEmpty Недвижимость

person vikram Jangra    schedule 20.12.2012

Вы можете использовать свойство HeaderTemplate для программной настройки заголовка или использовать вместо него ListView, если вы используете .NET 3.5.

Лично я предпочитаю ListView GridView и DetailsView, если это возможно, это дает вам больше контроля над вашим HTML.

person Liwen    schedule 09.12.2008

Вы можете установить для свойства ShowHeadersWhenNoRecords свойства ownertableview значение true. aspx:

<asp:GridView ID="RadGrid2" runat="server" >       
<MasterTableView ShowHeadersWhenNoRecords="true"  > 

Также, когда источник данных для GridView имеет значение NULL (когда нет записей), вы можете попробовать установить его, как показано ниже: c #:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();
person kez    schedule 29.06.2016

Добавьте это свойство в представление сетки: ShowHeaderWhenEmpty = "True", это может помочь, просто проверьте

person tariq    schedule 18.04.2012

Нашел очень простое решение проблемы. Я просто создал два GridView. Первый GridView вызвал DataSource с запросом, который был разработан, чтобы не возвращать строки. Он просто содержал следующее:

    <Columns>
        <asp:TemplateField HeaderStyle-HorizontalAlign="Left">
            <HeaderTemplate>

               <asp:Label ID="lbl0" etc.>  </asp:Label>
               <asp:Label ID="lbl1" etc.>  </asp:Label>

            </HeaderTemplate>
        </asp:TemplateField>
    </Columns>

Затем я создал div со следующими характеристиками и поместил в него GridView с ShowHeader = "false", чтобы верхняя строка имела тот же размер, что и все остальные строки.

<div style="overflow: auto; height: 29.5em; width: 100%">
    <asp:GridView ID="Rollup" runat="server" ShowHeader="false" DataSourceID="ObjectDataSource">
        <Columns>
            <asp:TemplateField HeaderStyle-HorizontalAlign="Left">
                <ItemTemplate>

               <asp:Label ID="lbl0" etc.>  </asp:Label>
               <asp:Label ID="lbl1" etc.>  </asp:Label>

                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>
person anegin    schedule 13.06.2012

<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

Это базовый пример Gridview с EmptyDataText и ShowHeaderWhenEmpty.

person user2753577    schedule 06.09.2013

Juste add ShowHeaderWhenEmpty property and set it at true

Это решение работает для меня

person onlyme    schedule 27.02.2015

Я использовал asp sqlDataSource. У меня это сработало, когда я установил для параметра CancelSelectOnNullParameter значение false, как показано ниже:

<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>

person Md Toufiqul Islam    schedule 24.01.2018

Вы можете использовать EmptyDataText, как показано ниже:

<asp:GridView ID="_gridView" RunAt="server" AutoGenerateColumns="false"
          EmptyDataText="No entries found.">

Заголовки не отображаются, отображается сообщение «Записи не найдены». вместо.

person Dmitriy Pichugin    schedule 21.09.2012
comment
Это не совсем то, о чем я просил. Я искал способ показать пустую сетку с заголовками. Я знаю, что всегда мог использовать EmptyDataText, но мои требования специально предусматривали пустую сетку с заголовками, если данных не существовало. - person Joshua Hudson; 11.10.2012

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

<asp:GridView ID="gvResults" AutoGenerateColumns="False" HeaderStyle-CssClass="tableheader" runat="server">
    <EmptyDataTemplate>
        <asp:Label ID="lblEmptySearch" runat="server">No Results Found</asp:Label>
    </EmptyDataTemplate>
    <Columns>
        <asp:BoundField DataField="ItemId" HeaderText="ID" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        ...
    </Columns>
</asp:GridView>
person Community    schedule 09.12.2008

person    schedule
comment
Пожалуйста, объясните свой код. Ответы, содержащие только код, обычно бесполезны для OP. - person mastov; 08.07.2015