OVH Cloud OVH Cloud

Problème avec CType dynamique et AddHandler

2 réponses
Avatar
news.microsoft.com
Bonjour,

En gros, je souhaiterais pouvoir passer une chaîne à la fonction CType, mais
ce n'est pas possible, je suis donc à la recherche d'une astuce pour faire
qqchose d'approchant.
du genre de CType(plhContent.Controls(0), "NomDeMaClasse")


Sur le page_load d'un System.Web.UI.UserControl (container.ascx: classe
container) , je charge dans un PlaceHolder dynamiquement un autre
System.Web.UI.UserControl (control1.ascx: classe control1)
Le problème, c'est que je connais le nom du controle chargé seulement à
l'exécution (ça peut être control1, control2, ...)
et que je veux ajouter dans contrainer un gestionnaire d'un évenemment du
contrôle chargé

Un peu de code sera plus efficace qu'un long discours :

control1.ascx
-------------

Public Class control1

'-- Define the event that we will bubble up to the containing ASPX
page
Public Event ButtonClicked As CommandEventHandler
End Class

container.ascx
--------------

Public Class container

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim myControl As System.Web.UI.UserControl =
CType(Me.LoadControl(Me.TemplateSourceDirectory & "/Folder1/control1.ascx"),
System.Web.UI.UserControl)
...
'-- ajout dans le placeHolder
plhContent.Controls.Add(myControl)
'-- ajout du gestionnaire d'évènement
AddHandler CType(plhContent.Controls(0), control1).ButtonClicked, AddressOf
Header11_ButtonClicked
End Sub

Private Sub Header11_ButtonClicked(ByVal sender As System.Object, ByVal e As
CommandEventArgs)
// TODO
End Sub

End Class

Comment faire ça sans connaitre le type avant l'éxecution ?

D'avance merci de votre aide

Damien

2 réponses

Avatar
Daniel TIZON
Bonjour Damien,
Si tu charges dynamiquement tes usercontrols c'est qu'ils partagent une
interface connue et commune à priori, sous peine d'être obligé de modifier
le code de ta classe container pour la prise en charge d'un nouveau type.
Pour réaliser çà le plus simple est de déclarer une interface qui sera
implémentée par tous les UserControls chargés dynamiquements

Public Interface IButtonClicked
Event ButtonClicked As CommandEventHandler
End Interface

Puis d'implémenter cette interface

Class control1
Inherits System.Web.UI.UserControl
Implements IButtonClicked

Public Event ButtonClicked As CommandEventHandler Implements
IButtonClicked.ButtonClicked
....
End Class

et dans le code de container.ascx,

Dim myControl As System.Web.UI.UserControl =
CType(Me.LoadControl(TypeControle + ".ascx"), System.Web.UI.UserControl)
'-- ajout du gestionnaire d'évènement
AddHandler CType(myControl, IButtonClicked).ButtonClicked, AddressOf
myControl_Clicked
....

Protected Sub myControl_Clicked(ByVal sender As Object, ByVal e As
CommandEventArgs)
Label1.Text = "commande :" + e.CommandName
End Sub


En espérant que çà t'aideras,
Cordialement,

--
Daniel TIZON
MCP - MCSD.NET - MCT



"news.microsoft.com" a écrit dans le message de news:

Bonjour,

En gros, je souhaiterais pouvoir passer une chaîne à la fonction CType,
mais ce n'est pas possible, je suis donc à la recherche d'une astuce pour
faire qqchose d'approchant.
du genre de CType(plhContent.Controls(0), "NomDeMaClasse")


Sur le page_load d'un System.Web.UI.UserControl (container.ascx: classe
container) , je charge dans un PlaceHolder dynamiquement un autre
System.Web.UI.UserControl (control1.ascx: classe control1)
Le problème, c'est que je connais le nom du controle chargé seulement à
l'exécution (ça peut être control1, control2, ...)
et que je veux ajouter dans contrainer un gestionnaire d'un évenemment du
contrôle chargé

Un peu de code sera plus efficace qu'un long discours :

control1.ascx
-------------

Public Class control1

'-- Define the event that we will bubble up to the containing ASPX
page
Public Event ButtonClicked As CommandEventHandler
End Class

container.ascx
--------------

Public Class container

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim myControl As System.Web.UI.UserControl =
CType(Me.LoadControl(Me.TemplateSourceDirectory &
"/Folder1/control1.ascx"), System.Web.UI.UserControl)
...
'-- ajout dans le placeHolder
plhContent.Controls.Add(myControl)
'-- ajout du gestionnaire d'évènement
AddHandler CType(plhContent.Controls(0), control1).ButtonClicked,
AddressOf Header11_ButtonClicked
End Sub

Private Sub Header11_ButtonClicked(ByVal sender As System.Object, ByVal e
As CommandEventArgs)
// TODO
End Sub

End Class

Comment faire ça sans connaitre le type avant l'éxecution ?

D'avance merci de votre aide

Damien




Avatar
news.microsoft.com
C'est exactement ça.

Merci beaucoup

Damien


"Daniel TIZON" a écrit dans le message
de news: %
Bonjour Damien,
Si tu charges dynamiquement tes usercontrols c'est qu'ils partagent une
interface connue et commune à priori, sous peine d'être obligé de modifier
le code de ta classe container pour la prise en charge d'un nouveau type.
Pour réaliser çà le plus simple est de déclarer une interface qui sera
implémentée par tous les UserControls chargés dynamiquements

Public Interface IButtonClicked
Event ButtonClicked As CommandEventHandler
End Interface

Puis d'implémenter cette interface

Class control1
Inherits System.Web.UI.UserControl
Implements IButtonClicked

Public Event ButtonClicked As CommandEventHandler Implements
IButtonClicked.ButtonClicked
....
End Class

et dans le code de container.ascx,

Dim myControl As System.Web.UI.UserControl =
CType(Me.LoadControl(TypeControle + ".ascx"), System.Web.UI.UserControl)
'-- ajout du gestionnaire d'évènement
AddHandler CType(myControl, IButtonClicked).ButtonClicked,
AddressOf myControl_Clicked
....

Protected Sub myControl_Clicked(ByVal sender As Object, ByVal e As
CommandEventArgs)
Label1.Text = "commande :" + e.CommandName
End Sub


En espérant que çà t'aideras,
Cordialement,

--
Daniel TIZON
MCP - MCSD.NET - MCT



"news.microsoft.com" a écrit dans le message de news:

Bonjour,

En gros, je souhaiterais pouvoir passer une chaîne à la fonction CType,
mais ce n'est pas possible, je suis donc à la recherche d'une astuce pour
faire qqchose d'approchant.
du genre de CType(plhContent.Controls(0), "NomDeMaClasse")


Sur le page_load d'un System.Web.UI.UserControl (container.ascx: classe
container) , je charge dans un PlaceHolder dynamiquement un autre
System.Web.UI.UserControl (control1.ascx: classe control1)
Le problème, c'est que je connais le nom du controle chargé seulement à
l'exécution (ça peut être control1, control2, ...)
et que je veux ajouter dans contrainer un gestionnaire d'un évenemment du
contrôle chargé

Un peu de code sera plus efficace qu'un long discours :

control1.ascx
-------------

Public Class control1

'-- Define the event that we will bubble up to the containing ASPX
page
Public Event ButtonClicked As CommandEventHandler
End Class

container.ascx
--------------

Public Class container

Private Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim myControl As System.Web.UI.UserControl =
CType(Me.LoadControl(Me.TemplateSourceDirectory &
"/Folder1/control1.ascx"), System.Web.UI.UserControl)
...
'-- ajout dans le placeHolder
plhContent.Controls.Add(myControl)
'-- ajout du gestionnaire d'évènement
AddHandler CType(plhContent.Controls(0), control1).ButtonClicked,
AddressOf Header11_ButtonClicked
End Sub

Private Sub Header11_ButtonClicked(ByVal sender As System.Object, ByVal e
As CommandEventArgs)
// TODO
End Sub

End Class

Comment faire ça sans connaitre le type avant l'éxecution ?

D'avance merci de votre aide

Damien