|
分類:[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);
}
}
|