2013-08-09 2 views
4

У меня есть два buttons. Одна кнопка, которая создает Textbox и другую, которая отправляет информацию. У меня возникли проблемы с поиском текстов пользователей после создания textbox. Вот код:Захват пользовательского ввода из динамического текстового поля

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 

    } 

Заранее благодарен вам!

+0

я не могу проверить сейчас, но вы не должны дать атрибут 'Runat =«сервер»' в текстовое поле? –

+0

@MrLister Вам не нужно добавлять 'runat =" server ", если вы визуализируете серверный элемент управления из кода позади. – Win

ответ

2

Вот как вы создаете TextBoxs динамически. Он отслеживает количество текстовых полей в ViewState.

<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 
    } 
} 
+0

Удивительный код! Большое спасибо!! Но что, если бы я хотел создать одно текстовое поле за раз? Например, каждый клик будет создавать 1 текстовое поле, пока я не достиг 4 текстовых полей – vadim

+1

Я обновил ответ, который добавляет текстовое поле по одному. – Win

+0

Удивительная помощь! Это имеет больший смысл, спасибо! – vadim

0

Не храните TextBoxes в сеансе; скорее, создайте их на странице.

Трюк создает их в нужное время КАЖДОЕ время (т. Е. С каждым PostBack). Попробуйте загрузить их OnLoad() для страницы (или CreateChildControls(), если это возможно).

Как только вы это сделаете, ASP.NET автоматически свяжет вход с TextBox, и вы сможете ссылаться на них, как обычно, или через .FindControl() родителя.

0

Я думаю, что Вы использовали большую программу для создания динамических текстовых полей и вставки в данные base.For retriving текст с динамически генерируемых текстовых, используйте код ниже ..

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

, где «я» представляет количество созданных вами текстовых полей.

Для получения дополнительной информации. Пожалуйста, ознакомьтесь с приведенной ниже ссылкой.

how to insert value to sql db from dynamically generated textboxes asp.net

Смежные вопросы