| auteur : David Pedehourcq |
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 :
Private Sub Page_Load (ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles MyBase. Load
If not Page. IsPostBack Then
End If
End Sub
|
L'érreur fréquement comise est d'oublier le "If not page.IsPostBack then" quand vous sélectionnez un objet de la dropdownlist, la page se
recharge en fesant un postback, donc repasse par le "Page_Load et reinitialise votre dropdownlist. On spécifie donc qu'il ne faut pas
reinitialiser la dropdownlist en cas de PostBack et on récupèrera ainsi la valeur sélectionnée.
|
| auteur : David Pedehourcq |
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
Protected WithEvents PlaceHolder1 As PlaceHolder
Private Sub Page_Load (ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles MyBase. Load
Dim monlabel As New Label
PlaceHolder1. controls . add (monlabel)
End Sub
|
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.
|
| auteur : Pharaonix |
Il convient d'utiliser un RegularExpressionValidator pour vérifier la strucuture
de la chaîne:
< asp : RegularExpressionValidator
id = " RegularExpressionValidator "
runat = " server "
Display = " Static "
ControlToValidate = " NsAd1 "
ValidationExpression = " ( [ 0 - 2 ] ? [ 0 - 9 ] ? [ 0 - 9 ] \ . ) { 3 } [ 0 - 2 ] ? [ 0 - 9 ] ? [ 0 - 9 ] " >
< / asp : RegularExpressionValidator >
|
|
| auteur : Didier Danse |
Les RequiredFieldValidator effectue ses vérifications lors de chaque envoi au serveur.
Dans le cas d'un bouton "Annuler" ou "Précédent", cela est un peu embêtant puisque
les données ne seront certainement pas correctes et la page ne sera donc pas envoyée
au serveur.
Pour résoudre cela, il suffit de mettre la propriété CausesValidation du bouton à
false.
< asp : Button id = " button1 " runat = " server " CausesValidation = " false " / >
|
|
| auteur : Didier Danse |
On a parfois besoin d'envoyer des informations telles que du xml, html ou tout autre chose
contenant <...>. Par défaut, asp.NET refuse l'envoi de ces tags et l'informe par l'intermédiaire
d'une exception qui signale que, par mesure de sécurité, il est interdit d'envoyer de telles choses au
serveur. Effectivement, en autorisant cet envoi, il serait possible d'injecter du javascript par exemple.
Pour permettre l'envoi de ces informations, il est nécessaire de mettre validateRequest="false" dans la
directive "Page".
Une fois ces informations envoyées, il faut encore précisé au serveur qu'il ne doit pas les interpréter
mais bien garder cela comme du texte. Ceci se fait par l'intermédiaire de
Dim html As String = Server . HtmlEncode (TextBox1. Text )
|
|
| auteur : Xavier Talour |
Pour effectuer une action sur chaque ligne d'un "texte" encodé dans un TextBox:
For Each line As String In TextBox1. Lines
Response . Write (line)
Next
|
|
| auteur : Didier Danse |
Il arrive fréquemment que l'on remplisse une DropDownList avec les valeurs qui
sont à afficher. Par contre, les valeurs sont souvent oubliées lors de cette initialisation.
Si l'initialisation se fait à l'aide d'un DataSet, rien de plus simple, il suffit de
spécifier quel est le champ qui permettra de récupérer la valeur:
NomDropDownList. DataSource = DbTemplate. GetCategories
NomDropDownList. DataTextField = " champ_a_afficher "
NomDropDownList. DataValueField = " champ_valeur "
NomDropDownList. DataBind
|
Si l'initialisation se fait par l'ajout manuel d'Items, il suffit de créer des Items
en spécifiant les deux valeurs.
Dim li As ListItem = New ListItem
li. Text = " texte "
li. Value = " valeur "
NomDropDownList. Items . Add (li)
|
|
| auteur : Didier Danse |
Si l'on souhaite changer la police (la taille par exemple), il est nécessaire
d'utiliser un style. Ce style est défini de la manière suivante:
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
|
Il ne reste plus qu'à l'appliquer au Label par
label1. ApplyStyle (monstyle)
|
|
| auteur : Didier Danse | Vous pouvez ajouter un Item directement en utilisant Items.Add. Le premier paramètre correspond à l'emplacement (en l'occurrence 0) :
ddl. Items . insert (0," mon texte " )
|
Cependant, cette solution ne fait qu'afficher un texte. Si vous souhaitez passer un texte ainsi que la valeur correspondante, il est nécessaire d'utiliser un objet ListItem :
Dim li as ListItem= New ListItem (" mon texte " , " ma valeur " )
ddl. Items . Insert (0, li)
|
|
| auteur : nico-pyright(c) | Imaginons un asp:checkbox et une fonction javascript cliente qui affiche si la case est cochée ou non.
On pourrait etre tenté de faire :
< asp:CheckBox runat= " server " Text= " Cochez moi " onchange= " alert(this.checked); " / >
|
sauf que ceci ne va pas marcher, en effet asp.net génère :
< span onchange= " alert(this.checked); " > < input id= " ctl02 " type= " checkbox " name= " ctl02 " / > < label for = " ctl02 " > Cochez moi< / label> < / span> >
|
on se rend compte que le onchange est appliqué au span.
Comment faire alors pour agir sur l'input de type checkbox ?
il faudra passer par le code behind :
MonCheckbox. InputAttributes . Add (" onchange " , " alert(this.checked); " )
|
et cette fois-ci, asp.net génèrera :
< input id= " MonCheckbox " type= " checkbox " name= " MonCheckbox " onchange= " alert(this.checked); " / > < label for = " MonCheckbox " > Cochez moi< / label>
|
NB : les attributs du label seront accessibles grace à LabelAttributes
|
| auteur : nico-pyright(c) | Il peut arriver qu'on ait besoin de faire un filtre sur une datasource de repeater mais qu'on ne puisse pas toujours filtrer cette source en amont. Dans ce cas, on peut très bien faire notre filtre au moment où le repeater se construit.
Soit un repeater tout bete :
< asp:Repeater runat= " server " ID= " MonRepeater " OnItemDataBound= " ItemDataBound " >
< ItemTemplate>
< asp:Label runat= " server " Text= " <%#Container.DataItem %> " / >
< / ItemTemplate>
< / asp:Repeater>
|
MonRepeater. DataSource = New Integer () {1, 2, 3, 4, 5, 6, 7}
MonRepeater. DataBind ()
|
Il suffit d'agir sur le ItemDataBound et de masquer l'élément.
Ici par exemple, je n'affiche que les nombres impairs :
Protected Sub ItemDataBound (ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
If e. Item . DataItem Mod 2 = 0 Then
e. Item . Visible = False
End If
End Sub
|
Une autre solution est d'intervenir au moment du databinding
< asp:Repeater runat= " server " ID= " MonRepeater " OnDataBinding= " DataBindingRepeater " >
Protected Sub DataBindingRepeater (ByVal sender As Object, ByVal e As EventArgs)
Dim r As Repeater = sender
r. DataSource = Array . FindAll (Of Integer)(r. DataSource , AddressOf filtre)
End Sub
Public Function filtre (ByVal i As Integer) As Boolean
Return i Mod 2 < > 0
End Function
|
|
| auteur : nico-pyright(c) | Une manière très simple de récupérer des valeurs d'une page à l'autre est d'utiliser Server.Transfert qui permet de terminer l'exécution de la page courante et d'enchainer sur une nouvelle page.
Cela peut s'utiliser comme ca :
< TextBox ID= " MonTxtBox " runat= " server " / >
< asp:LinkButton runat= " server " OnClick= " ClickLien " Text= " Changer de page " / >
|
Protected Sub ClickLien (ByVal sender As Object, ByVal e As EventArgs)
Server . Transfer (" ~/Page2.aspx " )
End Sub
|
L'avantage de cette utilisation est qu'on peut aisément récupérer la valeur de notre textbox par exemple dans la Page2, en utilisant la propriété PreviousPage et en la castant avec le bon type.
En imaginant que la page expose une propriété publique de ce genre,
Public Function GetValue () As String
Return MonTxtBox. Text
End Function
|
on pourra faire par exemple dans le OnLoad de la Page2
MonLabel. Text = CType (PreviousPage, _Default). GetValue ()
|
Ceci permet également de faire transiter des objets plus complexes que des strings. Imaginons que dans ma première page j'ai construit une collection de liste de chaipakoi, il sera alors très simple de cette facon de la faire transiter jusqu'à la page suivante.
Asp.Net 2.0 ajoute la notion de cross page posting, à savoir que l'exemple ci-dessous pourra se transformer en :
< asp:LinkButton runat= " server " PostBackUrl= " ~/Page2.aspx " Text= " Changer de page " / >
|
Notez la propriété PostBackUrl qui nous enlève la gestion du Server.Transfert et qui évite de faire une étape intermédiaire en repassant par la page Default. Nous sommes également déchargé de la gestion du handler sur le click de bouton.
Toutefois, l'utilisation de la propriété PreviousPage dans la Page2 nous fait repasser dans le OnInit, OnLoad... de la page Default. On pourra éventuellement contrôler les actions à y effectuer en testant la propriété IsCrossPagePostBack qui indiquera si nous sommes en train de faire un cross page posting.
Les deux concepts sont quasiments équivalent.
Une différence majeure est que dans le cas de l'utilisation de Server.Transfert, le navigateur n'est pas au courant du transfer, et un effet visible sera que l'url reste inchangée.
Dans le cas d'un cross page, l'url sera la bonne.
NB : il pourra être intéressant d'effectuer quelques vérifications supplémentaires, notamment pour être bien sur que l'on récupère la page attendu comme PreviousPage, et transformer le basique cast du dessus en
Dim previousPage As _Default = previousPage
If Not previousPage Is Nothing Then
End If
|
PreviousPage peut être également fortement typée en rajoutant une directive dans la page destination.
< %@ PreviousPageType VirtualPath= " ~/Default.aspx " %>
|
ce qui fait que dans le codebehind, on aura plus besoin de cast et on pourra utiliser directement
MonLabel. Text = PreviousPage. GetValue ();
|
En fait, le designer nous surchage simplement la propriété :
Public Shadows ReadOnly Property PreviousPage () As WebApplication2. [Default ]
Get
Return CType (MyBase. PreviousPage , WebApplication2. [Default ])
End Get
End Property
|
Ce qui lèvera une exception si jamais on vient d'une autre page ...
|
| auteur : nico-pyright(c) | C'est un cas très fréquent lors de l'alimentation du contrôle dans le OnLoad (une dropdown par exemple). Il faut vérifier qu'on est pas dans un postback pour alimenter les données.
Protected Overrides Sub OnLoad (ByVal e As System. EventArgs )
If Not IsPostBack Then
End If
End Sub
|
|
Consultez les autres F.A.Q's
Les sources présentés sur cette pages sont libre de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Copyright ©2007
Developpez LLC. Tout droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de
l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans
de prison et jusqu'à 300 000 E de dommages et intérets.
Cette page est déposée à la SACD.
|