visual usuario recorrer paneles formulario eliminar dinamicamente dentro crear controles control agregar abrir c# asp.net asp.net-ajax

c# - recorrer - Adición mediante programación de controles de usuario dentro de un panel de actualización



paneles en c# (3)

Creo que esta es una de las trampas más comunes para los programadores de asp.net, pero no es tan difícil hacerlo bien cuando sabes lo que está sucediendo (¡recuerda siempre tu estado de visualización!).

la siguiente pieza de código explica cómo se pueden hacer las cosas. Es una página simple donde un usuario puede hacer clic en un menú que activará una acción que agregará un control de usuario a la página dentro del panel de actualización.
(Este código es prestado desde aquí , y tiene mucha más información sobre este tema)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SampleMenu1.aspx.cs" Inherits="SampleMenuPage1" %> <!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>Sample Menu</title> </head> <body> <form id="form1" runat="server"> <asp:Menu ID="Menu1" runat="server" OnMenuItemClick="Menu1_MenuItemClick"> <Items> <asp:MenuItem Text="File"> <asp:MenuItem Text="Load Control1"></asp:MenuItem> <asp:MenuItem Text="Load Control2"></asp:MenuItem> <asp:MenuItem Text="Load Control3"></asp:MenuItem> </asp:MenuItem> </Items> </asp:Menu> <br /> <br /> <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="Menu1" /> </Triggers> </asp:UpdatePanel> </form> </body> </html>

y

using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class PlainSampleMenuPage : System.Web.UI.Page { private const string BASE_PATH = "~/DynamicControlLoading/"; private string LastLoadedControl { get { return ViewState["LastLoaded"] as string; } set { ViewState["LastLoaded"] = value; } } private void LoadUserControl() { string controlPath = LastLoadedControl; if (!string.IsNullOrEmpty(controlPath)) { PlaceHolder1.Controls.Clear(); UserControl uc = (UserControl)LoadControl(controlPath); PlaceHolder1.Controls.Add(uc); } } protected void Page_Load(object sender, EventArgs e) { LoadUserControl(); } protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) { MenuItem menu = e.Item; string controlPath = string.Empty; switch (menu.Text) { case "Load Control2": controlPath = BASE_PATH + "SampleControl2.ascx"; break; case "Load Control3": controlPath = BASE_PATH + "SampleControl3.ascx"; break; default: controlPath = BASE_PATH + "SampleControl1.ascx"; break; } LastLoadedControl = controlPath; LoadUserControl(); } }

para el código detrás.

Eso es básicamente eso. Puede ver claramente que viewstate se mantiene con LastLoadedControl mientras que los controles se agregan dinámicamente a la página (dentro de updatePanel (en realidad dentro de placeHolder dentro de updatePanel) cuando el usuario hace clic en un elemento de menú, que enviará una devolución de datos asincrónica al servidor.

Más información también se puede encontrar aquí:

y por supuesto en el sitio web que contiene el código de ejemplo que utilicé aquí.

Tengo problemas para agregar dinámicamente controles dentro de un panel de actualización con devoluciones de datos parciales. He leído muchos artículos sobre controles dinámicos y entiendo cómo agregarlos y mantenerlos con las devoluciones, pero la mayoría de esa información no se aplica y no funcionará para las devoluciones de datos parciales. No puedo encontrar ninguna información útil sobre cómo agregarlos y mantenerlos con UpdatePanels. Me gustaría hacer esto sin crear un servicio web si es posible. ¿Alguien tiene alguna idea o referencia a alguna información útil?


Encontré el problema de que al usar el método mencionado anteriormente, LoadUserControl () se llama dos veces al manejar un evento. He leído algunos otros artículos y me gustaría mostrarle mi modificación:

1) Use LoadViewstate en lugar de Page_Load para cargar el control del usuario:

protected override void LoadViewState(object savedState) { base.LoadViewState(savedState); if (!string.IsNullOrEmpty(CurrentUserControl)) LoadDataTypeEditorControl(CurrentUserControl, panelFVE); }

2) No se olvide de configurar el ID de control al cargar el control de usuario:

private void LoadDataTypeEditorControl(string userControlName, Control containerControl) { using (UserControl myControl = (UserControl) LoadControl(userControlName)) { containerControl.Controls.Clear(); string userControlID = userControlName.Split(''.'')[0]; myControl.ID = userControlID.Replace("/", "").Replace("~", ""); containerControl.Controls.Add(myControl); } this.CurrentUserControl = userControlName; }


Prueba esto:

Literal literal = new Literal(); literal.Text = "<script type=''text/javascript'' src=''http://www.googleadservices.com/pagead/conversion.js''>"; UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);

Puede reemplazar el contenido de literal con cualquier contenido HTML que desee ...