环境是这样的:
ASP 页面中有一个按钮和GridView。GridView在数据绑定之前添加了一自己创建的TemplateField,里面有一个Control, Control里面有一个TextBox. 在数据绑定之后,TextBox可以显示并接受用户的输入。在按钮的onclick事件中想取得GridView中每一列中TextBox的Text值. 通过gridView.rows[行号].cell[列号].FindControl(TextBox的ID)方法时返回值是一空值。不解,望各位帮帮忙,看没有什么好的解决方法。谢谢大家!

解决方案 »

  1.   

    GridView在数据绑定之前添加了一自己创建的TemplateField----这部分代码是否写在了
    if(!IsPostBack)
    {}外面!!!!
      

  2.   

    gridView.rows[行号].cell[列号].FindControl(TextBox的ID)方法时返回值是一空值。
    =============
    1.
    不需要指定 Cells 去 FindControl 
    2。
    // 外部 Button
        protected void Button1_Click(object sender, EventArgs e)
        {  
            foreach (GridViewRow row in GridView1.Rows) {
                TextBox tb = row.FindControl("MyTextBoxID") as TextBox;
                // string txt = tb.Text;
                // ..
            }
        }
      

  3.   

    环境是这样的:
    ASP 页面中有一个按钮和GridView。GridView在数据绑定之前添加了一自己创建的TemplateField,里面有一个Control, Control里面有一个TextBox. 在数据绑定之后,TextBox可以显示并接受用户的输入。在按钮的onclick事件中想取得GridView中每一列中TextBox的Text值. 通过gridView.rows[行号].cell[列号].FindControl(TextBox的ID)方法时返回值是一空值。
    _______________________________________________________________________________
    原来我也有过类似问题,设断点调试跟踪后发现((Label)gridView.rows[行号].cell[列号].FindControl(TextBox的ID)).Text才有值。楼主不妨自己调试一下
      

  4.   

    把分都给我吧
    ((textbox)gridView.rows[行号].cell[列号].FindControl("TextBox的ID")).text
    这样就可以了
      

  5.   

    谢谢各位:但是问题依旧阿......1楼:添加自己创建的TemplateField的代码是写在if(!IsPostBack){}里面的。
    2楼:去掉Cells以后问题依旧,row.FindControl(  "MyTextBoxID  ")返回一个空值。 
    3楼:我就是在断点跟踪是发现gridView.rows[行号].cell[列号].FindControl(TextBox的ID)的返回值为空的。所以在作类型转换时会谈出异常。
    4楼:((textbox)gridView.rows[行号].cell[列号].FindControl(  "TextBox的ID  ")).text是不能取到值得。在问题里面我已经提到通过gridView.rows[行号].cell[列号].FindControl(  "TextBox的ID  ")根本返回的是一个null。  
      

  6.   

    理论上可以通过4楼的方法来取得TextBox的值,但是在实际运行中会报错提示:Object reference not set to an instance of an object.这个问题很奇怪,大家可以在自己的机器上实际调试一下。 
      

  7.   

    诡异了,你不会是添加到 EditItemTemplate 里面吧 ?如果是,实际上只有一行处于Edit状态,这一行才能找到 TextBoxforeach (GridViewRow row in GridView1.Rows) {
    if(row.RowState == DataControlRowState.Edit) {
    TextBox tb = row.FindControl("MyTextBoxID") as TextBox;
    // string txt = tb.Text;
    // ..
    }
    }
      

  8.   

    不要用这种方式去访问,容易产生错误,因为你得确保 TextBox 在对应的 cells 里面,
    添加、删除GridView 的列,就得手动同步这里的 列索引row.cells[列号].FindControl(TextBox的ID)实际上, 与row.FindControl(TextBox的ID)的效果是一样的
      

  9.   

    楼主写在什么事件里的?我在绑定事件里e.Row.Cells[1].Text 可以取得
      

  10.   

    Control是添加到TemplateField的ItemTemplate中的。添加TemplateField这段代码是写到Page_Load事件中的。
      

  11.   

    public ColumnTextTemplate cto = new ColumnTextTemplate(); 
    TemplateField percentage = new TemplateField();
    percentage.HeaderText = "Percentage";
    percentage.ItemTemplate = cto;
    gvWwMember.Columns.Add(percentage);public class ColumnTextTemplate : ITemplate
        {        public void InstantiateIn(Control container)
            {
                TextBox myTextbox = new TextBox();
                myTextbox.ID = "percentage";
                container.ID = "PercentageControl";
                container.Controls.Add(myTextbox);
            }    }
      

  12.   

    很久没有来看这个问题,后来发现在页面postback的时候,在后台通过程序添加的控件都会消失,这就是问什么通过FindControl方法找不到控件。解决办法:将后台添加的控件在添加进TemplateField的时候,同时存入Session中,在postback时Rebuild控件。   问题解决。