OVH Cloud OVH Cloud

User controle

5 réponses
Avatar
Sébastien Delestre
Bonjour, je croyais avoir trouvé la solut mais que neni !!!

Alors voila un composant avec 1 textbox:
Code:
Public Class WebUserControl1
Inherits System.Web.UI.UserControl

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()

End Sub
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox

'REMARQUE : la déclaration d'espace réservé suivante est requise
par le Concepteur Web Form.
'Ne pas supprimer ou déplacer.
Private designerPlaceholderDeclaration As System.Object

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init
'CODEGEN : cet appel de méthode est requis par le Concepteur
Web Form
'Ne le modifiez pas en utilisant l'éditeur de code.
InitializeComponent()
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Placez ici le code utilisateur pour initialiser la page
End Sub
Public Property nom() As String
Get
Return TextBox1.Text
End Get
Set(ByVal Value As String)
TextBox1.Text = Value
End Set
End Property

End Class

et ma page recevant le user control
Code:
Public Class WebForm1
Inherits System.Web.UI.Page

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()

End Sub
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
Protected MonControle As WebUserControl1
'REMARQUE : la déclaration d'espace réservé suivante est requise
par le Concepteur Web Form.
'Ne pas supprimer ou déplacer.
Private designerPlaceholderDeclaration As System.Object

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init
'CODEGEN : cet appel de méthode est requis par le Concepteur
Web Form
'Ne le modifiez pas en utilisant l'éditeur de code.
InitializeComponent()
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Placez ici le code utilisateur pour initialiser la page
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Label1.Text = MonControle.nom
End Sub
End Class


quand je clique sur le bouton pour afficher dans le label le contenu de la
textbox de mon user control :

Citation:
La référence d'objet n'est pas définie à une instance d'un objet.

Détails de l'exception: System.NullReferenceException: La référence
d'objet n'est pas définie à une instance d'un objet.

Erreur source:
Ligne 28 :
Ligne 29 : Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
Ligne 30 : Label1.Text = MonControle.nom

L'erreur semble être au niveau du user controle, si je met
Code:
Protected MonControle As New WebUserControl1

dans la page web, l'erreur est la même mais à cet endroit (l 31):
Citation:
Ligne 29 : Public Property nom() As String
Ligne 30 : Get
Ligne 31 : Return TextBox1.Text
Ligne 32 : End Get
Ligne 33 : Set(ByVal Value As String)


donc dans le user controle, je ne comprend toujours pas par contre ...

Je n'y comprend rien, je travaille avec un bouquin a coté et je ne vois pas
ou je me trompe!!!

A l'aide merci.

5 réponses

Avatar
Zazar
(snip code)

Je n'y comprend rien, je travaille avec un bouquin a coté et je ne vois


pas
ou je me trompe!!!



Il aurait fallu aussi avoir le code de la page .aspx aussi pour mieux
comprendre.
Je suppose que dans la page.aspx vous n'avez absolument aucune réfèrence à
MonControle et que vous voulez le charger dynamiquement.
Si c'est bien le cas :
1) Ce n'est pas la peine de déclarer MonControle protected, private suffit.
2 ) La première exception est due au fait qu'à aucun moment vous
n'instanciez votre contrôle, MonControle vaut donc nothing
3) La deuxième exception est du à votre manière d'instancier le controle. Si
vous faîtes new WebUserControl1(), vous obtenez effectivement un objet de
type WebUserControl1() (exactement de ce type, pas un type dérivé). Or dans
cette classe, la variable TextBox1 n'est pas initilialisée (elle vaut
nothing). Par contre, si vous faisiez un
Page.LoadControl("WebUserControl1.ascx"), alors .NET aurait créé un objet de
type "WebUserControl1.Ascx" qui hérite de WebUserControl1 et qui initialise
TextBox1. Oui je sais, vous ne voulez pas utiliser Page.LoadControl().

Pour répondre à votre question originale, c'est envisageable en compilant du
code à la volée :

Pour cela, il vous suffit de créer votre contrôle utilisateur exactement
comme vous l'auriez créé pour le mettre dans une bibliothèque de contrôles,
puis de stocker le code de ce contrôle dans votre base de données. Lorsque
vous avez besoin du contrôle, vous récupérez son code, vous le compilez dans
un Assembly en mémoire, vous faîtes un peu de réflection sur cet Assembly
pour instancier le contrôle et le tour est joué. Si votre bouquin n'explique
pas comment compiler du code ou comment créer des Contrôles Web ou encore
comment faire de la reflection, vous connaissez les forums où poser vos
questions :)

Bon courage.

--
Zazar
Avatar
Sébastien Delestre
Merci de vous penchez sur mon problème :

Il aurait fallu aussi avoir le code de la page .aspx aussi pour mieux
comprendre.



Le voici en entier :
Public Class WebForm1

Inherits System.Web.UI.Page

Protected WithEvents Button1 As System.Web.UI.WebControls.Button

Protected WithEvents Label1 As System.Web.UI.WebControls.Label

Protected WithEvents MonControle As UserControl.WebUserControl1

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub


Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init

'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form

'Ne le modifiez pas en utilisant l'éditeur de code.

InitializeComponent()

End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

'Placez ici le code utilisateur pour initialiser la page

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Label1.Text = MonControle.nom

End Sub

End Class

#######################################"

il y a quand meme quelque chose d'étrange, j'ai, dans une autre application,
un autre user control aussi simple qui lui fonctionne, j'ai beau les
regarder en long en large et en travers, je ne vois pas la différence entre
les fichiers de mes 2 applications

Les solutions que vous me proposez ne me conviennent donc pas (ne m'en
voulez pas), je voudrais que ca marche, tout simplement comme mon autre
appli.



"Zazar" a écrit dans le message
de news:O$
(snip code)

> Je n'y comprend rien, je travaille avec un bouquin a coté et je ne vois
pas
> ou je me trompe!!!

Il aurait fallu aussi avoir le code de la page .aspx aussi pour mieux
comprendre.
Je suppose que dans la page.aspx vous n'avez absolument aucune réfèrence à
MonControle et que vous voulez le charger dynamiquement.
Si c'est bien le cas :
1) Ce n'est pas la peine de déclarer MonControle protected, private


suffit.
2 ) La première exception est due au fait qu'à aucun moment vous
n'instanciez votre contrôle, MonControle vaut donc nothing
3) La deuxième exception est du à votre manière d'instancier le controle.


Si
vous faîtes new WebUserControl1(), vous obtenez effectivement un objet de
type WebUserControl1() (exactement de ce type, pas un type dérivé). Or


dans
cette classe, la variable TextBox1 n'est pas initilialisée (elle vaut
nothing). Par contre, si vous faisiez un
Page.LoadControl("WebUserControl1.ascx"), alors .NET aurait créé un objet


de
type "WebUserControl1.Ascx" qui hérite de WebUserControl1 et qui


initialise
TextBox1. Oui je sais, vous ne voulez pas utiliser Page.LoadControl().

Pour répondre à votre question originale, c'est envisageable en compilant


du
code à la volée :

Pour cela, il vous suffit de créer votre contrôle utilisateur exactement
comme vous l'auriez créé pour le mettre dans une bibliothèque de


contrôles,
puis de stocker le code de ce contrôle dans votre base de données. Lorsque
vous avez besoin du contrôle, vous récupérez son code, vous le compilez


dans
un Assembly en mémoire, vous faîtes un peu de réflection sur cet Assembly
pour instancier le contrôle et le tour est joué. Si votre bouquin


n'explique
pas comment compiler du code ou comment créer des Contrôles Web ou encore
comment faire de la reflection, vous connaissez les forums où poser vos
questions :)

Bon courage.

--
Zazar




Avatar
Sébastien Delestre
J'ai trouvé !!!!

Dans ma page ASPX, j'avais :

<WebUserControl1:WebUserControl1 id="WebUserControl11"
runat="server"></WebUserControl1:WebUserControl1>

or dans mon ASPX.VB, j'avais

Protected WithEvents MonControle As UserControl.WebUserControl1

et j'utilisais

Label1.Text = MonControle.nom

J'ai donc essayé ceci (reprendre l'ID du controle comme il est dans la page
ASPX) soit :

Protected WithEvents WebUserControl11 As UserControl.WebUserControl1
et donc

Label1.Text = WebUserControl11.nom

et maintenant ca marche. Le hic c'est qu'il ne me semble pas avoir lu cela
quelque part. Et vous ?

Merci à ceux qui ont au moins lu mon appel à l'aide.
Avatar
Zazar
> Dans ma page ASPX, j'avais :

<WebUserControl1:WebUserControl1 id="WebUserControl11"
runat="server"></WebUserControl1:WebUserControl1>

or dans mon ASPX.VB, j'avais

Protected WithEvents MonControle As UserControl.WebUserControl1

et j'utilisais

Label1.Text = MonControle.nom

J'ai donc essayé ceci (reprendre l'ID du controle comme il est dans la


page
ASPX) soit :

Protected WithEvents WebUserControl11 As UserControl.WebUserControl1
et donc

Label1.Text = WebUserControl11.nom



C'est pour ça que je vous demandais le code votre page .aspx. Sans celui-ci
j'avais du faire une hypothèse qui ne s'est qu'en partie vérifiée :).

et maintenant ca marche. Le hic c'est qu'il ne me semble pas avoir lu cela
quelque part. Et vous ?



C'est tout à fait normal. Le lien entre la page .aspx et le code-behind ne
se fait pas par magie :

Dans le code-behind, vous définissez une classe qui contient des membres
protégés.
Dans la page.aspx vous définissez une classe qui hérite de la précédente et
vous faîtes des new sur ses membres protégés.
Quand dans la page .aspx, vous écrivez <asp:moncontrol id="nomduncontrol"
runat=server /> vous déclarez dans la classe fille un membre qui s'appelle
nomduncontrol de type moncontrol. Si ce membre existe dans la classe parent
alors vous lui affectez simplement une instance de moncontrol, sinon vous
définissez un nouveau membre à la classe fille.
Est-ce un peu plus clair ?

--
Zazar
Avatar
Sébastien Delestre
Merci pour ces éclaircissements.


"Zazar" a écrit dans le message
de news:

> Dans ma page ASPX, j'avais :
>
> <WebUserControl1:WebUserControl1 id="WebUserControl11"
> runat="server"></WebUserControl1:WebUserControl1>
>
> or dans mon ASPX.VB, j'avais
>
> Protected WithEvents MonControle As UserControl.WebUserControl1
>
> et j'utilisais
>
> Label1.Text = MonControle.nom
>
> J'ai donc essayé ceci (reprendre l'ID du controle comme il est dans la
page
> ASPX) soit :
>
> Protected WithEvents WebUserControl11 As UserControl.WebUserControl1
> et donc
>
> Label1.Text = WebUserControl11.nom

C'est pour ça que je vous demandais le code votre page .aspx. Sans


celui-ci
j'avais du faire une hypothèse qui ne s'est qu'en partie vérifiée :).

> et maintenant ca marche. Le hic c'est qu'il ne me semble pas avoir lu


cela
> quelque part. Et vous ?

C'est tout à fait normal. Le lien entre la page .aspx et le code-behind ne
se fait pas par magie :

Dans le code-behind, vous définissez une classe qui contient des membres
protégés.
Dans la page.aspx vous définissez une classe qui hérite de la précédente


et
vous faîtes des new sur ses membres protégés.
Quand dans la page .aspx, vous écrivez <asp:moncontrol id="nomduncontrol"
runat=server /> vous déclarez dans la classe fille un membre qui s'appelle
nomduncontrol de type moncontrol. Si ce membre existe dans la classe


parent
alors vous lui affectez simplement une instance de moncontrol, sinon vous
définissez un nouveau membre à la classe fille.
Est-ce un peu plus clair ?

--
Zazar