c# jquery asp.net user-controls asp.net-4.0

c# - Agregar controles de usuario desde el código detrás de



jquery asp.net (3)

Prefiero la solución de javascript / ajax pero creo que no hay nada de malo en tu código.

Hice un pequeño ejemplo. Aquí está la misma solución que tienes. La ventaja es que el control solo se carga en caso de clic.

public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnLink_Click(object sender, EventArgs e) { var uc = (UserControl)Page.LoadControl("~/WebUserControl1.ascx"); pnl.Controls.Add(uc); } }

Aquí hay un ejemplo donde el control del usuario se carga en el evento Page_Load y en el caso de hacer clic (btnLink_Click) el control del usuario se agrega al panel. Funciona de la misma manera que su solución, pero el control del usuario se puede cargar (no se procesa en la memoria) aunque no sea necesario.

public partial class Default : System.Web.UI.Page { UserControl uc; protected void Page_Load(object sender, EventArgs e) { if(IsPostBack) // This condition is not needed but we know that click is always postback uc = (UserControl)Page.LoadControl("~/WebUserControl1.ascx"); } protected void btnLink_Click(object sender, EventArgs e) { pnl.Controls.Add(uc); } }

Aquí hay una solución que prefiero, está basada en la propiedad visible. En caso de que el control del usuario no sea visible, no se procesará en la salida. Claro que no es muy práctico en el caso de una tabla con muchas celdas como contenedor de control en lugar de panel.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %> <%@ Register Src="~/WebUserControl1.ascx" TagName="ucrCtrl" TagPrefix="ctr" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="btnLink" runat="server" Text="Add" OnClick="btnLink_Click" /> <asp:Panel runat="server" ID="pnl"> <ctr:ucrCtrl runat="server" ID="usrCtrl" Visible="false" /> </asp:Panel> </div> </form> </body> </html> namespace WebApplication1 { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnLink_Click(object sender, EventArgs e) { usrCtrl.Visible = true; } } }

Esta pregunta ya tiene una respuesta aquí:

Tengo un control de usuario ( UserControl1 ) en mi página y un botón Agregar más. Al hacer clic en el botón Agregar más agrego el mismo control de usuario nuevamente. Cuando hago clic en control de usuario por primera vez, agrega un segundo Control de usuario, pero en la segunda vez no agregue otro. Creo que el control se pierde. Estoy agregando un control como este en el botón de enlace, haga clic en:

protected void lnkadd_Click(object sender, EventArgs e) { HtmlTableCell tCell = new HtmlTableCell(); UserControl uc = (UserControl)Page.LoadControl("~/Controls/DirectionalPricingCtrl.ascx"); tCell.Controls.Add(uc); tablerow.Cells.Add(tCell); }

Creo que estoy haciendo algo mal y debería agregar controles de usuario con respecto al ciclo de vida de la página, pero ¿cómo? ¿Puede alguien por favor guiarme o proporcionar algunos enlaces útiles? ¿Qué enfoque debo seguir cuando tengo que agregar un control de usuario cada vez que hago clic en un botón Agregar y luego recupero todos los valores y los guardo en la base de datos?


Su código para agregar controles programáticamente es correcto. Trata de hacerlo,

tablerow.Cells.Add(tCell);

en lugar de agregarlo a los controles. esto parece un problema de renderizado de control.


Pensaste bien, tus controles se pierden debido a un procedimiento faltante que debe manejar las publicaciones posteriores. Siempre que defina una variable de una clase de control como HtmlTableCell, debe manejar todos los procedimientos necesarios para guardar y cargar datos de la página publicada usted mismo, en lugar de usar los predefinidos ofrecidos por el motor de tiempo de ejecución asp.net.

Es mejor guardar y cargar esos controles en algunos lugares de almacenamiento durante la devolución tal como ViewState en cada publicación posterior en PageLoad, luego, manejar la adición / eliminación de controles adicionales en el método lnkadd_Click.