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
Sommaire→WebForms→Contrôles→Général- 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 FunctionAttention, 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 FunctionNous 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



