3

ボタン クリック イベントで 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;

}

誰でもこの問題を解決する方法を教えてもらえますか?

4

2 に答える 2

5

問題は、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;
}
于 2013-03-15T13:23:00.730 に答える
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();
}
于 2013-03-15T13:45:29.387 に答える