Creado dinámicamente Controla la pérdida de datos después de la devolución de datos

En realidad, estoy creando 1 TextBox en Pageload y agregando ese TextBox al Panel . Ahora, tengo un LinkButton como Add Another .

Estoy ingresando texto en ese TextBox y si es necesario, necesito crear un nuevo TextBox , haciendo clic en Add Another LinkButton botón de Add Another LinkButton .

En realidad, puedo obtener el conteo y recrear los TextBoxes . Pero, el problema es que falta el texto Mi entrada en los Textboxes texto generados Textboxes .

¿Alguien puede sugerirme una solución para esto?

 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; } } 

Este es un código de muestra, el mismo código está escrito en Button_Click

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

Button_Click un Count=0 en Button_Click .

Todo lo que necesita hacer es volver a crear instancias / reiniciar los controles dynamics antes o en el evento de carga de página todas y cada una de las veces durante la devolución de datos y agregar este control a la página / formularios / marcadores de posición. Luego, los datos publicados se asignarán automáticamente al control llamando al método LoadPostData mediante el control principal.

revise el artículo y cómo escribir código para control dynamic – Cómo mantener eventos de control dynamic, datos durante la devolución de datos en asp.net

enter image description here

Al usar controles dynamics, debe recordar que existirán solo hasta la próxima devolución. ASP.NET no volverá a crear un control agregado dinámicamente. Si necesita volver a crear un control varias veces, debe realizar la creación del control en el controlador de eventos PageLoad (Como actualmente, solo está creando por primera vez el TextBox con la condición:! IsPostabck). Esto tiene la ventaja adicional de permitirle usar el estado de vista con su control dynamic. Aunque el estado de visualización normalmente se restaura antes del evento Page.Load, si crea un control en el controlador para el evento PageLoad, ASP.NET aplicará cualquier información de estado de vista que tenga después de que finalice el controlador de eventos PageLoad.

Por lo tanto, elimine la condición:! IsPostback, de modo que cada vez que carga la página, también se crea el control TextBox. También verá el cuadro de estado del texto guardado después de que el controlador de PageLoad finalice. [¡Obviamente no has desactivado ViewState! ]

Ejemplo:

 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); } 

Ahora, después de ejecutarlo, escriba cualquier cosa en el cuadro de texto y vea qué sucede cuando hace clic en cualquier botón que provoque la devolución de datos. ¡El cuadro de texto todavía mantiene su estado!

El control generado dinámicamente no mantiene el estado. Tienes que mantenerlo por tu cuenta. Puede usar algún campo oculto para mantener el estado de los controles, que se usarán en el lado del servidor para extraer el estado. Asp.net usa el campo oculto para mantener el estado entre las solicitudes, puede ver __VIEWSTATE en la fuente.

En las páginas ASP.NET, el estado de la vista representa el estado de la página cuando se procesó por última vez en el servidor. Se usa para crear un contexto de llamada y retener valores en dos solicitudes sucesivas para la misma página. De forma predeterminada, el estado persiste en el cliente utilizando un campo oculto agregado a la página y se restaura en el servidor antes de que se procese la solicitud de página. El estado de la vista se desplaza hacia adelante y hacia atrás con la página misma, pero no representa ni contiene ninguna información relevante para la visualización de la página del lado del cliente, Referencia .

Solo elimina esta linea

  if (!IsPostBack) 

Esta es mi respuesta final después de trabajar mucho con Dynamic Controls

.aspx

 







.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("
"); 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; }

Cuando trabaje con controles dynamics, no podrá mantener su estado durante la devolución de datos y se perderán sus datos. Debido a que no tienen ningún estado de visualización para mantener sus datos.

Solo necesita mantener dinámicamente los datos de controles creados en ViewState y cargar los datos en la página en el momento de la devolución de datos y listo.

 public Dictionary UcList { get { return ViewState["MyUcIds"] != null ? (Dictionary)ViewState["MyUcIds"] : new Dictionary(); } 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(); } 

Aquí puede encontrar la mejor comprensión sobre la devolución de datos y la devolución de datos para controles dynamics. Conservar los valores de control dynamic en cada devolución de datos o clic de evento .

enter image description here

En realidad, he usado Javascript para llevar a cabo mi tarea. y dice así:

 
Click to add files  


Guión:

   

y en el botón 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); } } 
Intereting Posts