Pregunta

Estoy creando una aplicación donde una página cargará los controles del usuario (x.ascx) dinámicamente en función de la cadena de consulta.

Tengo un resumen de validación en la página y quiero actualizarlo desde los controles de usuario. Esto me permitirá tener múltiples controles usando un Resumen de Validación. ¿Cómo puedo pasar datos entre controles y páginas?

Sé que puedo definir el control en tiempo de diseño y usar eventos para hacerlo, pero estos controles se cargan dinámicamente usando Page.LoadControl.

Además, quiero evitar el uso de sesiones o cadenas de consulta.

¿Fue útil?

Solución

Encontré una manera de hacer esto:

Paso 1: Cree un Control de usuario base y defina Delegados y Eventos en este control.

Paso 2: Cree una función pública en el control de usuario base para aumentar los eventos definidos en el paso 1.

'SourceCode for Step 1 and Step 2
Public Delegate Sub UpdatePageHeaderHandler(ByVal PageHeading As String)
Public Class CommonUserControl
    Inherits System.Web.UI.UserControl

    Public Event UpdatePageHeaderEvent As UpdatePageHeaderHandler
    Public Sub UpdatePageHeader(ByVal PageHeadinga As String)
        RaiseEvent UpdatePageHeaderEvent(PageHeadinga)
    End Sub
End Class

Paso 3: Herede su Control de usuario web del control de usuario base que creó en el Paso1.

Paso 4: desde su Control de usuario web: llame a MyBase.FunctionName que definió en el Paso2.

'SourceCode for Step 3 and Step 4
Partial Class DerievedUserControl
    Inherits CommonUserControl

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        MyBase.PageHeader("Test Header")
    End Sub
End Class

Paso 5: en su página, cargue el control dinámicamente usando Page.LoadControl y emita el control como control de usuario base.

Paso 6: Adjunte controladores de eventos con este control.

'SourceCode for Step 5 and Step 6
Private Sub LoadDynamicControl()
    Try
        'Try to load control
        Dim c As CommonUserControl = CType(LoadControl("/Common/Controls/Test.ascx", CommonUserControl))
        'Attach Event Handlers to the LoadedControl
        AddHandler c.UpdatePageHeaderEvent, AddressOf PageHeaders
        DynamicControlPlaceHolder.Controls.Add(c)
    Catch ex As Exception
        'Log Error
    End Try
End Sub

Otros consejos

Suponiendo que está hablando de los controles de validación de asp, hacer que funcionen con el resumen de validación debería ser fácil: use el mismo grupo de validación. Normalmente, obtengo todos los controles de usuario de una clase base que agrega una propiedad ValidationGroup cuyo configurador llama a un método anulado que cambia todos los validadores internos al mismo grupo de validación.

La parte difícil es hacer que se comporten cuando se agregan dinámicamente. Hay algunas trampas que debe tener en cuenta, principalmente en relación con el ciclo de la página y cuando las agrega a su objeto Página. Si conoce todos los controles de usuario posibles que usará durante el tiempo de diseño, trataría de agregarlos estáticamente usando EnableViewState y Visible para minimizar la sobrecarga, incluso si hay demasiados de ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top