请教一下关于在Gridview里动态添加控件后使用FindControl方法的问题
本帖最后由 phenemenon 于 2010-11-27 21:35:54 编辑
现在我有一个GridView(启用OnRowDataBound方法,用BoundField设计了第一列,第二列为TemplateField)和一个Button,当Page_Load时,读取数据库,DataBind()到GridView,然后触发OnRowDataBound方法,在里面使用e.Row.Cells[1].Controls.Add(textbox)给第二列都加一个TextBox
然后点击Button,在onclick事件中,使用String Tvalue = ((TextBox)gridview.Rows[i].Cells[2].FindControl("textbox")).Text;
结果是空的,出错,而且设置断点后看到Cells[2].Controls.Count=0,为什么会这样啊……我第一列的值都取出来了,第二列怎么会找不到控件呢
OnRowDataBound代码如下:
protected void GridViewProductyAttributeShow_RowDataBound(object sender, GridViewRowEventArgs e)
{
TextBox textbox = new TextBox();
textbox.ID = "textbox";
if (e.Row.RowType == DataControlRowType.DataRow)
e.Row.Cells[1].Controls.Add(textbox);
}
OnClick代码如下:
for (int i = 0; i < GridViewProductyAttributeShow.Rows.Count; i++)
{
String ProductAttributeGuid = GridViewProductyAttributeShow.Rows[i].Cells[0].Text;
TextBox textbox_AtrrbuteValue = GridViewProductyAttributeShow.Rows[i].FindControl("textbox") as TextBox;//找不到?
String AtrrbuteValue = textbox_AtrrbuteValue.Text;
}
------解决方案--------------------render的时候产生的
TemplateField中直接添加textbox
foreach (GridViewRow gr in this.GridView1.Rows)
{
TextBox txt = (TextBox)gr.FindControl("TextBox的ID");
}
------解决方案--------------------如果你是如下绑定的,将if(!IsPostBack)去掉就可以了!
protected void Page_Load(object sender, EventArgs e)
{
//if (!IsPostBack)
bind();//绑定
}
------解决方案-------------------- TextBox textbox_AtrrbuteValue = GridViewProductyAttributeShow.Rows[i].FindControl("textbox") as TextBox;//找不到?
改为
TextBox textbox_AtrrbuteValue = GridViewProductyAttributeShow.Rows[i].Cells[1].FindControl("textbox") as TextBox;//找不到?
------解决方案-------------------- protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) // 加载事件加IsPostBack 判断
bind();//绑定
}
------解决方案--------------------