C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■98118 / )  Re[3]: TemplateFieldの動的追加について
□投稿者/ WebSurfer (2348回)-(2021/09/20(Mon) 11:10:43)
No98116 (Yammaer さん) に返信

> 今回の上記ではLableコントロールですが、実際はLabelコントロールとCheckBoxコントロールを
> 使用する予定です。
> 
> RowDataBound イベントで値をテキストに直接する方法も最終手段として考えておりますが、
> 出来れば、元のソースをできるだけ生かすことと、経験も兼ねて、データバインドでできればと思って
> おります。

昔、Microsoft の VS2008 の MSDN ライブラリに「方法 : DataList Web サーバー コントロール
のテンプレートを動的に作成する 」というのがあって(今はネットには見つからない)、その方法
が GridView にも使えます。

質問に書いてあった ITemplate インターフェイスを継承してなんちゃらというプリミティブことを
する必要はなくて、以下の手順で簡単に TemplateField を追加できます。

(1) テンプレートの中身のコントロールを配置したユーザーコントロール (.ascx) を作成する。

質問者さんは「LabelコントロールとCheckBoxコントロール」とのことなので以下のようにします。
下の例ではユーザーコントロールの名前は NewTemplate.ascx.cs としています。データバインド式
も含めることができます。質問者さんのケースでは "ProductName" ではなく "SyoruiName" になる
のでしょうか。

<%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="NewTemplate.ascx.cs" Inherits="WebApplication2.NewTemplate" %>

<asp:CheckBox ID="CheckBox1" runat="server" />

<asp:Label ID="Label1" runat="server" Text='<%# Eval("ProductName") %>'></asp:Label>

(2) TemplateField を生成、Page.LoadTemplate メソッドで (1) の .ascx を ItemTemplate
にロードした上で GridView の列に追加。

その .aspx と .aspx.cs のコードは以下のようになります。

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" 
    AutoEventWireup="true" CodeBehind="LoadTemplate.aspx.cs" 
    Inherits="WebApplication2.LoadTemplate" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <h1>GridView</h1>
    <asp:SqlDataSource ID="SqlDataSource1" 
        runat="server" 
        ConnectionString="<%$ ConnectionStrings:NORTHWINDConnectionString %>" 
        SelectCommand="SELECT TOP 10 [ProductID], [ProductName], [UnitPrice] FROM [Products]">
    </asp:SqlDataSource>

    <asp:GridView ID="GridView1" 
        runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ProductID" 
        DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
                InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
            <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
                SortExpression="ProductName" />
            <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
                SortExpression="UnitPrice" />
        </Columns>
    </asp:GridView>
</asp:Content>


using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class LoadTemplate : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            var templateField = new TemplateField();
            templateField.ItemTemplate = Page.LoadTemplate("NewTemplate.ascx");
            templateField.HeaderText = "動的に追加した ItemTemplate";
            GridView1.Columns.Add(templateField);
        }
    }
}

返信 編集キー/


管理者用

- Child Tree -