2016-05-22 82 views
-1

実行時に動的にテキストボックスを追加し、SQL Serverにデータを保存しようとしています。私はテキストボックスを生成することができますが、私はデータベースにデータを送ることができず、何のエラーも与えていません。私は間違って何をしていますか?ここで動的にテキストボックスを追加し、asp.netのテキストボックスにデータを保存する

は私のコードです:

<asp:Panel ID="Panel1" runat="server"></asp:Panel> 
<asp:Button ID="btnAddCtrl" runat="server" Text="Add New Field" OnClick="btnAddCtrl_Click" /> 
<asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" /> 

、ここでは私のCSコードが

ある
protected void btnAddCtrl_Click(object sender, EventArgs e) 
{ 
    int rowCount = 0; 

    //initialize a session. 
    rowCount = Convert.ToInt32(Session["clicks"]); 

    rowCount++; 

    //In each button clic save the numbers into the session. 
    Session["clicks"] = rowCount; 

    //Create the textboxes and labels each time the button is clicked. 
    for (int i = 0; i < rowCount; i++) 
    { 
     TextBox TxtBoxU = new TextBox(); 
     //TextBox TxtBoxE = new TextBox(); 

     Label lblU = new Label(); 
     //Label lblE = new Label(); 

     TxtBoxU.ID = "TextBoxU" + i.ToString(); 
     //TxtBoxE.ID = "TextBoxE" + i.ToString(); 

     lblU.ID = "LabelU" + i.ToString(); 
     //lblE.ID = "LabelE" + i.ToString(); 

     lblU.Text = "User " + (i + 1).ToString() + " : "; 
     //lblE.Text = "E-Mail : "; 

     //Add the labels and textboxes to the Panel. 
     Panel1.Controls.Add(lblU); 
     Panel1.Controls.Add(TxtBoxU); 
     Panel1.Controls.Add(new LiteralControl("<br/>")); 
     Panel1.Controls.Add(new LiteralControl("<br/>")); 
    } 
} 

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    foreach (TextBox textBox in Panel1.Controls.OfType<TextBox>()) 
    { 
     string constr = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("INSERT INTO AssetsDetail (FieldName) VALUES(@FieldName)",con)) 
      { 
       cmd.Connection = con; 
       cmd.Parameters.AddWithValue("@FieldName", textBox.Text); 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
       con.Close(); 
      } 
     } 
    } 
} 

答えて

0

ダイナミックコントロールは、マークアップの一部ではないので、彼らはそれぞれのコントロールツリーにプログラムで追加する必要がありますページの読み込み後、HTML応答でレンダリングされます。

この場合、保存をクリックしたことによるポストバックにコントロールを追加していません。したがって、コントロールはコントロールツリーの一部ではなく、Panel1.Controls.OfType<TextBox>()カウントは常にゼロになります。実際には、テキストボックスは、SaveClickポストバックの後にレンダリングされることさえありません。

テキストボックスがPanel1.Controls.OfType<TextBox>()で利用可能になり、テキストボックス 'テキスト'が存在するように、各ポストバックで「動的コントロールのコードを追加する」(「行カウント」の増分を除く)が必要です。ポストバックダイナミックテキストボックスを保持するために

 private void CreateDynamicControls(bool incrementRowCount = false) 
    { 
     int rowCount = 0; 

     //initialize a session. 
     rowCount = Convert.ToInt32(Session["clicks"]); 

     if (incrementRowCount) 
      rowCount++; 

     Session["clicks"] = rowCount; 

     //Create the textboxes and labels each time the button is clicked. 
     for (int i = 0; i < rowCount; i++) 
     { 
      TextBox TxtBoxU = new TextBox(); 
      //TextBox TxtBoxE = new TextBox(); 

      Label lblU = new Label(); 
      //Label lblE = new Label(); 

      TxtBoxU.ID = "TextBoxU" + i.ToString(); 
      //TxtBoxE.ID = "TextBoxE" + i.ToString(); 

      lblU.ID = "LabelU" + i.ToString(); 
      //lblE.ID = "LabelE" + i.ToString(); 

      lblU.Text = "User " + (i + 1).ToString() + " : "; 
      //lblE.Text = "E-Mail : "; 

      //Add the labels and textboxes to the Panel. 
      Panel1.Controls.Add(lblU); 
      Panel1.Controls.Add(TxtBoxU); 
      Panel1.Controls.Add(new LiteralControl("<br/>")); 
      Panel1.Controls.Add(new LiteralControl("<br/>")); 
     } 
    } 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     //If PostBack caused by btnAddCtrl, it will take care of adding controls 
     if (Page.Request.Params.AllKeys.Contains("btnAddCtrl")) 
      return; 

     CreateDynamicControls();   
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void btnAddCtrl_Click(object sender, EventArgs e) 
    { 
     CreateDynamicControls(true); 
    } 

    protected void btnSave_Click(object sender, EventArgs e) 
    { 
     foreach (TextBox textBox in Panel1.Controls.OfType<TextBox>()) 
     { 

     } 
    } 
+0

thnxpal。私はあなたのポイントを得た。しかし、どうやって私が言っているのかを達成するのですか?あなたは私にplz.thnxを示すことができます –

+0

ちょっとZain。私のために働いたコードを追加しました。乾杯。 – Boney

+0

こんにちはboney thnxバンドル...私はそれがうまくいった。今では、以前に生成されたコントロールもポストバック時に再生成しています。なぜそれが起こっているのですか? –

0

、我々は、Request.Formコレクションを使用してダイナミックテキストボックスを再作成するページのPREINITイベントを利用する必要があります。 文字列TextBoxUを含むすべてのキーが取得され、各キーに対してbtnAddCtrl_Clickイベントが呼び出されます。

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    List<string> keys = Request.Form.AllKeys.Where(key => key.Contains("TextBoxU")).ToList(); 
    int i = 0; 
    foreach (string key in keys) 
    { 
     this.CreateTextBox("TextBoxU" + i); 
     i++; 
    } 
} 
+0

こんにちは!私はこのコードを使用しています。しかし、私は "オブジェクトのインスタンスに設定されていないオブジェクト参照"エラーが表示されます。第2の制御を加える。 –

関連する問題