Question

Je construis une application dans laquelle une page chargera les contrôles utilisateur (x.ascx) de manière dynamique en fonction de la chaîne de requête.

J'ai un résumé de validation sur la page et je souhaite le mettre à jour à partir des contrôles de l'utilisateur. Cela me permettra d’avoir plusieurs contrôles utilisant un seul résumé de validation. Comment puis-je transmettre des données entre les contrôles et les pages.

Je sais que je peux définir le contrôle au moment de la conception et utiliser des événements pour le faire, mais ces contrôles sont chargés de manière dynamique à l'aide de Page.LoadControl.

De plus, je souhaite éviter l'utilisation de sessions ou de chaînes de requête.

Était-ce utile?

La solution

Vous avez trouvé un moyen de le faire:

Étape 1: créez un contrôle utilisateur de base et définissez les délégués et les événements dans ce contrôle.

Étape 2: créez une fonction publique dans le contrôle utilisateur de base pour déclencher les événements définis à l'étape 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

Étape 3: héritez de votre contrôle utilisateur Web du contrôle utilisateur de base que vous avez créé à l'étape 1.

Étape 4: à partir de votre contrôle utilisateur Web - Appelez le MyBase.FunctionName que vous avez défini à l'étape 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

Étape 5: dans votre page, chargez le contrôle dynamiquement à l'aide de Page.LoadControl et définissez le contrôle en tant que contrôle utilisateur de base.

Étape 6: attachez des gestionnaires d'événements avec ce contrôle.

'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

Autres conseils

En supposant que vous parlez des commandes du validateur asp, leur utilisation avec le résumé de validation devrait être simple: utilisez le même groupe de validation. Normalement, je dérive tous les contrôles utilisateur d'une classe de base qui ajoute une propriété ValidationGroup dont le configurateur appelle une méthode surchargée qui modifie tous les validateurs internes dans le même groupe de validation.

La partie délicate consiste à les faire se comporter lorsqu’ils sont ajoutés dynamiquement. Vous devez être conscient de certains pièges, principalement en ce qui concerne le cycle de page et le moment où vous les ajoutez à votre objet Page. Si vous connaissez tous les contrôles utilisateur possibles que vous utiliserez pendant la conception, j'essaierais de les ajouter de manière statique en utilisant EnableViewState et Visible afin de réduire les frais généraux, même s'il y en a trop.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top