查找Control()不起作用

时间:2013-03-15 13:07:21

标签: c# asp.net

我在按钮点击事件中创建了5个文本框,当单击动态生成的按钮时,我必须在文本框中获取值。

protected void Button1_Click(object sender, EventArgs e)
 {
  for(int i=0;i<5;i++)
  {
   HtmlGenericControl tr = new HtmlGenericControl("tr");
   HtmlGenericControl td = new HtmlGenericControl("td");
   HtmlGenericControl tdbtn = new HtmlGenericControl("td");           
   TextBox txt=new TextBox();
   txt.ID="txt_"+i.ToString();
   td.Controls.Add(txt);  
   Button btn=new Button();
   btn.ID="btn_"+i.ToString();
   btn.Click+=new EventHandler(btnpay_Click);
   btn.Text="Pay";    
   tdbtn.Controls.Add(btn);        
   tr.Controls.Add(td);
   tr.Controls.Add(tdbtn);
   PlaceHolder1.Controls.Add(tr);
}

}

但我无法在 btnpay_Click

的文本框中获取值
protected void btnpay_Click(object sender, EventArgs e)
    {

        Button btn = new Button();
        btn = sender as Button;
        string[] splitvaues = btn.ID.Split('_');
        string identity = splitvaues[1];
        TextBox txt = new TextBox();
        txt =PlaceHolder1.FindControl("txt_" + identity) as TextBox;

}

有人可以告诉我解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:4)

您的问题是FindControl没有递归控制树。它只直接在容器的ControlCollection中搜索控件。

  

仅当控件是直接控件时,此方法才会找到控件   包含在指定的容器中;也就是说,该方法没有   在控件内的控件层次结构中搜索。

您需要编写递归的FindControl。类似的东西:

public static Control FindControlRecursive(this Control control, string id)
{
  if (control == null || control.ID == id) return control;

  foreach (var c in control.Controls)
  {
    var found = c.FindControlRecursive(id);
    if (found != null) return found;
  }

  return null;
}

答案 1 :(得分:2)

试试这段代码......

protected void Page_Load(object sender, EventArgs e)
    {

        if (IsPostBack)
        {
            createcontrol();
        }
    }
private void createcontrol()
    {

        for (int i = 0; i < 5; i++)
        {
            HtmlGenericControl tr = new HtmlGenericControl("tr");
            HtmlGenericControl td = new HtmlGenericControl("td");
            HtmlGenericControl tdbtn = new HtmlGenericControl("td");
            TextBox txt = new TextBox();
            txt.ID = "txt_" + i.ToString();
            td.Controls.Add(txt);
            Button btn = new Button();
            btn.ID = "btn_" + i.ToString();
            btn.Click += new EventHandler(btnpay_Click);
            btn.Text = "Pay";
            tdbtn.Controls.Add(btn);
            tr.Controls.Add(td);
            tr.Controls.Add(tdbtn);
            plh1.Controls.Add(tr);
        }
    }
protected void btnpay_Click(object sender, EventArgs e)
    {

        Button btn = new Button();
        btn = sender as Button;
        string[] splitvaues = btn.ID.Split('_');
        string identity = splitvaues[1].ToString();
        TextBox txt = new TextBox();
        txt = plh1.FindControl("txt_" + identity) as TextBox;
        string q = txt.Text;

    }
 protected void Button1_Click(object sender, EventArgs e)
    {
        createcontrol();
}