Domanda

Sto creando un'applicazione in cui una pagina caricherà i controlli utente (x.ascx) in modo dinamico in base alla stringa di query.

Ho un riepilogo di convalida sulla pagina e desidero aggiornarlo dai controlli utente. Questo mi permetterà di avere più controlli usando un Riepilogo di convalida. Come posso passare i dati tra controlli e pagine.

So di poter definire il controllo in fase di progettazione e utilizzare gli eventi per farlo, ma questi controlli vengono caricati in modo dinamico utilizzando Page.LoadControl.

Inoltre, voglio evitare di usare sessioni o querystring.

È stato utile?

Soluzione

Trovato un modo per farlo:

Passaggio 1: creare un controllo utente di base e definire delegati ed eventi in questo controllo.

Passaggio 2: creare una funzione pubblica nel controllo utente di base per generare eventi definiti nel passaggio 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

Passaggio 3: ereditare il controllo utente Web dal controllo utente di base creato nel passaggio 1.

Passaggio 4: dal controllo utente Web: chiamare MyBase.FunctionName definito nel passaggio 2.

'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

Passaggio 5: nella tua pagina, carica il controllo in modo dinamico usando Page.LoadControl e lancia il controllo come controllo utente di base.

Passaggio 6: collegare i gestori di eventi con questo controllo.

'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

Altri suggerimenti

Supponendo che tu stia parlando dei controlli validator di asp, farli funzionare con il riepilogo di validazione dovrebbe essere facile: usa lo stesso gruppo di validazione. Normalmente, desumo tutti i controlli utente da una classe base che aggiunge una proprietà ValidationGroup il cui setter chiama un metodo overriden che modifica tutti i validatori interni nello stesso gruppo di validazione.

La parte difficile è farli comportare quando vengono aggiunti in modo dinamico. Ci sono alcuni aspetti che dovresti conoscere, principalmente riguardo al ciclo di pagine e quando li aggiungi all'oggetto Page. Se conosci tutti i possibili controlli utente che utilizzerai durante la fase di progettazione, proverei ad aggiungerli staticamente usando EnableViewState e Visible per ridurre al minimo le spese generali, anche se ce ne sono troppi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top