GridView - показывать заголовки на пустом источнике данных
В C# как я все еще показываю заголовки gridview, даже если источник данных пуст.
Я не автоматически генерирую столбцы, поскольку они все предопределены.
в настоящее время я делаю следующее.
получить DataTable обратно из хранимой процедуры, затем установить источник данных gridview, а затем вызвать DataBind().
Это отлично работает, когда у меня есть данные, но когда строки не возвращаются, я просто получаю пустое место, где сетка должна быть.
редактировать: спасибо всем за .Чистая 4+ собственность. Я спросил об этом еще в .NET 3.5 дней. Теперь это намного проще. :)
16 ответов:
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()
после публикации этого я придумал способ, который работает. Однако я не думаю, что это лучший способ справиться с этим. Какие-нибудь предложения по лучшему?
//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; }
Я просто работал над этой проблемой, и ни одно из этих решений не будет работать для меня. Я не мог использовать
EmptyDataTemplateсвойство, потому что я создавал свойGridViewдинамически с пользовательскими полями, которые обеспечивают фильтры в заголовках. Я не мог использовать пример almny, потому что я используюObjectDataSources вместоDataSetилиDataTable. Однако я нашел ответ опубликовано на другой вопрос StackOverflow, который ссылается на это элегантное решение что я был в состоянии сделать работу для моей конкретной ситуации. Это включает в себя переопределениеCreateChildControlsметодGridViewчтобы создать ту же строку заголовка, которая была бы создана, если бы были реальные данные. Я подумал, что это стоит опубликовать здесь, где его, вероятно, найдут другие люди в аналогичном исправлении.
Если вы работаете с 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 код
- убедитесь, что вы бросили пустые столбцы в соответствующие имена, иначе это не будет работать.
- Else блок должен быть включен, который является тот же запрос, что и в
if not exists (query part)- в моем случае, если я использую @RepID вместо этого из 10. Который сопоставляется с выпадающим списком за пределами gridview.
каждый раз, когда я меняю выпадающее меню, чтобы выбрать другую репутацию, GridView обновляется. Если запись не найдена, она показывает пустую строку.
set
"<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""
showheaderwhenEmptyсвойства
вы можете использовать свойство HeaderTemplate для программной настройки head или использовать ListView вместо этого, если вы используете .NET 3.5.
лично я предпочитаю ListView над GridView и DetailsView, если это возможно, это дает вам больше контроля над вашим html.
Я нашел очень простое решение проблемы. Я просто создал два GridViews. Первый GridView вызвал источник данных с запросом, который был разработан, чтобы не возвращать строки. Он просто содержал следующее:
<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>
<asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">это основной пример Gridview с EmptyDataText и ShowHeaderWhenEmpty
вы можете установить 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();
я использовал asp sqlDataSource. Это сработало для меня, когда я установил CancelSelectOnNullParameter в false, как показано ниже:
<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>
вы можете использовать
EmptyDataTextкак показано ниже:<asp:GridView ID="_gridView" RunAt="server" AutoGenerateColumns="false" EmptyDataText="No entries found.">он не показывает заголовки, он отображает ваше сообщение "нет записей не найдено." вместо.
<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();
<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/
используйте 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>
Comments