2011-08-03 23 views
3

これには多くの例がありますが、コントロールを見つけるために再帰を使用するという概念にはかなり響いています。コントロールがポストバックで発見されたら、それはと相互作用することができ、などASP.NETで再帰的にコントロールを見つける方法

私は空のASP持っている:私のHTMLマークアップでテーブル:

<asp:Table ID="editDataTable" runat="server"> 
</asp:Table> 

をとをPage_Loadにテーブルが多くの行が移入され多くのコラム(私はそれを理解したことを非常に誇りに思います)。いくつかのテーブルセルの内部には、<asp:TextBox />があります。

あなたはそれを推測しました、私はこれらのテキストボックスの価値を得る必要があります!

(私は再帰のコードを持って、それをチェックし、それが良いらしいました。)

私のテーブルには、2つの列があります。左側には「会社名、電話」などのタイトルが表示され、右側にはそれぞれのタイトルの値が表示されたテキストボックスが表示されます。したがって、ユーザーはテキストボックスを編集し(たとえば、電話番号が変更されている場合)、変更を送信することができます。

明らかに、行はユーザーによって動的に追加されます。

私が抱えている問題は次のとおりです。テーブルを作成するときにページにコントロールを追加する必要があります。

myTable.Control.Add(new TextBox()); 

私の場合、私のテーブルはeditDataTableと呼ばれます。だから、行を追加する私のコードでは、次のようにコントロールも追加しました。

for (int i = 0; i < rowCount; i++) 
{ 
    editDataTable.Rows.Add(tblRow[j]); // This is where I add the ROW to my sexy table 
    editDataTable.Controls.Add(new TextBox()); // This is where I add the control 
} 

あなたはあなたがテーブルにテキストボックスコントロールを追加できないことを知っているでしょう!

だから最終的には、私の質問は以下のとおりです。

  • 私は私のテーブルにテキストボックスのコントロールを追加するにはどうすればよいですか?
  • どこに追加しますか?
  • 動的に追加されたテキストボックスのテキスト値を取得するためのアドバイスはありますか?

ここでは、好奇心旺盛だった念のために私の再帰的なコードです:あなたはTableRow.CellsコレクションにTableCellを追加し、TableCell.ControlsコレクションにTextBoxを追加する必要が

private void getControls(Control parent) 
{ 
    foreach (Control c in parent.Controls) 
    { 
     if (c is TextBox && c.ID == null) 
     { 
      //Stuff 
     } 

     if (c.Controls.Count > 0) 
     { 
      getControls(c); 
     } 
    } 
} 
+1

ない[Control.FindControl](http://msdn.microsoft.com/en-us/libraryのファン/486wc64h.aspx)メソッドは、基本的にこれをすべてあなたのために行いますか?それとも、IDを持っていないのですか? –

+0

Control.FindControlはすべてのコントロールから再帰しません。ページコントロールのみ。 Plus no Id's anyways –

+0

行番号と列番号に基づいてIDを生成することができます。 – FishBasketGordo

答えて

1

ここでは、PageLoadの間にASP.NETで動的テーブルを作成し、ポストバックを通じて値を読み取る例を示します。表は動的なので、ページがサーバーにポストバックされているときは再構築されません。テーブルを再構築する場合は、テーブルを再度レンダリングし、Request.Formから取り込んだ値を使用してテーブルを再作成する必要があります。

HTMLマークアップ

<asp:Table ID="editDataTable" runat="server"> 
    </asp:Table> 
    <asp:Button runat="server" Text="Submit" OnClick="Submit_Click" /> 

コードマークアップ

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      string[] dynamicTable = { "First Name", "Last Name", "Address", "Phone" }; 

      foreach (string s in dynamicTable) 
      { 
       TableRow row = new TableRow(); 
       // Add First Cell with Text to Row 
       row.Cells.Add(new TableCell() { Text = s }); 

       // Create Second Cell 
       TableCell textBoxCell = new TableCell(); 

       // Add Textbox Control to Second Cell 
       textBoxCell.Controls.Add(new TextBox() { ID = "Dynamic_" + s.Replace(" ","_") }); 

       // Add Second Cell to Row 
       row.Cells.Add(textBoxCell); 

       // Add New Row to Table 
       editDataTable.Rows.Add(row); 
      } 
     } 
    } 

    protected void Submit_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < Request.Form.Count; i++) 
     { 
      string key = Request.Form.GetKey(i); 
      if (key.Contains("Dynamic_")) 
      { 
       Response.Write("<p><strong>" + (key.Remove(0,8)).Replace("_"," ") + "</strong>&nbsp;&nbsp;::&nbsp;&nbsp;" + Request.Form[i] + "</p>"); 
      } 
     } 
    } 
1

TableCell cell = new TableCell(); 
cell.Controls = new TextBox(); 
tblRow[j].Cells.Add(cell); 
editDataTable.Rows.Add(tblRow[j]); 

テキストボックスにアクセスする最も直接的な方法は、それらをすべてリストに保存することです。

List<TextBox> textBoxes = new List<TextBox>(); 

これで上cell.Controls = new TextBox();を置き換える:

TextBox tb = new TextBox(); 
textBoxes.Add(tb); 
cell.Controls = tb; 

そしてあなたは、ツリーでそれらを検索することなく、その後textBoxesを反復処理することができます。

関連する問題