C#では、データソースが空であってもグリッドビューのヘッダーをどのように表示しますか?.
列はすべて事前定義されているため、自動生成していません。
現在、私がしていることは次のとおりです。
ストアドプロシージャからDataTableを取得し、gridviewのDataSourceを設定してから、DataBind()を呼び出します。
これはデータがある場合は正常に機能しますが、行が返されない場合は、グリッドがあるべき場所に空白のスポットができます。
編集:.NET 4+プロパティに感謝します。NET3.5日間でこれを尋ねました。これは今ではずっと簡単です。:)
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
プロパティを使用できませんでした。 ObjectDataSource
またはDataSet
の代わりにDataTable
sを使用しているため、投稿されたサンプルのalmnyは使用できませんでした。しかし、私は この回答 が別のStackOverflowの質問に投稿されており、このリンクは このエレガントなソリューション にリンクしているので、特定の状況で動作することができました。 CreateChildControls
のGridView
メソッドをオーバーライドして、実際のデータがあった場合に作成されるはずの同じヘッダー行を作成する必要があります。ここに投稿する価値があると思いましたが、同様の修正で他の人が見つける可能性があります。
"<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""
を設定
showheaderwhenEmpty
プロパティ
ASP.NET 3.5以前を使用していて、私のような問題が比較的単純な場合は、SQLクエリからnull行を返すだけで済みます。
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コードは必要ありません。
if not exists (query part)
と同じクエリであるElseブロックを含める必要がありますドロップダウンを変更して別の担当者を選択するたびに、Gridviewが更新されます。レコードが見つからない場合、ヌル行が表示されます。
.NET 3.5を使用している場合、HeaderTemplateプロパティを使用してプログラムでヘッドをセットアップするか、代わりにListViewを使用できます。
個人的には、可能であればGridViewやDetailsViewよりもListViewの方が好きです。HTMLをより細かく制御できます。
OwnertableviewのShowHeadersWhenNoRecordsプロパティをtrueに設定できます。 aspx:
<asp:GridView ID="RadGrid2" runat="server" >
<MasterTableView ShowHeadersWhenNoRecords="true" >
また、GridViewのデータソースがnull(レコードがない場合)の場合、以下に示すように設定を試すことができます:c#:
if (GridView1.DataSource == null)
{
GridView1.DataSource = new string[] { };
}
GridView1.DataBind();
問題の非常に簡単な解決策を見つけました。 2つの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を作成し、ShowHeader = "false"を使用してその中にGridViewを配置して、一番上の行が他のすべての行と同じサイズになるようにします。
<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>
このプロパティをグリッドビューに追加します:ShowHeaderWhenEmpty = "True"
<asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">
これは、EmptyDataTextとShowHeaderWhenEmptyを使用したGridviewの基本的な例です
Juste ShowHeaderWhenEmptyプロパティを追加してtrueに設定します
このソリューションは私のために働く
私はasp sqlDataSourceを使用していました。以下のようにCancelSelectOnNullParameterをfalseに設定するとうまくいきました。
<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>