2013-05-21 4 views
1

Я начинаю .net, и для начала я создам динамически несколько текстовых полей.Добавить несколько текстовых полей .net

меня написать это:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Page sans titre</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="Button1" runat="server" Text="Button" onclick="OnclickButton" /> 
    </div> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
    <br /> 
    </form> 
</body> 
</html> 

и это

namespace WebApplication1 
{ 
    public partial class _Default : System.Web.UI.Page 
    {  
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 
     protected void OnclickButton(object sender, EventArgs ea) 
     { 
      Random random = new Random(); 
      int randomNumber = random.Next(0, 100); 

      Button btnSomeButton = sender as Button; 
      btnSomeButton.Text = "I was clicked!" + randomNumber; 

      TextBox txt = new TextBox(); 
      txt.ID = "txt_" + randomNumber; 
      form1.Controls.Add(txt); 
     }  
    } 
} 

Я не понимаю, почему, когда я нажимаю 2 раз на Button1 появляется только 1 Text Box.

Почему это поведение? Каков хороший способ сделать то, что я хочу? заблаговременно

+1

Я знаю, что ваш код, вероятно, только для демонстрации, но вы также подвержены риску, чтобы попытаться создать 2 управления с тем же идентификатором ... –

+0

Да, я знаю, как вы говорите, что это для демонстрации. Спасибо за этот комментарий, что заставляет меня нормально работать с самого начала –

ответ

4

Каждый раз, когда вы нажимаете кнопку, он делает сообщение назад. Прочтите это на postbacks

Система может обрабатывать только одну обратную передачу в любой момент времени. ему нужно дождаться возврата назад, прежде чем он сможет обработать другое действие.

Также читайте о Web Page lifecycle enter image description here

2

это состояние меньше. Другими словами, сервер не знает, сколько элементов управления добавляется динамически, если вы не сохраняете информацию, которая сохраняется в столбце.

Таким образом, вы хотите, чтобы сохранить данные в ViewState (или SessionState), и загрузить их обратно с одинаковыми идентификаторами на пост обратно.

<asp:Button ID="Button1" runat="server" Text="Button" 
    OnClick="Button1_Click"/> 
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

private List<int> ControlIds 
{ 
    get { return (List<int>) ViewState["ControlIds"] ?? new List<int>(); } 
    set { ViewState["ControlIds"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     // Reload the controls on post back 
     var ids = ControlIds; 
     foreach (var id in ids) 
     { 
      var txt = new TextBox {ID = "txt_" + id}; 
      form1.Controls.Add(txt); 
     } 
    } 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    var random = new Random(); 
    int randomNumber = random.Next(0, 100); 

    var ids = ControlIds; 
    if (ids.Contains(randomNumber)) 
    { 
     // Randam number already exists. 
     // We cannot add controls with same ID. 
     return; 
    } 

    ids.Add(randomNumber); 
    ControlIds = ids; 

    var btnSomeButton = sender as Button; 
    btnSomeButton.Text = "I was clicked!" + randomNumber; 

    var txt = new TextBox 
     { 
      ID = "txt_" + randomNumber, 
      Text = randomNumber.ToString() // Just for testing 
     }; 
    form1.Controls.Add(txt); 
} 
+0

Спасибо, это очень хорошо работает –