我想在DataGrid中动态添加模板列TextBox后如何能够获取TextBox中的内容?下面是我写的一部分代码:
  public TemplateColumn colTemp = new TemplateColumn();
  public ColumnTemplate mycol = new ColumnTemplate();  private void Button2_Click(object sender, System.EventArgs e)
  {
     System.Web.UI.WebControls.TextBox txtTemp;
     //动态添加模板列
     Add_Col();
     //获取TextBox中的内容
     txtTemp = (TextBox)MyGrid.Items[0].Cells[0].FindControl("txt");
  }  private void Add_Col()
  {
     colTemp.HeaderText = "Col1";
     colTemp.ItemTemplate = mycol;
     MyGrid.Columns.Add(colTemp);
     MyGrid.ShowHeader = true;
     MyGrid.DataSource = Creat_Table();
     MyGrid.DataBind();
  }  private ICollection Creat_Table()
  {

     DataTable dt = new DataTable();
     DataRow dr;     dt.Columns.Add(new DataColumn("Id",typeof(string)));
     dt.Columns.Add(new DataColumn("Name",typeof(string)));
     for(int i = 0; i < 5; i++)
     {
        dr = dt.NewRow();
        dt.Rows.Add(dr);
     }
        DataView dv = new DataView(dt);
        return dv;
  }  public class ColumnTemplate : ITemplate
  {
     public void InstantiateIn(Control container)
     {
TextBox myText = new TextBox();
myText.ID = "txt";
container.Controls.Add(myText);
     }
  }
哪位大虾帮我看一下如何才能获取到TextBox模板列中TextBox的内容,谢谢!

解决方案 »

  1.   

    如果写在_ItemDataBound里
    TextBox tb=(TextBox)e.Item.FindControl("模板列textbox的id")如果写在外面的按钮事件里
    需要遍历DataGrid的每一项
    TextBox tb=(TextBox)this.DataGrid.Items[i].FindControl("模板列textbox的id")
      

  2.   

    string text;
    text=((TextBox)this.DataGrid.Items[行].Cell[列]FindControl("模板列textbox的id")).Text.ToString
      

  3.   

    TextBox tb=(TextBox)e.Item.FindControl("id")
      

  4.   

    我在另外一个按钮事件中加了
    System.Web.UI.WebControls.TextBox txtTemp;
    txtTemp = (TextBox)MyGrid.Items[0].Cells[0].FindControl("txt");
    可是因为页面提交了,所以原先动态添加上去的模板列已经找不到txtTemp是null,但是如果象我代码中写的在Button2_Click事件中去抓的话,因为该模板列是重新生成的,所以TextBox中的值已经被清空也无法获取到刚才用户输入的内容,难道只能在客户端抓取吗?
      

  5.   

    可以用ViewState来保存未刷新前的值,然后读取ViewState不就OK了?
      

  6.   

    查找DataGrid中绑定的控件时,最好遍历一下DataGrid,如下:
    foreach(DataGridItem dgi in MyDataGrid1.Items)
    {
    TextBox txt1 = (TextBox)dgi.FindControl("Linkbutton1");
    if (txt1 != null)
    string str=txt1.Text.ToString();
    }
      

  7.   

    上面的有误,这个:
    foreach(DataGridItem dgi in MyDataGrid1.Items)
    {
    TextBox txt1 = (TextBox)dgi.FindControl("txt");
    if (txt1 != null)
    string str=txt1.Text.ToString();
    }
      

  8.   

    for(int i=0;i<MyDataGrid.Items.Count;i++)
    {
    TextBox tb=(TextBox)MyDataGrid.Items[i].Cell[列号].FindControl("tb");
    if(tb!=null)
    {
      string str=tb.Text;
    }
    }
      

  9.   

    各位兄弟,感谢你们的支持,你们说的都没错,只是这些方法只能取出静态绑定的模板列,而我的需求是该模板列是后台代码动态生成的,也就是页面提交后就会消失,需要重新添加的列,而我想要的是在页面提交的时候获取到刚刚TextBox中的内容,请问我该在什么事件中去获取,该怎么获取?
      

  10.   

    在哪个事件都可以,下面是一个按钮单击事件获取本页面所有TextBox中的内容:
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
       Dim a As Integer
       Dim b As TextBox
       For a = 0 To DataGrid1.Items.Count - 1
         b = CType(DataGrid1.Items(a).Cells(6).Controls(1), TextBox)
         ListBox1.Items.Add(b.Text)
       Next
    End Sub
      

  11.   

    与你类似的一个苦闷问题
    http://community.csdn.net/Expert/topic/3589/3589355.xml?temp=.9248011