2012-02-16 9 views
0

実際に私はasp.netとC#を使用してWebテンプレートを作成しています。
私のuser controlページ私はテーブルを動的に作成する必要があります。私はXMLファイルからデータを読み込み、各テーブルの列と行の名前と数を取得します。私はテーブルを作成しながら、各セルに名前とIDを割り当てます。私はデータベースにデータを追加するためにいくつかのtextboxを含む1つの行があるからです。しかし、テーブルを作成した後、私はtextboxのIDに基づいてデータにアクセスしてデータベースに挿入することはできません。 私の動的テーブルのコードは次のとおりです。PlaceHolderを含んでユーザコントロールページの動的に作成されたテーブルのテキストボックスへのアクセス方法は?

public void CreateAddDynamicTable() 
{ 
    XmlDocument xDocRead = new XmlDocument(); 
    xDocRead.Load(Server.MapPath("ModuleTemp.xml")); 
    string xModuleName = hid_ChooseModule.Value; 
    XmlNode xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List"); 
    int colCount = xColCounter.ChildNodes.Count; 

    int nonPkCounter = 0; 
    string[] nonPrimaryKey = new string[100]; 
    string[] nonPkNewDataTemp = new string[100]; 

    for (int i = 1; i <= colCount; i++) 
    { 
     if (xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Add/TableColumn" + i).Attributes.GetNamedItem("IsPrimaryKey").Value == "N") 
     { 
      nonPrimaryKey[nonPkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Add/TableColumn" + i).Attributes.GetNamedItem("Name").Value; 
      nonPkCounter++; 
     } 
    } 

    ph_Uc_AddModule.Controls.Clear(); 

    // Fetch the number of Rows and Columns for the table 
    // using the properties 
    int tblRows = nonPkCounter; 
    int tblCols = 2; 

    // Create a Table and set its properties 
    Table tbl = new Table(); 
    // Add the table to the placeholder control 
    ph_Uc_AddModule.Controls.Add(tbl); 
    // Now iterate through the table and add your controls 
    for (int i = 0; i < tblRows; i++) 
    { 
     TableRow tr = new TableRow(); 
     for (int j = 0; j < tblCols; j++) 
     { 
      TableCell tc = new TableCell(); 
      Label td_Add_Header = new Label(); 
      TextBox td_Add = new TextBox(); 

      if (j == 0) 
      { 
       td_Add_Header.Text = nonPrimaryKey[i]; 
       td_Add_Header.ID = "lb" + (i + 1) + "_header_AddModule"; 

       // Add the control to the TableCell 
       tc.Controls.Add(td_Add_Header); 
       tc.CssClass = "td_Header_AddModule"; 
      } 
      else 
      { 
       td_Add.Text = ""; 
       td_Add.ID = "tb" + (i + 1) + "_AddModule"; 
       // Add the control to the TableCell 
       tc.Controls.Add(td_Add); 
       tc.CssClass = "td_Tb_AddModule"; 
      } 

      // Add the TableCell to the TableRow 
      tr.Cells.Add(tc); 
     } 
     // Add the TableRow to the Table 
     tbl.Rows.Add(tr); 
    } 
} 

私のユーザーコントロールページは以下の通りです:

<asp:Panel ID="pn_Uc_TModule" runat="server"> 

<asp:Table runat="server" ID="table_Uc_TModule" CssClass="table_Uc_TModule" Width="100%"> 
<asp:TableRow runat="server" VerticalAlign="Top" Height="50px"> 
       <asp:TableCell runat="server"> 
        <asp:Button runat="server" Text="" CssClass="btn_Add_Active" OnClick="btn_AddNew_Click" /> 
        <asp:Button ID="btn_Cancel_NewItem" runat="server" Text="" CssClass="btn_Cancel_New" OnClick="btn_Cancel_AddNew" Visible="false" /> 

        <asp:Table runat="server" ID="table_Uc_AddModule" Visible="false"> 
         <asp:TableRow runat="server"> 
          <asp:TableCell runat="server" > 

           <asp:PlaceHolder ID="ph_Uc_AddModule" runat="server"> 
           </asp:PlaceHolder> 

          </asp:TableCell> 
         </asp:TableRow> 
         <asp:TableRow ID="TableRow1" runat="server"> 
          <asp:TableCell runat="server" CssClass="td_Tb_AddModule" HorizontalAlign="Center"> 
           <asp:Button ID="btn_Insert" runat="server" OnClick="Uc_AddModule_ItemInsert" Text="" CssClass="btn_Add" /> 
           <asp:Button ID="btn_Cancel" runat="server" OnClick="Uc_AddModule_Clear" Text="" CssClass="btn_Clear" /> 
          </asp:TableCell> 
         </asp:TableRow> 
        </asp:Table> 

       </asp:TableCell> 
      </asp:TableRow> 
</asp:Table> 
</asp:Panel> 

私がアクセスするの背後にあるコードで私の挿入機能に法の下に使用しています私はpn_Uc_TModule.FindControl("tb" + i + "_AddModule")ともThis.ph_Uc_AddModule.FindControl("tb" + i + "_AddModule")を試してみましたが、それでもいる

for (int i = 1; i <= nonPkCounter; i++) 
    { 
     TextBox textBox = (ph_Uc_AddModule.FindControl("tb" + i + "_AddModule")) as TextBox; 

    } 

textboxに挿入されたデータそれをデータベースに挿入するためにtexboxデータを取得しないでください。 どうすればいいですか?あなたの配慮に感謝します。

+0

どのような場合にCreateAddDynamicTableメソッドを呼び出すのですか?その中に?負荷? – ivowiblo

答えて

1

Initイベントで常にCreateAddDynamicTableを呼び出す必要があります。それはviewstateを意味し、asp.netはすべての値をコントロールにロードします。次に、TextBoxをコレクションに追加し、Page_LoadイベントのFindControl(参照のみ)を使わずにアクセスすることができます。

+0

最初の返信ありがとう、実際に私のテンプレートaspxページには3パネルが含まれています。第1のパネルはメインメニューを含み、第2のパネルはサブメニューを含み、第3のパネルはユーザコントロールページを含む。ユーザーコントロールのページ内に追加ボタンがあります。ユーザーが追加ボタンをクリックすると、CreateAddDynamicTable()を呼び出してテーブルを作成します。この作成されたテーブルには、ユーザーがデータを挿入して送信できるテキストボックスがあります。ユーザーが提出すると、すべてのテキストボックスデータを取得してデータベースに挿入します。これは全体の話です。今私はこれらのtextboesデータにアクセスできますか? –

+0

mmhhh私はいつもテーブルを作成することを勧めますが、それをvisible = falseにして、ユーザーがボタンをクリックしたときに値をtrueに設定します。結果は同じで、visible = falseはHTMLのレスポンスを作成せずコントロール、イベント、ビューステートを追跡します – ivowiblo

+0

私の仕事はXMLファイルからデータを取得し、その情報に基づいてテーブルを作成することです。私はこのプロセスを無視することはできませんし、いくつかのモジュールでは私は80以上のテーブルを持っています。すべてのテーブルをテンプレートページに置き、visible = falseまたはTrueにすることはお勧めできません。ありがとう。 –

関連する問題