Pergunta

Estou criando um aplicativo em que uma página carregará controles do usuário (x.ascx) dinamicamente com base na sequência de consultas.

Eu tenho um resumo de validação na página e deseja atualizá -lo dos controles do usuário. Isso me permitirá ter vários controles usando um resumo de validação. Como posso passar dados entre controles e páginas.

Sei que posso definir o controle no tempo de design e usar eventos para fazer isso, mas esses controles são carregados dinamicamente usando a página.loadControl.

Além disso, quero evitar o uso de sessões ou consultas.

Foi útil?

Solução

Encontrei uma maneira de fazer isso:

Etapa 1: Crie um controle base do usuário e defina delegados e eventos nesse controle.

Etapa 2: Crie uma função pública no controle do usuário base para aumentar os eventos definidos na etapa1.

'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

Etapa 3: Herite o controle do usuário da Web do controle do usuário base que você criou na etapa1.

Etapa 4: a partir do seu controle do usuário da Web - ligue para o mybase.functionName que você definiu na etapa2.

'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

Etapa 5: Na sua página, carregue o controle dinamicamente usando a página.LoadControl e faça o controle como controle do usuário base.

Etapa 6: Anexe os manipuladores de eventos com esse controle.

'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

Outras dicas

Supondo que você esteja falando sobre os controles do validador da ASP, fazê -los trabalhar com o resumo da validação deve ser fácil: use o mesmo grupo de validação. Normalmente, eu derivo todos os usuários de uma classe base que adiciona uma propriedade ValidationGroup cujo setter chama um método de excesso que altera todos os validadores internos para o mesmo grupo de validação.

A parte complicada está fazendo -os se comportar quando adicionados dinamicamente. Existem alguns petchas que você deve estar ciente, principalmente sobre o ciclo da página e quando você os adiciona ao seu objeto de página. Se você conhece todos os controles possíveis do usuário que usará durante o tempo de design, tentaria adicioná -los estaticamente usando o EnableViewState e visível para minimizar a sobrecarga, mesmo que haja muitos deles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top