动态添加文本框并在asp.net的文本框中保存数据

时间:2016-05-22 08:51:33

标签: c# asp.net

我试图在运行时动态添加文本框并在SQL Server中保存数据。我能够生成一个文本框,但我无法将数据发送到数据库,也没有发出任何错误。我究竟做错了什么?

这是我的代码:

<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();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

由于动态控件不是标记的一部分,因此需要在每次页面加载时以编程方式将它们添加到控件树中,之后它们将在HTML响应中呈现回来。

在这种情况下,您不会在Save Click引起的PostBack上添加控件。因此,控件不是控制树的一部分,Panel1.Controls.OfType<TextBox>()计数将始终为零。事实上,文本框甚至不会在SaveClick回发后呈现。

您需要在每个回发中添加&#34;添加动态控件的代码&#34;(&#39; rowcount&#39;增量除外),以便{{1}中可以使用TextBoxes }和文本框&#39;文字&#39;将出席。

Panel1.Controls.OfType<TextBox>()

答案 1 :(得分:0)

为了在PostBacks中保留动态TextBox,我们需要使用Page的PreInit事件来使用Request.Form集合重新创建动态TextBox。 首先获取包含字符串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++;
    }
}