none
GridView动态生成模板列,在后台用FindControl找不到该列所含控件 RRS feed

  • 问题

  • 动态生成模板列代码:

                TemplateField templateField = new TemplateField();
                templateField.HeaderTemplate = new chkHeader(gridView.ID);
                templateField.ItemTemplate = new chkItem();
                gridView.Columns.Add(templateField);

    项模板定义:

         public class chkItem : Control, ITemplate
        {

            #region ITemplate 成员

            public void InstantiateIn(Control container)
            {
                CheckBox chk = new CheckBox();
                chk.ID = "chkItem";
                container.Controls.Add(chk);
            }

            #endregion
        }

    后台FindControl代码:

                for (int i = 0; i < GridView.Rows.Count; i++)
                {
                    GridViewRow gridViewRow = GridView.Rows[i];
                    if (gridViewRow.RowType == DataControlRowType.DataRow)
                    {
                        //取出这一行的复选框,如果复选框选中,删除这一行
                        Control control = gridViewRow.Cells[0].FindControl("chkItem");

                     ...... 

    2010年4月13日 3:01

答案

  • 原因是第二次没有重新生成这些CheckBox

    但我不理解 为什么前台书写的方式,第二次加载页面这些控件还在,

    后台生成的方式,第二次加载页面这些控件就不在了

    • 已标记为答案 m s 2010年4月14日 8:00
    • 已标记为答案 m s 2010年4月14日 8:01
    2010年4月13日 8:43
  • 对,没错

    所以首次加载没有问题

    第二次就找不到这些控件了

    但是如果在前台写好了GirdView的绑定代码,就不存在这个问题(即便把创建代码放到了 if(!IsPostBack) 中,第二次加载这些控件还在)

    • 已标记为答案 m s 2010年4月14日 8:01
    2010年4月13日 9:07

全部回复

  • 你好!

    模板列中的控件在绑定完成后,模板列中的 ID 会按它在 GridView 中的层次结构重新生成,如:GridView1$ctl03$TextBox2。所以你使用 FindControl 找不到。

    你上述的代码应该放到 RowDataBound 事件中。

    如下:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox c = (TextBox)e.Row.FindControl("txtName");
        }
    }


    知识改变命运,奋斗成就人生!
    • 已标记为答案 KeFang Chen 2010年4月14日 3:35
    • 取消答案标记 m s 2010年4月14日 8:00
    2010年4月13日 3:36
    版主
  • 原因是第二次没有重新生成这些CheckBox

    但我不理解 为什么前台书写的方式,第二次加载页面这些控件还在,

    后台生成的方式,第二次加载页面这些控件就不在了

    • 已标记为答案 m s 2010年4月14日 8:00
    • 已标记为答案 m s 2010年4月14日 8:01
    2010年4月13日 8:43
  • 你是否将你的创建代码放到了 if(!IsPostBack) 中?
    知识改变命运,奋斗成就人生!
    2010年4月13日 8:45
    版主
  • 这也找不到,因为我用的是后台动态生成的GridView的列

    第二次加载页面的时候我没有重新生成这些列,所以就找不到了

     

    2010年4月13日 8:50
  • 对,没错

    所以首次加载没有问题

    第二次就找不到这些控件了

    但是如果在前台写好了GirdView的绑定代码,就不存在这个问题(即便把创建代码放到了 if(!IsPostBack) 中,第二次加载这些控件还在)

    • 已标记为答案 m s 2010年4月14日 8:01
    2010年4月13日 9:07
  • 动态创建就是这样的,你把 if (!IsPostBack) 去掉就好了。
    知识改变命运,奋斗成就人生!
    2010年4月13日 9:17
    版主