web-dev-qa-db-ja.com

GridView-空のデータソースにヘッダーを表示

C#では、データソースが空であってもグリッドビューのヘッダーをどのように表示しますか?.

列はすべて事前定義されているため、自動生成していません。

現在、私がしていることは次のとおりです。

ストアドプロシージャからDataTableを取得し、gridviewのDataSourceを設定してから、DataBind()を呼び出します。

これはデータがある場合は正常に機能しますが、行が返されない場合は、グリッドがあるべき場所に空白のスポットができます。

編集:.NET 4+プロパティに感謝します。NET3.5日間でこれを尋ねました。これは今ではずっと簡単です。:)

74
Joshua Hudson

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

これを投稿した後、私は機能する方法を思いつきました。ただし、これを処理する最善の方法だとは思わない。より良いものに関する提案はありますか?

//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;
}
33
Joshua Hudson

私はこの問題に取り組んでいただけで、これらの解決策はどれもうまくいきませんでした。ヘッダーにフィルターを提供するカスタムフィールドを使用してEmptyDataTemplateを動的に作成していたため、GridViewプロパティを使用できませんでした。 ObjectDataSourceまたはDataSetの代わりにDataTablesを使用しているため、投稿されたサンプルのalmnyは使用できませんでした。しかし、私は この回答 が別のStackOverflowの質問に投稿されており、このリンクは このエレガントなソリューション にリンクしているので、特定の状況で動作することができました。 CreateChildControlsGridViewメソッドをオーバーライドして、実際のデータがあった場合に作成されるはずの同じヘッダー行を作成する必要があります。ここに投稿する価値があると思いましたが、同様の修正で他の人が見つける可能性があります。

5

"<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""を設定

showheaderwhenEmptyプロパティ

3
vikram Jangra

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コードは必要ありません。

  1. Null列を適切な名前にキャストしてください。そうしないと機能しません。
  2. if not exists (query part)と同じクエリであるElseブロックを含める必要があります
  3. 私の場合、10の代わりに@RepIDを使用している場合、gridviewの外のDropDownListボックスにマップされます。

ドロップダウンを変更して別の担当者を選択するたびに、Gridviewが更新されます。レコードが見つからない場合、ヌル行が表示されます。

3
Hammad Khan

.NET 3.5を使用している場合、HeaderTemplateプロパティを使用してプログラムでヘッドをセットアップするか、代わりにListViewを使用できます。

個人的には、可能であればGridViewやDetailsViewよりもListViewの方が好きです。HTMLをより細かく制御できます。

2
Liwen

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
kez

問題の非常に簡単な解決策を見つけました。 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>
1
anegin

このプロパティをグリッドビューに追加します:ShowHeaderWhenEmpty = "True"

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

これは、EmptyDataTextとShowHeaderWhenEmptyを使用したGridviewの基本的な例です

1
user2753577

Juste ShowHeaderWhenEmptyプロパティを追加してtrueに設定します

このソリューションは私のために働く

1
onlyme

私はasp sqlDataSourceを使用していました。以下のようにCancelSelectOnNullParameterをfalseに設定するとうまくいきました。

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

0