FAQ ASP.NET / Delphi.NET
FAQ ASP.NET / Delphi.NETConsultez toutes les FAQ
Nombre d'auteurs : 15, nombre de questions : 90, dernière mise à jour : 16 juin 2021
- Ma dropdownlist est bien remplie, mais quand je sélectionne un item, c'est toujours la première valeur de la liste qui est retournée
- Comment ajouter dynamiquement des controles à une page ?
- Comment créer dynamiquement des métas tags ?
- Comment changer le font d'un webcontrol en code-behind ?
- Comment lier une css à un webuser control ?
- Comment capturer le clic d'un bouton créé dynamiquement ?
- Comment créer un bouton qui envoit le formulaire sans qu'il soit validé ?
- Comment forcer la saisie en majuscule dans une textbox ?
- Comment centrer un texte à l'intérieur d'un label ?
- Comment lier un Calendar à une Css ?
- Comment formater une date pour l'affichage ?
Ce problème est très récurent. Dans 99% des cas le problème vient du postback : Si vous remplissez votre dropdownlist dans le "Page_Load" de votre page, le code correct est :
procedure
TWebForm1.Page_Load(sender: System.Object
; e: System.EventArgs);
begin
if
not
IsPostBack then
begin
// code pour remplir la dropdownlist
end
;
end
;
L'erreur fréquemment commise est d'oublier le "If not page.IsPostBack then" quand vous sélectionnez un objet de la dropdownlist, la page se recharge en faisant un postback, donc repasse par le "Page_Load et réinitialise votre dropdownlist. On spécifie donc qu'il ne faut pas réinitialiser la dropdownlist en cas de PostBack et on récupèrera ainsi la valeur sélectionnée.
Afin de voir comment on ajoute dynamiquement un webcontrol à une page, nous allons prendre un exemple simple : ajouter un label à une
page aspx.
Dans la page aspx, on ajoute un PlaceHolder :
<asp:PlaceHolder id
=
"PlaceHolder1"
runat
=
"server"
></asp:PlaceHolder>
dans le code-behind
procedure
TWebForm1.Page_Load(sender: System.Object
; e: System.EventArgs);
var
monlabel : System.Web.UI.WebControls.Label
;
begin
monlabel := Label
.Create() ;
PlaceHolder1.controls.add(monlabel) ;
end
;
Vous avez là le code minimal pour ajouter un contrôle dynamiquement à une page aspx. Vous pouvez ensuite jouer sur les différentes propriétés et méthodes du webcontrol pour l'initialiser comme vous souhaitez.
Nous allons voir dans cet exemple qu'il est très facile de créer dynamiquement des métas tags en ASP.NET dans le head de la page aspx :
<meta http-equiv
=
"Content-Language"
id
=
"languagePage"
runat
=
"server"
/>
<meta name
=
"Author"
id
=
"auteurPage"
runat
=
"server"
/>
<meta name
=
"Classification"
id
=
"classificationPage"
runat
=
"server"
/>
<meta name
=
"Description"
id
=
"descriptionPage"
runat
=
"server"
/>
<meta name
=
"keywords"
id
=
"keywordsPage"
runat
=
"server"
/>
dans le code-behind on déclare :
Private
languagePage : HtmlGenericControl ;
auteurPage : HtmlGenericControl ;
classificationPage : HtmlGenericControl ;
descriptionPage : HtmlGenericControl ;
keywordsPage : HtmlGenericControl ;
ensuite pour donner des valeurs aux métas tags :
languagePage := Page.FindControl('languagePage'
) as
HtmlGenericControl ;
auteurPage := Page.FindControl('auteurPage'
) as
HtmlGenericControl ;
classificationPage := Page.FindControl('classificationPage'
) as
HtmlGenericControl ;
descriptionPage := Page.FindControl('descriptionPage'
) as
HtmlGenericControl ;
keywordsPage := Page.FindControl('keywordsPage'
) as
HtmlGenericControl ;
languagePage.Attributes('content'
) := 'fr'
;
auteurPage.Attributes('content'
) := 'neo.51'
;
classificationPage.Attributes('content'
) := 'developpement'
;
descriptionPage.Attributes('content'
) := 'FAQ ASP.NET'
;
keywordsPage.InnerText := 'asp.net, vb.net, FAQ'
;
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 :
var
monstyle : Style ;
monstyle := Style.Create() ;
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
Dans la procédure de création du bouton on ajoute :
Include(Self
.Button1.Click, Self
.MesBoutons_Click1) ;
ensuite :
procedure
TWebForm1.MesBoutons_Click1(sender: System.Object
; e: System.EventArgs);
var
Btn : Button ;
begin
Btn := sender as
Button ;
// Traitement
...
end
;
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é visible à false si vous ne voulez pas qu'il soit visible.
On crée souvent un bouton "Précédent" ou "réinitialiser" dans ses pages web. Pourtant quand on clique sur ces boutons, les traitements qui lui sont associés
doivent s'exécuter, même si le formulaire n'est pas validé par les validators.
Il suffit de mettre dans les propriétés de votre bouton : CausesValidation=false
Dans le Page_Load de la page aspx on ajoute :
TextBox1.Attributes.Add('OnKeyUp'
,'this.value=this.value.toUpperCase()'
) ;
<asp:label id
=
"Labelcentre"
Width
=
"100%"
>
<p align
=
"center"
>
Label centre</p></asp:label>
Ou en code behind :
labelcentre.Text := '<p align="center">Label centre</p>'
;
Lorsque l'on passe par le designer de Delphi.NET (et je suppose que c'est sensiblement pareil pour les autres IDE) lorsqu'on paramètre l'aspect de son Calendar, on paramètre en fait plusieurs styles. Par exemple, voici un Calendar ou j'ai personnalisé les styles :
<asp:calendar id
=
"Calendar1"
runat
=
"server"
Width
=
"47px"
Height
=
"40px"
>
<TodayDayStyle Font-Names
=
"Arial"
Font-Bold
=
"True"
ForeColor
=
"Red"
></TodayDayStyle>
<SelectorStyle Font-Names
=
"Arial"
></SelectorStyle>
<DayStyle Font-Names
=
"Arial"
ForeColor
=
"#006600"
></DayStyle>
<NextPrevStyle Font-Names
=
"Arial"
ForeColor
=
"White"
BorderColor
=
"#000600"
BackColor
=
"#006600"
></NextPrevStyle>
<DayHeaderStyle Font-Names
=
"Arial"
ForeColor
=
"White"
BorderColor
=
"#006600"
BackColor
=
"#006600"
></DayHeaderStyle>
<SelectedDayStyle Font-Names
=
"Arial"
></SelectedDayStyle>
<TitleStyle Font-Names
=
"Arial"
ForeColor
=
"White"
BorderColor
=
"#006600"
BackColor
=
"#006600"
></TitleStyle>
<WeekendDayStyle Font-Names
=
"Arial"
></WeekendDayStyle>
<OtherMonthDayStyle Font-Names
=
"Arial"
ForeColor
=
"#006600"
BorderColor
=
"White"
BackColor
=
"White"
></OtherMonthDayStyle>
</asp:calendar>
Le soucis est que si votre application utilise plusieurs Calendar il faut soit faire du copier coller soit recréer tous les styles. On peut pourtant lier le Calendar à une Css. Plus exactement on peu lier chaque style à une classe Css. Par exemple, juste pour le DayHeaderStyle
:
On déclare le calendar :
<asp:calendar id
=
"Calendar1"
runat
=
"server"
Width
=
"47px"
Height
=
"40px"
>
<DayHeaderStyle CssClass
=
"MyDayHeaderStyle"
></DayHeaderStyle>
</asp:calendar>
Dans votre Css :
.MyDayHeaderStyle
{
background-color:
#006600
;
/* BackColor */
border-color:
#006600
;
/* BorderColor */
color:
White
;
/* ForeColor */
font-family:
Arial;
/* Font */
}
On fait de même avec tous les autres styles du Calendar.
ATTENTION : L'objet calendar a un comportement étrange lorsqu'on applique une Css sur des liens (les jours, mois suivant, mois précédent). Afin de s'assurer que les liens du calendar respectent la Css, il faut spécifier une règle sur la Css, par exemple :
TD.OtherMonthDayStyle
A
{
font-family :
Arial ! important;
color:
#006600
! important;
}
Les styles affectés par ce comportement étrange du calendar et nécessitants ce type de classe Css sont :
- OtherMonthDayStyle
- TodayStyle
- NextPrevStyle
Rien de tel qu'un exemple concret pour voir comment formater une date pour l'affichage :
var
dt : DateTime ;
dt = DateTime.Create(1978
,5
,18
) ;
dt.ToString(param) ;
Voici les différents résultats que l'on obtient suivant la valeur de param :
Et pour les formats personnalisés:
- d : jour 1 à 31
- dd : jour 01 à 31.
- ddd : abr d'un jour ex: sam. pour samedi
- dddd : nom complet du jour
- M : mois 1 à 12
- MM : mois 01 à 12
- MMM : abr d'un moi ax:jan. pour janvier
- MMMM : nom complet du mois
- y : année 1 à 99
- yy : année 01 à 99
- yyy : année 1 à 9999
- h : heure 0 à 11
- hh : heure 00 à 11
- H : heure 0 à 23
- HH : heure 00 à 23
- m : minutte 0 à 59
- mm : minutte 00 à 59
- s : seconde 0 à 59
- ss : seconde 00 à 59
- "d" : 18/5/1978"
- "D" : "jeudi 15 mai 1978"
- "f" : "jeudi 15 mai 1978 08:05"
- "F" : "jeudi 15 mai 1978 08:05:01"
- "g" : "18/5/1978 08:05"
- "G" : "18/5/1978 08:05:01"
- "M" : "18 mai"
- "R" : Date GMT en anglais --> Thu, 14 may 1978 09:05:01 GMT
- "s" : Date pour les tris --> 1978-05-18T09:05:01
- "t" : "08:05"
- "T" : "08:05:01"
- "u" : même chose que s mais en temp GMT
dt.ToString('dddd, le d MM yyyy'
) ;
Donnera : Jeudi, le 18 05 1978
Lien : Comment n'afficher que l'heure d'une champ type DateTime dans un datagrid ?