by WebSurfer
18. March 2026 18:21
ASP.NET Web Forms アプリの GirdView、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>