从动态文本框中获取用户输入

4

我有两个按钮。一个按钮用于创建文本框,另一个按钮用于提交信息。我在获取用户输入后遇到了问题。以下是代码:

 private void CreateTextBox(int j) //Creates the fields / cells
    {


            TextBox t = new TextBox();
            t.ID = "Textbox" + j;
            //t.Text = "Textbox" + j;
            lstTextBox.Add(t);
            var c = new TableCell();
            c.Controls.Add(t);
            r.Cells.Add(c);
            table1.Rows.Add(r);
            Session["test"] = lstTextBox;

    }
protected void Button2_Click(object sender, EventArgs e)
    {
        string[] holder = new string[4];
        for (int i = 0; i < holder.Length; i++)
        {
            holder[i] = "";
        }
        List<TextBox> lstTextBox = (Session["test"] as List<TextBox>);
        if (lstTextBox.Count < Counter)
        {
            int i = lstTextBox.Count;
            for (int j = 0; j < i; j++)
            {

                holder[j] = lstTextBox[j].Text;

            }
            SqlConnection conns = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDBConnectionString1"].ConnectionString);
            SqlCommand cmd = new SqlCommand("Insert into LoanerForm (field0, field1, field2, field3) Values (@field0, @field1, @field2, @field3)", conns);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@field0", holder[0]);
            cmd.Parameters.AddWithValue("@field1", holder[1]);
            cmd.Parameters.AddWithValue("@field2", holder[2]);
            cmd.Parameters.AddWithValue("@field3", holder[3]);
            conns.Open();
            cmd.ExecuteNonQuery();
            conns.Close();

        }

        Counter = 0;

        Button1.Visible = true; //Going to submit data to SQL

    }

提前感谢您!


我现在无法测试,但是你不应该给文本框添加一个 runat="server" 属性吗? - Mr Lister
@MrLister 如果您从后台代码中呈现服务器控件,则不需要添加“runat =” server“”。 - Win
3个回答

2

以下是如何动态创建文本框的方法。它会在视图状态中跟踪文本框数目。

<asp:Button runat="server" ID="Button1" OnClick="Button1_Click" 
 Text="Create TextBoxes" />
<asp:Button runat="server" ID="Button2" OnClick="Button2_Click"      
  Text="Save TextBoxes to Database" />
<asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>

public int Counter
{
    get { return Convert.ToInt32(ViewState["Counter"] ?? "0"); }
    set { ViewState["Counter"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    // Need to reload those textboxes on page back
    // Otherwise, they will becomes null
    int total = Counter;
    for (int i = 0; i < total; i++)
    {
        var textBox = new TextBox
        {
            ID = "TextBox" + i,
            Text = "TextBox" + i
        };
        PlaceHolder1.Controls.Add(textBox);
    }
}

private void CreateTextBox(int id)
{
    var textBox = new TextBox
    {
        ID = "TextBox" + id,
        Text = "TextBox" + id
    };
    PlaceHolder1.Controls.Add(textBox);
}

protected void Button1_Click(object sender, EventArgs e)
{
    CreateTextBox(Counter);
    Counter = Counter + 1;
}

protected void Button2_Click(object sender, EventArgs e)
{
    int total = Counter;
    for (int i = 0; i < total; i++)
    {
        var textbox = PlaceHolder1.FindControl("TextBox" + i) as TextBox;
        var text = textbox.Text;
        // Do something with text
    }
}

太棒了!非常感谢!但是如果我想一次只创建一个文本框怎么办?例如,每次单击都会创建1个文本框,直到达到4个文本框。 - vadim
太棒了,帮了大忙!现在更加清楚明白了,谢谢!! - vadim

0

我认为您使用了大型程序来生成动态文本框并将其插入到数据库中。要从动态生成的文本框中检索文本,请使用以下代码:

Request.Form["Textbox" + i.ToString()] 

这里的“i”代表您生成的文本框数量。

更多信息,请查看下面的链接。

如何从动态生成的文本框将值插入到SQL数据库中asp.net


0
不要将TextBoxes存储在Session中,而是在页面上创建它们。
关键在于每次都在正确的时间创建它们(即每次PostBack)。尝试在页面的OnLoad()中加载它们(如果可能,则使用CreateChildControls())。
一旦这样做,ASP.NET会自动将输入与TextBox关联起来,您应该能够像通常或通过父级的FindControl()引用它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接