読者です 読者をやめる 読者になる 読者になる

プログラマーな日々

プログラマー兼SEです。好きな習慣:TDD、好きなツール:WorkFlowy、好きな言語:C#、好きなAWSのサービス:Data Pipeline。趣味は開発環境を改善することです。

カスタムバインド式をビハインドコードに移動する

.NET ASP.NET

前回(以下のエントリー)契約列のカスタムバインド式が複雑になってしまったので、ビハインドコードに移動させます。
TemplateFieldでGridViewの列をカスタマイズする - プログラマーな日々

ソースコード

HelloWorld.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="HelloWorld.aspx.cs" Inherits="HelloWorld" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [HogeTable]"></asp:SqlDataSource>
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="FName" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:TemplateField HeaderText="名前">
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("FName") + " " + Eval("LName") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="契約" SortExpression="Contract">
                <EditItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("Contract") %>' />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# ContractChecked() %>' Enabled="False" Text='<%# ContractText() %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    </form>
</body>
</html>
HelloWorld.aspx.cs
using System;

public partial class HelloWorld : System.Web.UI.Page {
    // aspxから参照可能にするためにはprotectedにする必要がある。
    protected bool ContractChecked() {
        return IsDBNull ? false : IsContract;
    }

    protected string ContractText() {
        if (IsDBNull) return "未登録";
        return IsContract ? "契約あり" : "契約なし";
    }

    private bool IsDBNull {
        get {
            object contract = Eval("Contract");
            return (contract == DBNull.Value);
        }
    }

    private bool IsContract {
        get {
            return (bool) Eval("Contract");
        }
    }
}