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 件のコメント :
コメントを投稿