2009/11/26

GridViewにテンプレート列を動的に生成する

このエントリーをはてなブックマークに追加
これは備忘録です。
GridViewの列に、好きなコントロールを配置させたいときはTemplateFieldを使います。
デザイナ画面の「テンプレートの編集」を使うことで、コードなんて書かなくても何かと編集できるようになっています。
デザイナ画面でテンプレート列の追加をしたくない場合、コードだけでなんとかやりくりしたい場合について書きます。

デザイナ画面でテンプレート列の追加をしたくない場合


デザイナ画面でテンプレート列の追加をしたくない場合は、ITemplateを継承したクラスを作成し、InstantiateInメソッドを実装します。
InstantiateInは引数にControlを持っていて、必要なコントロールを追加することができます。

// ITemplateを継承したCustomTemplateクラス
public class CustomTemplate : ITemplate {

#region ITemplate メンバ
    public void InstantiateIn(Control container) {
    // ボタンとテキストを追加
        container.Controls.Add(new Button());
        container.Controls.Add(new TextBox());
    }
#endregion

}

public partial class _Default : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
        if (!this.IsCallback) {
            // GridViewにテンプレート列を追加する。
            TemplateField template = new TemplateField();
            template.ItemTemplate = new CustomTemplate();
            this.GridView1.Columns.Add(template);

            // GridViewにデータを追加する
            string[] list = { "Sunday", "Monday", "Tuesday" };
            this.GridView1.DataSource = list;
            this.GridView1.DataBind();
        }
    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            Button button = (Button)e.Row.Cells[0].Controls[0];
            button.Text = e.Row.DataItem.ToString(); // ボタンの表示名を変更
        }
    }
}

できあがり。
Item列は、GridViewにAutoGenerateColumnsがTrueになっているためです。あまりにも意味のないサンプルですみません。


「動的に」とか言ってるわりにテンプレート列の位置は固定しないといけません。テンプレート内のコントローラの値を引っ張り出すのに、列のインデックスを指定しないといけないからです。固定しないでもよい方法(簡単かつ軽快な方法)、知ってる人教えていただきたいです。

参考
http://msdn.microsoft.com/ja-jp/library/system.web.ui.itemplate(VS.80).aspx

0 件のコメント :

コメントを投稿