FAQ ASP.NET/VB.NET
FAQ ASP.NET/VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 38, nombre de questions : 369, dernière mise à jour : 16 juin 2021
- Comment capturer le clic d'un bouton créé dynamiquement ?
- Comment modifier l'ordre de défilement des WebControls quand on appuie sur la touche TAB ?
- Comment trouver un contrôle dans une page récursivement ?
- Comment changer le font d'un webcontrol en code-behind ?
- Comment lier une css à un WebUserControl ?
- Comment permettre à deux webparts d'échanger des informations?
- Je n'utilise pas le code-behind et il ne trouve pas un objet se trouvant dans ma page, pourquoi ?
- Je reçois une NullReferenceException, quelle en est la cause ?
Dans la procédure de création du bouton on ajoute :
AddHandler
Bbouton.Click
, AddressOf
MesBoutons_Click
ensuite :
Sub
MesBoutons_Click
(
ByVal
sender As
Object
, ByVal
e As
System.EventArgs
)
'Récupération du bouton ayant déclenché l'événement
Dim
Btn As
Button
Btn =
Ctype
(
sender,Button)
'Traitement
...
End
Sub
ATTENTION :Lors du postback éffectué aprés l'évènement, le bouton doit impérativement être rechargé dans la page pour que l'évènement soit traité. Quitte à mettre sa propriétée visible à false si vous ne voulez pas qu'il soit visible.
Quand on appuie sur la touche TAB du clavier, on fait défiler les différents éléments du formulaire en faisant changer le focus d'élément. Mais la plupart du temps, en aspx le défilement des WebControls ne se fait pas dans l'ordre souhaité.
Par défaut, le focus fait défiler les WebControls dans l'ordre dans lequel ils sont déclarés dans la page aspx.
Si vous voulez vous même choisir l'ordre de défilement de vos WebControls, il faut donner une valeur à la propriété "TabIndex" de votre WebControl. Par exemple un WebControl avec un TabIndex=1 sera selectionné au deuxième appui sur la touche TAB.
Il suffit de parcourir les fils d'un contrôle source récursivement.
Public
Function
RecursiveFindControl
(
ByVal
controleSource As
Control, ByVal
idATrouver As
String
) As
Control
Dim
control As
Control =
controleSource.FindControl
(
idATrouver)
If
Not
control Is
Nothing
Then
Return
control
End
If
Dim
i As
Integer
For
i =
0
To
controleSource.Controls.Count
-
1
control =
controleSource.Controls
(
i).FindControl
(
idATrouver)
If
control Is
Nothing
Then
control =
RecursiveFindControl
(
controleSource.Controls
(
i), idATrouver)
If
Not
control Is
Nothing
And
control.ID.ToLower
(
) =
idATrouver.ToLower
(
) Then
Return
control
End
If
Else
Return
control
End
If
Next
Return
control
End
Function
Attention, utiliser une telle fonction trop tôt peut appeler prématurément la méthode CreateChildControl sur le contrôle parcouru, ce qui peut avoir des effets indésirables.
Ci-dessous, vous trouverez sa version en itératif, qui améliore les performances :
Public
Shared
Function
IterativeFindControl
(
ByVal
controleSource As
Control, ByVal
idATrouver As
String
) As
Control
Dim
control As
Control =
controleSource
Dim
queue As
New
Queue
(
Of
Control)
While
Not
control Is
Nothing
If
String
.Compare
(
control.ID
, idATrouver, StringComparison.InvariantCultureIgnoreCase
) =
0
Then
Return
control
End
If
For
Each
ctrl As
Control In
control.Controls
If
String
.Compare
(
ctrl.ID
, idATrouver, StringComparison.InvariantCultureIgnoreCase
) =
0
Then
Return
ctrl
End
If
If
ctrl.HasControls
(
) Then
queue.Enqueue
(
ctrl)
End
If
Next
control =
queue.Dequeue
(
)
End
While
Return
Nothing
End
Function
Nous allons ici utiliser un label, mais le code est valable pour les autres webcontrols.
Le piège dans cette question est que la propriété "font" du label est en lecture seule !!!
Il faut en fait passer par un style, un exemple :
Dim
monstyle As
New
Style
monstyle.BorderColor
=
Color.Blue
monstyle.BackColor
=
Color.Black
monstyle.ForeColor
=
Color.Blue
monstyle.Font.Name
=
"Verdana"
monstyle.Font.Size
=
20
Lable1.ApplyStyle
(
monstyle)
Par défaut, le webuser control a accès à la css de la page dans laquelle il est inclus. L'intérêt est que le webuser control s'adapte parfaitement aux différentes pages dans lesquelles il est placé.
Cependant, si vous souhaitez quand même lier une css "spécifique" à un webuser control, il vous suffit d'ajouter dans la css :
<LINK rel
=
stylesheet type
=
"text/css"
href
=
"styles.css"
>
attention : si vous liez une css au webuser control faites attention d'utiliser des classes de css différentes que celles de la css des pages dans lesquelles vous allez inclure le webuser control.
Lien : Partie css de la FAQ html
Prenons un exemple concret pour illustrer cette réponse. Ainsi, imaginons que l'on utilise deux User Controls dans une WebPartZone:
<asp:WebPartZone ID
=
"wpzGauche"
runat
=
"server"
BorderColor
=
"#CCCCCC"
Font-Names
=
"Verdana"
Padding
=
"6"
Width
=
"100%"
>
<ZoneTemplate>
<uc1:searchResults ID
=
"SearchResults1"
runat
=
"server"
/>
<uc1:searchCriterias ID
=
"SearchCriterias1"
runat
=
"server"
/>
</ZoneTemplate>
</asp:WebPartZone>
Ensuite, il suffit d'ajouter un WebPartManager et de définir une connexion statique. Cette connexion prendra comme paramètres les ID du U.C. producteur et celui du consommateur. Ainsi, lors de l'envoi d'une information par le producteur, le consommateur est averti et peut utiliser cette même information.
<asp:WebPartManager ID
=
"WebPartManager1"
runat
=
"server"
>
<StaticConnections>
<asp:WebPartConnection ID
=
"connectionSearch"
ConsumerID
=
"SearchResults1"
ProviderID
=
"SearchCriterias1"
/>
</StaticConnections>
</asp:WebPartManager>
Bien qu'il ne faut pas déclarer l'objet dans son code (je précise: "je n'utilise pas le code-behind"), la raison la plus probable est l'oubli du runat="server" dans la définition de l'objet dans votre page.
Lorsque l'on utilise la technique du Code-Behind, il faut lier les différents
contrôles de la page .aspx avec le code.
Si une NullReferenceException est lancée, cela peut être dû à:
- les noms ne correspondent pas entre la page .aspx et le code-behind
- la variable dans le code est déclarée comme étant privée
- le contrôle n'a pas la propriété runat=server