GridView - Показать заголовки на пустом источнике данных - PullRequest
74 голосов
/ 10 декабря 2008

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

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

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

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

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

Редактировать: Спасибо всем за свойство .NET 4+. Я спросил это еще в .NET 3,5 дня. Теперь это намного проще. :)

Ответы [ 16 ]

125 голосов
/ 17 февраля 2011

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 () не вызывается с чем-то отличным от нуля.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()
32 голосов
/ 10 декабря 2008

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

//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;
}
5 голосов
/ 15 июля 2009

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

3 голосов
/ 20 декабря 2012

комплект "<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""

showheaderwhenEmpty Имущество

3 голосов
/ 10 июля 2012

Если вы работаете с 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 обновляется. Если запись не найдена, отображается пустая строка.

2 голосов
/ 29 июня 2016

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

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

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

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();
2 голосов
/ 10 декабря 2008

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

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

1 голос
/ 27 февраля 2015

Juste добавляет свойство ShowHeaderWhenEmpty и устанавливает его в true

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

1 голос
/ 06 сентября 2013
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

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

1 голос
/ 13 июня 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...