如何以编程方式在aspx页面中创建多个文本框并保存到数据库?

时间:2014-06-26 10:35:51

标签: c# asp.net

我试图以编程方式填充文本框(txtFirstName,txtSecondName),方法是允许用户在文本框中键入(例如,4)并按下按钮将这些填充到面板中。因此,如果他们输入2,那么他们将获得2行文字框的名字和姓氏。 我的问题是当我保存时,我无法从动态创建的这些文本框中获取文本。有什么建议吗?

//button         
protected void Button1_Click(object sender, EventArgs e)
{
    int number = int.Parse(TextBox1.Text);

    for (int i = 0; i < number; i++)
    {
        //Horizontal line
        LiteralControl hrline = new LiteralControl();
        hrline.Text = "<hr />";

        //Textboxes
        TextBox txtFirstName = new TextBox();
        TextBox txtSecondName = new TextBox();

        //FirstName
        txtFirstName.ID = "txtFirstName" + i;
        txtFirstName.Text = "First Name " + i;

        //Second name
        txtSecondName.ID = "txtSecondName" + i;
        txtSecondName.Text = "Last Name " + i;

        buttonPanel.Controls.Add(hrline);
        pnlteacherExp.Controls.Add(txtFirstName);
        pnlteacherExp.Controls.Add(txtSecondName);
        pnlteacherExp.Controls.Add(hrline);
    }
}

保存按钮以保存到数据库:

protected void btnSave_Click(object sender, EventArgs e)
{
    int number = int.Parse(TextBox1.Text);

    for (int i = 0; i < number; i++)
    {
        string connectionString = WebConfigurationManager.ConnectionStrings["crud_connection"].ConnectionString;
        SqlConnection sqlConnection1 = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = "Store_proc";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = sqlConnection1;
        sqlConnection1.Open();

        cmd.Parameters.AddWithValue("@staffPayroll", "payroll_num");
        cmd.Parameters.AddWithValue("@FirstName", ??);
        cmd.Parameters.AddWithValue("@Surname", ??);

        cmd.ExecuteNonQuery();
        sqlConnection1.Close();
    }                
}

2 个答案:

答案 0 :(得分:2)

您可以使用Request.Form获取帖子参数。

已发布的参数使用呈现的html元素的name值或服务器端的UniqueID,但因为您无法在服务器端设置UniqueID,并且因为你动态地创建它们,可能name的呈现方式与id相同,至少在我的测试中,该行将为:

cmd.Parameters.AddWithValue("@FirstName", 
       Request.Form["txtFirstName" + i.ToString()]);

为了澄清一下,通常你需要这样做Request.Form[control.UniqueID]来获取发布的值,但是因为你没有control,因为你动态地创建它而不再存在,下一个是要使用发布的名称获取帖子值,因此发布的名称就是"txtFirstName" + i.ToString()的制作方式。

相对:
asp.net request.form
Accessing control client name and not ID in ASP.NET
Get info about Http Post field order

答案 1 :(得分:1)

您可以尝试以下操作:

   TextBox txtFirstName = Controls.FindControl(string.Format("txtFirstName{0}", i)) as TextBox;
   string name = txtFirstName.Text;

您可以浏览此链接,了解如何保留动态创建的控件的状态:http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i