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

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

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

Re[1]: GridViewで動的に列を追加した際に内容が消える


(過去ログ 64 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■37210 / inTopicNo.1)  GridViewで動的に列を追加した際に内容が消える
  
□投稿者/ ぶっちー (1回)-(2009/06/15(Mon) 18:01:10)

分類:[ASP.NET (C#)] 

開発環境:VisualStudio2008
使用言語:C#

はじめまして。
ASP.NETで開発を行っている途中なのですが、以下の現象に悩まされています。

ButtonとGridViewを画面に配置し、Buttonクリック時にGridViewへ
動的に列を追加しています。(DropDownListとTextBoxを1つずつ含むTemplateFieldです)
この後にPostBackを発生させると、画面から作成した列の内容が消えてしまいます。
(PostBackはDropDownListで発生させています。)

ただ、動的に列を追加する際にHeaderTextを指定しなければ列の内容は保持されます。
Headerに何か特殊な設定が必要なのでしょうか?
以下がソースになります。

    public partial class _Default : System.Web.UI.Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            CreateColumn();

            System.Data.DataTable dt = new System.Data.DataTable();
            dt.Columns.Add("Test", typeof(string));
            dt.Rows.Add(new string[] { "TestA" });
            dt.Rows.Add(new string[] { "TestB" });
            dt.Rows.Add(new string[] { "TestC" });

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

        private void CreateColumn()
        {
            GridView1.Columns.Clear();

            TemplateField tf = new TemplateField();
            //tf.HeaderText = "ABC"; ← コメントを解除すると列の内容が消えます。
            tf.ItemTemplate = new TestTemplate();
            GridView1.Columns.Add(tf);

            ViewState["Created"] = "true";
        }

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            if (ViewState["Created"] != null)
            {
                CreateColumn();
            }
        }
    }

    public class TestTemplate : ITemplate
    {
        #region ITemplate メンバ

        public void InstantiateIn(Control container)
        {
            DropDownList d = new DropDownList();
            d.ID = "d";
            d.AutoPostBack = true;
            d.AppendDataBoundItems = true;
            d.Items.Add(new ListItem("AAA", "1"));
            d.Items.Add(new ListItem("BBB", "2"));
            d.SelectedIndexChanged += new EventHandler(DropDownListSelectedIndexChanged);
            container.Controls.Add(d);

            TextBox t = new TextBox();
            t.ID = "t";
            t.DataBinding += new EventHandler(TextBoxDataBinding);
            container.Controls.Add(t);
        }

        #endregion

        public void TextBoxDataBinding(object sender, EventArgs e)
        {
            TextBox t = (TextBox)sender;
            GridViewRow r = (GridViewRow)t.NamingContainer;
            t.Text = ((System.Data.DataRowView)r.DataItem)["Test"].ToString();
        }

        public void DropDownListSelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList d = (DropDownList)sender;
            GridViewRow r = (GridViewRow)d.NamingContainer;
            ((TextBox)r.FindControl("t")).Visible = (d.SelectedIndex == 0);
        }
    }

引用返信 編集キー/
■37246 / inTopicNo.2)  Re[1]: GridViewで動的に列を追加した際に内容が消える
□投稿者/ ぶっちー (2回)-(2009/06/16(Tue) 09:34:58)
ヘッダーに表示する内容をHeaderTextに書くのではなく、
HeaderTemplateを指定して表示することで解決いたしました。

ありがとうございましたm(_ _)m
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -