如何使用ASP.NET动态创建文本框,然后将其值保存在数据库中?

时间:2013-02-11 16:47:53

标签: c# asp.net

我正在创建一个调查网站。我想动态添加文本框,然后在数据库中获取它们的值。

现在假设我从下拉列表中选择了4个动态文本框。

下拉菜单上的选择代码:

     protected void NumDropDown_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (DropDownList1.SelectedValue == "TextBox")
        {

            int j;
            i = int.Parse(NumDropDown.SelectedValue);
            Session["i"] = i;
            switch (i)
            {
                case 1:
                    t = new TextBox[i];
                    Session["textBox"] = t;
                    for (j = 0; j < i; j++)
                    {
                        t[j] = new TextBox();
                        t[j].ID = "txtCheckbox" + j.ToString();
                        Panel1.Controls.Add(t[j]);

                    }
                    break;
                case 2:
                    t = new TextBox[i];
                    Session["textBox"] = t;
                    for (j = 0; j < i; j++)
                    {
                        t[j] = new TextBox();
                        t[j].ID = "txtCheckbox" + j.ToString();
                        Panel1.Controls.Add(t[j]);

                    }
                    break;

                case 3:
                    t = new TextBox[i];
                    Session["textBox"] = t;
                    for (j = 0; j < i; j++)
                    {
                        t[j] = new TextBox();
                        t[j].ID = "txtCheckbox" + j.ToString();
                        Panel1.Controls.Add(t[j]);

                    }
                    break;
                case 4:
                    t = new TextBox[i];
                    List<TextBox> MyTextBoxes;
                    for (j = 0; j < i; j++)
                    {
                        t[j] = new TextBox();
                        t[j].ID = "txtCheckbox" + j.ToString();
                        Panel1.Controls.Add(t[j]);
                        try
                        {
                            MyTextBoxes = (List<TextBox>)Session["AddedTextBox"];
                            MyTextBoxes.Add(t[j]);
                            Session["AddedTextBox"] = MyTextBoxes;
                        }
                        catch
                        {
                            MyTextBoxes = new List<TextBox>();
                            MyTextBoxes.Add(t[j]);
                            Session["AddedTextBox"] = MyTextBoxes;
                        }
                    }
                    break;
            }

        }
    }

2)然后在这里我输入textBox中的值,如a,b,c,d,然后单击ADD:

点击代码点击添加点击:

1)首先,我在Page_Init:

上检查了会话
    protected void Page_Init(object sender, EventArgs e)
    {
        if (Session["AddedTextBox"] != null)
        {
            string a;
            string b;
            string c;
            string d;

            int listCount = ((List<TextBox>)Session["AddedTextBox"]).Count;
            foreach (TextBox t in ((List<TextBox>)Session["AddedTextBox"]))
            {
                if (listCount == 1)
                {

                }
                if (listCount == 2)
                {

                }
                if (listCount == 3)
                {

                }
                if (listCount == 4)
                {
                    if (t.ID == "txtCheckbox0")
                    {
                        a = t.Text;
                    }
                    if (t.ID == "txtCheckbox0")
                    {
                        b = t.Text;
                    }
                    if (t.ID == "txtCheckbox0")
                    {
                        c = t.Text;
                    }
                    if (t.ID == "txtCheckbox0")
                    {
                        d = t.Text;
                    }

                }
            }
        }

但这里的问题是我没有得到文本值,它们似乎是空的。 请帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

这听起来像是一个古老的经典问题,asp.net动态地向页面添加控件。

问题在于回发上的控件的viewstate和重建。

您需要在页面生命周期中的正确时间运行与回发 生成控件的相同代码 ,以确保回发值与服务器端控件匹配。

当然,如果您想要一个hacky快捷方式,请直接访问Request.Form["textCheckbox" + index]

A useful article on the subject.

答案 1 :(得分:1)

正如@ jenson-button-event所提到的,您可以通过TextBox访问Request.Form值,这是一个例子:

<强> ASPX:

<asp:DropDownList ID="ddlTextBoxes" runat="server">
    <asp:ListItem Value="1" Text="1" />
    <asp:ListItem Value="5" Text="5" />
</asp:DropDownList>
<asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="Add" /><br />
<asp:PlaceHolder ID="container" runat="server" Visible="false">
    <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="Submit" />
</asp:PlaceHolder>

代码背后:

    protected void Add(object sender, EventArgs e)
    {
        int numOfTxt = Convert.ToInt32(ddlTextBoxes.SelectedItem.Value);
        var table = new Table();

        for (int i = 0; i < numOfTxt; i++)
        {
            var row = new TableRow();
            var cell = new TableCell();

            TextBox textbox = new TextBox();
            textbox.ID = "Textbox" + i;
            textbox.Width = new Unit(180);

            cell.Controls.Add(textbox);
            row.Cells.Add(cell);
            table.Rows.Add(row);
        }

        container.Controls.AddAt(0,table);
        container.Visible = true;
    }

    protected void Submit(object sender, EventArgs e)
    {
        var textboxValues = new List<string>();
        if (Request.Form.HasKeys())
        {
            Request.Form.AllKeys.Where(i => i.Contains("Textbox")).ToList().ForEach(i =>
                {
                    textboxValues.Add(Request.Form[i]);
                });
        }

        //Do something with the textbox values
        textboxValues.ForEach(i => Response.Write(i + "<br />"));
        container.Visible = false;
    }