2011-12-21 21 views
4

私は、アプリケーションwhadを作成しようとしています。私は、マスターページを持って、私のASP:コンテンツはここにある:私は2つのテキストボックスを追加したいFindControl()return null

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<asp:ScriptManager ID="scriptManager1" runat="server"> 
</asp:ScriptManager> 
<div style="margin: 10px"> 
    <asp:UpdatePanel ID="updatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:PlaceHolder runat="server" ID="myPlaceHolder" /> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" /> 
     </Triggers> 
    </asp:UpdatePanel> 
</div> 
<asp:Button ID="btnAdd" runat="server" Text="Add" /> 

btnAddでクリックした後。 I http://jagdeepmankotia.wordpress.com/2010/01/30/dynamically-add-controls-in-asp-net-c/

にこれが私のコードであるようにそれを行うしよう:CTRのための最初の反復では、たとえば、私のbtnAddを探してloapますforeachで)

static int myCount = 1; 
    private TextBox[] color; 
    private TextBox[] text; 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     color = new TextBox[myCount]; 
     text = new TextBox[myCount]; 

     for (int i = 0; i < myCount; i++) 
     { 
      TextBox tbColor = new TextBox(); 
      tbColor.ID = "colorTextBox" + i.ToString(); 
      myPlaceHolder.Controls.Add(tbColor); 
      color[i] = tbColor; 

      TextBox tbText = new TextBox(); 
      tbText.ID = "textTextBox" + i.ToString(); 
      myPlaceHolder.Controls.Add(tbText); 
      text[i] = tbText; 

      LiteralControl literalBreak = new LiteralControl("<br />"); 
      myPlaceHolder.Controls.Add(literalBreak); 
     } 
    } 


    public Control GetPostBackControl(Page page) 
    { 
     Control control = null; 
     string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
     if (ctrlname != null && ctrlname != string.Empty) 
     { 
      control = page.FindControl(ctrlname); 
     } 
     else 
     { 
      foreach (string ctl in page.Request.Form) 
      { 
       Control mycontrol = page.FindControl(ctl); 
       if (mycontrol is System.Web.UI.WebControls.Button) 
       { 
        control = mycontrol; 
        // This gives you ID of which button caused postback       
        break; 
       } 
      } 
     } 
     return control; 
    } 

    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     Control myControl = GetPostBackControl(this.Page); 
     if (myControl != null) 
      if (myControl.ClientID.ToString() == "btnAdd") 
       myCount = myCount + 1; 
    } 

    protected void btnAdd_Click(object sender, EventArgs e) 
    { 
     //handled in PreInit  

    } 

機能GetPostBackControl(中に「ctl00 $ MainContentの$ scriptManager1 "、myControlはnullです...次の繰り返しでも...だから、私の関数は常にnullを返します。理由は何でしょうか?

答えて

8

FindControlは、コンテナの直接の子のみを検索します。あなたはページレベルから始めているので、子コントロールUpdatePanelを再帰して、あなたのbtnAddコントロールにアクセスする必要があります。

これを行う方法の例は、hereをご覧ください。

編集: 画面上の唯一の静的なボタンがありますので、私は、あなたがこのようにあなたのボタンは「探して」されている理由を私は理解していない - あなたはこの中でFindControlを使用する必要はありません場合。

<asp:Button ID="btnAdd" runat="server" Text="Add" onclick="btnAdd_Click" /> 

(またはコードで、btnAdd.OnClick += new EventHandler(btnAdd_Click);

動的に追加あなたのフォームで複数のボタンを持っていた場合でも、同じボタンのクリックハンドラにそれらのすべてをつなぎ合わせることができ、senderはその後と思われる場合、クリックされたボタンコントロールが含まれています。あなたは一般的に

動的に追加入力コントロール(テキストボックスなど)からデータをこすりするのではなく、ポストバック(適切なイベントハンドラの「送信者」などが容易になるだろう)原因を制御見るためにFindControlを使用します編集2: あなたは、あなたがポストバックの間で「滞在」にすでに追加したすべてのコントロールをしたい場合は、上のページビューステートを有効にして

Button myButton = new Button(); 
    myButton.Text = "Click Me"; 
    myButton.Click += new EventHandler(btnAdd_Click); 
    myPlaceHolder.Controls.Add(myButton); 

動的にちょうどあなたの他のコントロールと同様のボタンを追加することができますコントロールを追加し、OnInitにポストバックなしでコントロールを1回だけ追加するようにしてください。

base.OnInit(e);  
    if (!IsPostBack) 
    { // ... Add controls here 

「mycount」の状態を(同じupdatepanelで、viewstateを有効にして)隠しフィールドに保持することができます。毎回intに解析する必要があります。または、SessionStateを使用してそれを追跡することもできます。

+0

ありがとうございました!後でここに2番目の静的ボタンを追加し、動的にここにテキストボックスのみを追加します。だから私はここでbtnAdd_Click()を使うことができると思いますか? myCountを増やし、後でmyCountの新しい値でページをリロードするには、ボタンでどのようにしたらいいですか?についてどう思いますか? – cadi2108