WebSurfer's Home

Filter by APML

GridView, ListView でデータがない時もヘッダを表示

by WebSurfer 18. March 2026 18:21

ASP.NET Web Forms アプリの GirdView、ListView で、レコードが格納されてないデータソースがバインドされた時も、下の画像のようにヘッダ行を表示する方法を備忘録として書いておきます (デフォルトでは表示されません)。

GridView, ListView でデータがない時もヘッダを表示

以下に GridView と ListView のそれぞれの場合について書きます。上の画像を表示するのに使ったコードをこの記事の下の方に載せておきますのでそちらも参考にしてください。

(1) GridView

SqlDataSource のようなデータソースコントロールと組み合わせて使っていて、SqlDataSource がデータベースに SELECT クエリを投げても WHERE 句の条件が一致しないなどの理由でレコードを取得できない場合を考えます。

レコードを取得できなくても、SqlDataSource は空のデータソースを生成し、自動的にそれを GridView にデータバインドします。その場合は以下のように設定すれば上の画像のように表示されます。

データソースコントロールを使わないで自力でコードを書いて DataTable や List<T> を作成し、それを GridView の DataSource プロパティに設定して DataBind メソッドでバインドしている場合、ヘッダを表示するには空のデータソースを作ってバインドする必要がありますので注意してください。上の画像の GridView2 がそれで、コードはこの記事の下の方に載せましたので見てください。


(2) ListView

ListView には GridView の EmptyDataText のような便利なプロパティは存在しません。ListView.EmptyDataTemplate プロパティにデータが空の時表示したい html コードを書きます。

Visual Studio のデザイナを使って ListView のコードを生成させると、そのコードには EmptyDataTemplate が含まれるはずです。その中にヘッダと No data was returned. というメッセージ行の html コードを書いた結果が上の ListView の画像です。そのコードは下に載せましたので見てください。


上の画像を表示したコードは以下の通りです。

.aspx.cs

using System;
using System.Collections.Generic;

namespace WebForms1
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                // GridView2 はデータソースコントロールを使わない
                var data = new List<Hotel>();
                GridView2.DataSource = data;
                GridView2.DataBind();
            }
        }
    }

    public class Hotel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public decimal RoomCharge { get; set; }
    }
}

.aspx

<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="WebForm2.aspx.cs"
    Inherits="WebForms1.WebForm2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        table.style1 {
            border-style: solid;
            border-width: 2px;
            border-color: Silver;
            border-collapse: collapse;
        }

            table.style1 th {
                border-style: solid;
                border-width: 2px 1px 2px 1px;
                border-color: Silver;
                padding: 5px 8px;
                background-color: #6699FF;
                color: #FFFFFF;
            }

            table.style1 td {
                border-style: solid;
                border-width: 1px;
                border-color: Silver;
                padding: 2px 8px;
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
            ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>"
            SelectCommand="SELECT [CustomerID], [CompanyName], [Address], [City], 
                    [PostalCode], [Country] FROM [Customers] WHERE CustomerID='NoID'">
        </asp:SqlDataSource>

        <h3>GirdView</h3>

        <asp:GridView ID="GridView1" runat="server"
            AutoGenerateColumns="False"
            DataKeyNames="CustomerID"
            ShowHeaderWhenEmpty="True"
            DataSourceID="SqlDataSource1"
            EmptyDataText="No data was returned.">
            <Columns>
                <asp:BoundField DataField="CustomerID" HeaderText="CustomerID"
                    ReadOnly="True" SortExpression="CustomerID" />
                <asp:BoundField DataField="CompanyName" HeaderText="CompanyName"
                    SortExpression="CompanyName" />
                <asp:BoundField DataField="Address" HeaderText="Address"
                    SortExpression="Address" />
                <asp:BoundField DataField="City" HeaderText="City"
                    SortExpression="City" />
                <asp:BoundField DataField="PostalCode" HeaderText="PostalCode"
                    SortExpression="PostalCode" />
                <asp:BoundField DataField="Country" HeaderText="Country"
                    SortExpression="Country" />
            </Columns>
        </asp:GridView>

        <h3>GridView2</h3>
        <asp:GridView ID="GridView2" runat="server" 
            EmptyDataText="No data was returned." 
            ShowHeaderWhenEmpty="True"></asp:GridView>

        <h3>ListView</h3>

        <asp:ListView ID="ListView1" runat="server"
            DataKeyNames="CustomerID"
            DataSourceID="SqlDataSource1">
            <EmptyDataTemplate>
                <table class="style1">
                    <tr>
                        <th>CustomerID</th>
                        <th>CompanyName</th>
                        <th>Address</th>
                        <th>City</th>
                        <th>PostalCode</th>
                        <th>Country</th>
                    </tr>
                    <tr>
                        <td colspan="6">No data was returned.</td>
                    </tr>
                </table>
            </EmptyDataTemplate>
            <ItemTemplate>
                <tr style="">
                    <td>
                        <asp:Label ID="CustomerIDLabel" runat="server"
                            Text='<%# Eval("CustomerID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CompanyNameLabel" runat="server"
                            Text='<%# Eval("CompanyName") %>' />
                    </td>
                    <td>
                        <asp:Label ID="AddressLabel" runat="server"
                            Text='<%# Eval("Address") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CityLabel" runat="server"
                            Text='<%# Eval("City") %>' />
                    </td>
                    <td>
                        <asp:Label ID="PostalCodeLabel" runat="server"
                            Text='<%# Eval("PostalCode") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CountryLabel" runat="server"
                            Text='<%# Eval("Country") %>' />
                    </td>
                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table id="itemPlaceholderContainer" runat="server" class="style1">
                    <tr runat="server" style="">
                        <th runat="server">CustomerID</th>
                        <th runat="server">CompanyName</th>
                        <th runat="server">Address</th>
                        <th runat="server">City</th>
                        <th runat="server">PostalCode</th>
                        <th runat="server">Country</th>
                    </tr>
                    <tr id="itemPlaceholder" runat="server">
                    </tr>
                </table>
            </LayoutTemplate>
        </asp:ListView>
    </form>
</body>
</html>

Tags: , , ,

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。ブログ2はそれ以外の日々の出来事などのトピックスになっています。

Calendar

<<  May 2026  >>
MoTuWeThFrSaSu
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

View posts in large calendar