关于GridView中动态生成模板列的问题
这两天翻出来前几天做的一个项目进行修改,其中有一点是要做到在GridView中动态生成列(模板列),以便于输入信息。
自己做的一个简单的Demo是这样的
页面部分:
public partial class _Default : System.Web.UI.Page
{
Hashtable _ht = new Hashtable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TemplateField customField = new TemplateField();
customField.ShowHeader = true;
customField.HeaderText = "我是谁";
customField.ItemTemplate = new TemplateDemo(DataControlRowType.DataRow);
GridView1.Columns.Add(customField);
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType==DataControlRowType.DataRow)
{
TextBox tx=(TextBox)e.Row.FindControl("txtWho");
tx.Text = "456";
}
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
TextBox tc = (TextBox)GridView1.Rows[GridView1.SelectedIndex].FindControl("txtWho");
string name = tc.Text;
}
protected void Button1_Click(object sender, EventArgs e)
{
int i = 1;
foreach (GridViewRow gvr in GridView1.Rows)
{
TextBox tc=gvr.FindControl("txtWho") as TextBox;
_ht.Add(i,tc.Text);
i++;
}
}
}
{
Hashtable _ht = new Hashtable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TemplateField customField = new TemplateField();
customField.ShowHeader = true;
customField.HeaderText = "我是谁";
customField.ItemTemplate = new TemplateDemo(DataControlRowType.DataRow);
GridView1.Columns.Add(customField);
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType==DataControlRowType.DataRow)
{
TextBox tx=(TextBox)e.Row.FindControl("txtWho");
tx.Text = "456";
}
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
TextBox tc = (TextBox)GridView1.Rows[GridView1.SelectedIndex].FindControl("txtWho");
string name = tc.Text;
}
protected void Button1_Click(object sender, EventArgs e)
{
int i = 1;
foreach (GridViewRow gvr in GridView1.Rows)
{
TextBox tc=gvr.FindControl("txtWho") as TextBox;
_ht.Add(i,tc.Text);
i++;
}
}
}
自己重写的一个接口类如下:
public class TemplateDemo:ITemplate
{
private DataControlRowType _templateType;
public TemplateDemo(DataControlRowType temp)
{
_templateType = temp;
}
ITemplate 成员
}
{
private DataControlRowType _templateType;
public TemplateDemo(DataControlRowType temp)
{
_templateType = temp;
}
ITemplate 成员
}
这样写好之后就发现了一个问题:虽然模板列可以动态生成,而且可以在RowDataBind事件中赋值,但是如果执行Gridview的选中事件或者编辑事件,则会找不到这个模板列,苦
思不得其解。
后来想,这可能是和视图状态有关系,由于动态添加的模板列并没有加到视图状态之中,所以无法保存下来,导致执行相应事件后,模板列实际消失,当然也就得不到他了。
那么有什么方法解决呢?后来想,是否可以自己写一个类似于视图状态的类,当生成要求的GridView后,立即将其保存下来,然后在执行GridView的相应事件时,在将其赋值回去,但是感觉这样很难实现,不知道园子里的前辈们有什么高招没有?