GridView - Показати заголовки на порожньому джерелі даних


77

У C # як мені все-таки показувати заголовки сітки, навіть якщо джерело даних порожнє.

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

В даний час я роблю наступне.

Отримайте DataTable назад із збереженої процедури, потім встановіть DataSource gridview та викличте DataBind ().

Це добре працює, коли у мене є дані, але коли не повертається жодного рядка, я просто отримую порожнє місце там, де повинна бути сітка.

Редагувати: Дякую всім за властивість .NET 4+. Я запитав це ще в .NET 3,5 днів. Зараз це набагато простіше. :)

Відповіді:


136

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

14
Переконайтеся, що ви прив'язуєте дані щонайменше, ShowHeadersWhenEmpty вимагає принаймні порожнього списку даних.
Тенерецца

2
Що згаданого @Tenerezza є важливим, будь ласка, включіть це у відповідь. Це врятувало б когось трохи часу.
James Poulose

34

Опублікувавши це, я придумав спосіб, який працює. Однак я не вважаю, що це найкращий спосіб вирішити це. Будь-які пропозиції щодо кращого?

//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;
}

1
Це теж зробить трюк. dtFunding.DataSource = dtFunding; dtFunding.DataBind ();
Zain Ali

5

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


4

Якщо ви працюєте з 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 оновлюється. Якщо жодного запису не знайдено, він відображає нульовий рядок.


Дякую Хаммаду-хану. Це спрацювало для нас. Я прочитав десятки потоків з цього приводу, і це єдине явище такого підходу, який я мав лише для SQL (або в основному для SQL - мені потрібно буде приховати нульовий рядок). Що ще важливіше для нас: це також призводить до відображення нижнього колонтитула, що є складнішою проблемою, ніж відображення заголовків. :)
Zeek2

1
Радий, що це спрацювало для вас, досить просте рішення :)
Хаммад Хан,


2

Ви можете використовувати властивість HeaderTemplate для програмного налаштування голови або замість цього використовувати ListView, якщо ви використовуєте .NET 3.5.

Особисто я віддаю перевагу ListView перед GridView та DetailsView, якщо це можливо, це дає вам більше контролю над вашим html.


2

Ви можете встановити для властивості ShowHeadersWhenNoRecords власникаviewview значення true. aspx:

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

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

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

1

Додайте цю властивість у свій grid-view: ShowHeaderWhenEmpty = "True", це може допомогти просто перевірити


1

Я знайшов дуже просте рішення проблеми. Я просто створив два 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>

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

Це базовий приклад Gridview з EmptyDataText і ShowHeaderWhenEmpty


1

Джусте додає властивість ShowHeaderWhenEmpty і встановлює для нього значення true

Це рішення працює для мене


0

Я використовував asp sqlDataSource. Це спрацювало для мене, коли я встановив для параметра CancelSelectOnNullParameter значення false, як показано нижче:

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


-1
<asp:GridView ID="gvEmployee" runat="server"    
                 AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”>  
                    <Columns>  
                        <asp:BoundField DataField="Id" HeaderText="Id" />  
                        <asp:BoundField DataField="Name" HeaderText="Name" />  
                        <asp:BoundField DataField="Designation" HeaderText="Designation" />  
                        <asp:BoundField DataField="Salary" HeaderText="Salary"  />  
                    </Columns>  
                    <EmptyDataTemplate>No Record Available</EmptyDataTemplate>  
                </asp:GridView>  


in CS Page

gvEmployee.DataSource = dt;  
gvEmployee.DataBind();  

1
Будь ласка, поясніть свій код. Відповіді лише на коди не є корисними для ОП.
мастов

-2

Ви можете використовувати, EmptyDataTextяк показано нижче:

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

Він не відображає заголовки, а відображає ваше повідомлення "Записів не знайдено". замість цього.


2
Це не зовсім те, про що я просив. Я шукав спосіб показати порожню сітку, З заголовками. Я знаю, що завжди міг використовувати EmptyDataText, але мої вимоги спеціально вимагали порожньої сітки із заголовками, якщо даних не було.
Джошуа Хадсон,

-2
    <asp:GridView ID="gvEmployee" runat="server"    
                     AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”>  
                        <Columns>  
                            <asp:BoundField DataField="Id" HeaderText="Id" />  
                            <asp:BoundField DataField="Name" HeaderText="Name" />  
                            <asp:BoundField DataField="Designation" HeaderText="Designation" />  
                            <asp:BoundField DataField="Salary" HeaderText="Salary"  />  
                        </Columns>  
                        <EmptyDataTemplate>No Record Available</EmptyDataTemplate>  
                    </asp:GridView>  


    in CS Page

    gvEmployee.DataSource = dt;  
    gvEmployee.DataBind();  

Help.. see that link:
http://www.c-sharpcorner.com/UploadFile/d0e913/how-to-display-the-empty-gridview-in-case-of-no-records-in-d/

-3

Використовуйте EmptyDataTemplate, як показано нижче. Коли у вашому DataSource немає записів, ви побачите свою сітку із заголовками та буквальний текст або 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.