FAQ ASP.NET/C#
FAQ ASP.NET/C#Consultez toutes les FAQ
Nombre d'auteurs : 39, nombre de questions : 371, dernière mise à jour : 15 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 :
Bbouton.
Click +=
new
System.
EventHandler
(
MesBoutons_Click);
ensuite :
void
MesBoutons_Click
(
Object sender,
System.
EventArgs e)
{
//Récupération du bouton ayant déclenché l'événement
Button Btn;
Btn =
(
Button)sender;
//Traitement
}
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.
Cela peut être utilise si l'on a plein d'user contrôles ou de pages imbriquées de pouvoir retrouver un contrôle depuis un autre en fouillant récursivement tous les contrôles de la page.
public
static
Control RecursiveFindControl
(
Control controleSource,
string
idATrouver)
{
Control control =
controleSource.
FindControl
(
idATrouver);
if
(
control !=
null
)
return
control;
for
(
int
i =
0
;
i <
controleSource.
Controls.
Count ;
i++
)
{
control =
controleSource.
Controls[
i].
FindControl
(
idATrouver);
if
(
control ==
null
)
{
control =
RecursiveFindControl
(
controleSource.
Controls[
i],
idATrouver);
if
(
control !=
null
&&
string
.
Compare
(
control.
ID,
idATrouver,
StringComparison.
InvariantCultureIgnoreCase) ==
0
)
return
control;
}
else
return
control;
}
return
control;
}
Attention, utiliser une telle fonction trop tôt dans le cycle de vie de la page, 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
static
Control IterativeFindControl
(
Control controleSource,
string
idATrouver)
{
Control control =
controleSource;
Queue<
Control>
queue =
new
Queue<
Control>(
);
while
(
control !=
null
)
{
if
(
string
.
Compare
(
control.
ID,
idATrouver,
StringComparison.
InvariantCultureIgnoreCase) ==
0
)
return
control;
foreach
(
Control ctrl in
control.
Controls)
{
if
(
string
.
Compare
(
ctrl.
ID,
idATrouver,
StringComparison.
InvariantCultureIgnoreCase) ==
0
)
return
ctrl;
if
(
ctrl.
HasControls
(
))
queue.
Enqueue
(
ctrl);
}
control =
queue.
Dequeue
(
);
}
return
null
;
}
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 :
Style monstyle =
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