2013-07-11 8 views
27

Фактически я создаю 1 TextBox по адресу Pageload и добавив, что TextBox - Panel. Теперь у меня есть LinkButton, как Add Another.Динамически созданные элементы управления теряют данные после обратной передачи

Ввод текста в этом TextBox и при необходимости мне нужно создать новый TextBox, нажав Add Another LinkButton.

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

Может ли кто-нибудь предложить мне решение?

protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      if (!IsPostBack) 
      { 
       for (int i = 0; i < 5; i++) 
       { 
        TableRow row = new TableRow(); 
        for (int j = 0; j < 5; j++) 
        { 
         TableCell cell = new TableCell(); 
         TextBox tb = new TextBox();       
         tb.ID = "TextBoxRow_" + i + "Col_" + j;       
         cell.Controls.Add(tb);       
         row.Cells.Add(cell); 
        }      
        Table1.Rows.Add(row); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     }   
    } 

Это образец кода, тот же код записывается в Button_Click Также

protected void ASPxButton1_Click(object sender, EventArgs e) 
    { 
int k = Table1.Controls.Count; 
} 

Я получаю Count=0 на Button_Click.

+1

Можете ли вы показать нам какой-нибудь код? –

ответ

3

Это мой окончательный ответ после того, как много работает с динамическим управлением

.aspx

<form id="form1" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<div style="text-align: center"> 
    <div style="background-color: Aqua; width: 250px;"> 
    <br /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:PlaceHolder runat="server" ID="myPlaceHolder"></asp:PlaceHolder> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnAddTextBox" EventName="Click" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    <br /> 
    </div> 
    <br /> 
    <asp:Button ID="btnAddTextBox" runat="server" Text="Add TextBox" OnClick="btnAddTextBox_Click" /> 
    <br /><br /> 
    <asp:UpdatePanel ID="UpdatePanel2" runat="server"> 
     <ContentTemplate> 
      <asp:Button runat="server" ID="MyButton" Text="Get Values." OnClick="MyButton_Click" /> 
      <br /><br /> 
      <asp:Label runat="server" ID="MyLabel"></asp:Label> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</div> 
</form> 

.aspx.cs

static int myCount = 0; 
    private TextBox[] dynamicTextBoxes; 

    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     Control myControl = GetPostBackControl(this.Page); 

     if ((myControl != null)) 
     { 
      if ((myControl.ClientID.ToString() == "btnAddTextBox")) 
      { 
       myCount = myCount + 1; 
      } 
     } 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     dynamicTextBoxes = new TextBox[myCount]; 
     int i; 
     for (i = 0; i < myCount; i += 1) 
     { 
      TextBox textBox = new TextBox(); 
      textBox.ID = "myTextBox" + i.ToString(); 
      myPlaceHolder.Controls.Add(textBox); 
      dynamicTextBoxes[i] = textBox; 
      LiteralControl literalBreak = new LiteralControl("<br />"); 
      myPlaceHolder.Controls.Add(literalBreak); 
     } 
    } 

    protected void btnAddTextBox_Click(object sender, EventArgs e) 
    { 
     // Handled in preInit due to event sequencing. 
    } 

    protected void MyButton_Click(object sender, EventArgs e) 
    { 
     MyLabel.Text = ""; 
     foreach (TextBox tb in dynamicTextBoxes) 
     { 
      MyLabel.Text += tb.Text + " :: "; 
     } 
    } 

    public static Control GetPostBackControl(Page thePage) 
    { 
     Control myControl = null; 
     string ctrlName = thePage.Request.Params.Get("__EVENTTARGET"); 
     if (((ctrlName != null) & (ctrlName != string.Empty))) 
     { 
      myControl = thePage.FindControl(ctrlName); 
     } 
     else 
     { 
      foreach (string Item in thePage.Request.Form) 
      { 
       Control c = thePage.FindControl(Item); 
       if (((c) is System.Web.UI.WebControls.Button)) 
       { 
        myControl = c; 
       } 
      } 
     } 
     return myControl; 
    } 
6

Динамически сгенерированный элемент управления не поддерживает состояние. Вы должны поддерживать его самостоятельно. Вы можете использовать какое-то скрытое поле, чтобы сохранить состояние элементов управления, которое будет использоваться на стороне сервера для извлечения состояния. Asp.net использует скрытое поле для поддержания состояния между запросами, вы можете увидеть __VIEWSTATE в источнике.

В ASP.NET-страницах состояние представления представляет состояние страницы, когда было обработано последним на сервере. Он используется для построения контекста вызова и сохранения значений для двух последовательных запросов для одной и той же страницы. По умолчанию состояние сохраняется на клиенте с использованием скрытого поля , которое добавляется на страницу и восстанавливается на сервере до обработки страницы . Состояние представления перемещается вперед и назад с самой страницы , но не представляет или не содержит никакой информации, которая является , относящейся к отображению на клиентской странице, Reference.

+0

Это верно, если они используются сами по себе, но если вы добавите динамически созданный элемент управления в PlaceHolder (или альтернативный WebControl), то это будет поддерживать состояние динамического контроля. Пока вы воссоздаете свой динамический контроль при загрузке страницы (или раньше), при обратных передачах информация о состоянии будет сохранена. – Radderz

13

При использовании динамических элементов управления вы должны помнить, что они будут существовать только до следующего postback.ASP.NET не воссоздает динамически добавленный элемент управления. Если вам нужно повторно создать элемент управления несколько раз, вы должны выполнить создание элемента управления обработчиком событий PageLoad (так как в настоящее время вы просто создаете только первый раз, когда TextBox использует условие:! IsPostabck). Это дает дополнительное преимущество, позволяющее использовать режим просмотра с вашим динамическим управлением. Несмотря на то, что состояние представления обычно восстанавливается перед событием Page.Load, если вы создаете элемент управления в обработчике события PageLoad, ASP.NET будет применять любую информацию состояния представления, которая имеет после завершения обработчика события PageLoad.

Итак, удалите условие:! IsPostback, чтобы каждый раз, когда страница загружается, также создается элемент управления TextBox. Вы также увидите поле «Состояние текста», сохраненное после завершения обработчика PageLoad. [Очевидно, что вы не отключили ViewState !!! ]

Пример:

protected void Page_Load(object sender, EventArgs e) 
{ 

    TextBox txtBox = new TextBox(); 
    // Assign some text and an ID so you can retrieve it later. 

    txtBox.ID = "newButton"; 
    PlaceHolder1.Controls.Add(txtBox); 

} 

Теперь после запуска его, введите что-нибудь в текстовом поле и посмотреть, что происходит при нажатии на любую кнопку, которая вызывает обратную передачу. Текстовое окно все еще сохраняет свое состояние !!!

+1

Не могли бы вы рассказать о ViewState и как это повлияет на динамические элементы управления? – Zorgarath

+0

Благослови вас! Отличное решение. – ARNDG2

0

На самом деле, я использовал Javascript для выполнения своей задачи. и это выглядит следующим образом:

<form id="form1" runat="server" enctype="multipart/form-data" method="post"> 
     <span style="font-family: Arial">Click to add files</span>&nbsp;&nbsp; 
     <input id="Button1" type="button" value="add" onclick="AddFileUpload()" /> 
     <br /> 
     <br /> 
     <div id="FileUploadContainer"> 
      <!--FileUpload Controls will be added here --> 
     </div> 
     <asp:HiddenField ID="HdFirst1" runat="server" Value="" /> 
     <br /> 
     <asp:Button ID="btnUpload" runat="server" Text="Upload" OnClick="btnUpload_Click" /> 
    </form> 

Сценарий:

<script type="text/javascript"> 
     var counter = 0; 

     function AddFileUpload() { 

      var div = document.createElement('DIV'); 
      div.innerHTML = '<input id="file' + counter + '"name = "file' + counter + '"type="text"/><input id="file' + counter + '" name = "file' + counter + '" type="file" /><input id="Button' + counter + '" type="button" value="Remove" onclick = "RemoveFileUpload(this)" />'; 

      document.getElementById("FileUploadContainer").appendChild(div); 
      counter++; 
     } 
     function RemoveFileUpload(div) { 
      document.getElementById("FileUploadContainer").removeChild(div.parentNode); 
     } 

     function mydetails(div) { 
      var info; 
      for (var i = 0; i < counter; i++) { 
       var dd = document.getElementById('file' + i).value; 
       info = info + "~" + dd; 
      } 
      document.getElementById('<%= HdFirst1.ClientID %>').value = info; 
     } 
    </script> 

и В Баттона Upload_Click:

for (int i = 0; i < Request.Files.Count; i++) 
     {   
      string strname = HdFirst1.Value; 
      string[] txtval = strname.Split('~'); 
      HttpPostedFile PostedFile = Request.Files[i]; 
      if (PostedFile.ContentLength > 0) 
      { 
       string FileName = System.IO.Path.GetFileName(PostedFile.FileName); 
       // string textname= 
       //PostedFile.SaveAs(Server.MapPath("Files\\") + FileName); 
      } 
     } 
13

Все, что вам нужно сделать, это повторно Instantiate/повторной инициализации динамической контролирует до или после события загрузки страницы каждый раз во время обратной передачи и добавляет этот элемент управления в страницу/формы/заполнители. Затем отправленные данные будут автоматически назначены элементу управления, вызвав метод LoadPostData родительским элементом управления.

проверить статью и как писать код для динамического управления - How to maintain dynamic control events, data during postback in asp.net

enter image description here

+0

Теперь я понимаю, что управление динамическим управлением управляется благодаря vivek. – Rohit

+0

+1 для подробной вспомогательной статьи. Это отличная ссылка для подчеркнутых выработок динамических элементов управления для postbacks/events. – Radderz

4

Просто удалите эту строку

if (!IsPostBack) 
0

При работе с динамическим управлением, они не будут в состоянии поддерживать его состояние во время обратной передачи и потерянные данные. Потому что у них нет какого-либо viewstate для сохранения своих данных.

Вам необходимо только сохранить созданные данные управления в ViewState динамически и загрузить данные на страницу во время обратной передачи, и вы выполните .

public Dictionary<Guid, string> UcList 
{ 
    get { return ViewState["MyUcIds"] != null ? (Dictionary<Guid, string>)ViewState["MyUcIds"] : new Dictionary<Guid, string>(); } 
    set { ViewState["MyUcIds"] = value; } 
} 

public void InitializeUC() 
{ 
    int index = 1; 
    foreach (var item in UcList) 
    { 
     var myUc = (UserControls_uc_MyUserControl)LoadControl("~/UserControls/uc_MyUserControl.ascx"); 
     myUc.ID = item.Value; 
     pnlMyUC.Controls.AddAt(index, myUc); 
     index++; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     LoadControl(); 
    else 
     InitializeUC(); 
} 

Здесь вы можете найти лучшее представление об обратной передаче и обратной передаче для динамических элементов управления. Retain dynamic control values in every postback or event click.

enter image description here

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