Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > Les webforms > Formulaires et code-behind
        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 contrôles à une page ?
        Comment créer dynamiquement des métas tags ?
        Comment capturer le clic d'un bouton créé dynamiquement ?
        Comment créer un bouton qui envoit le formulaire sans qu'il soit validé ?
        Comment vérifier la validité d'une adresse ip dans un TextBox?
        Comment empêcher un RequiredFieldValidator de fonctionner lors du clic sur un bouton?
        Pourquoi ai-je une erreur injection script?
        Comment lire un TextBox ligne par ligne?
        La propriété SelectedValue d'une DropDownList me renvoie Nothing, pourquoi?
        Comment modifier le font-name d'un label en code behind?
        Comment ajouter d'autres éléments que ceux d'une liste ?
        Lorsque j'agis sur les attributs d'un checkbox, c'est sur le span associé qu'est répercutée mon action
        Comment filtrer et masquer des éléments d'un repeater ?
        Comment passer des valeurs d'une page à une autre ... PostbackUrl, CrossPostBack et Server.Transfer
        Pourquoi je perds la valeur de mon contrôle lors d'un postback ?
        Comment savoir quel contrôle à déclenché le postback ?
        6.5.1. Dropdownlist (4)
                Comment insérer un élément dans une DropDownList à un emplacement donné?
                J'ai déclaré l'attribut OnChange sur ma DropDownList mais rien ne se passe lors d'un changement de valeur. Pourquoi?
                Parfois ma dropdownlist ne lève pas l'événement OnSelectedIndexChanged ou OnTextChanged, même si AutoPostBack='true', que faire ?
                Comment lever l'événement SelectedIndexChanged pour des DropDownList dans un Repeater lorsque le Viewstate est à false ?

precedent    sommaire    suivant   


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
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
       'code pour remplir la dropdownlist
    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.


Comment ajouter dynamiquement des contrôles à une page ?
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.


Comment créer dynamiquement des métas tags ?
auteur : David Pedehourcq
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 :

Protected languagePage As HtmlGenericControl 
Protected auteurPage As HtmlGenericControl
Protected classificationPage As HtmlGenericControl 
Protected descriptionPage As HtmlGenericControl
Protected keywordsPage As HtmlGenericControl
ensuite pour donner des valeurs aux métas tags :


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"

Comment capturer le clic d'un bouton créé dynamiquement ?
auteur : Déclic
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.


Comment créer un bouton qui envoit le formulaire sans qu'il soit validé ?
auteur : David Pedehourcq
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'éxé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


Comment vérifier la validité d'une adresse ip dans un TextBox?
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>

Comment empêcher un RequiredFieldValidator de fonctionner lors du clic sur un bouton?
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"/>

Pourquoi ai-je une erreur injection script?
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)

Comment lire un TextBox ligne par ligne?
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
' Traitement
Response.Write(line)
Next

La propriété SelectedValue d'une DropDownList me renvoie Nothing, pourquoi?
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)

Comment modifier le font-name d'un label en code behind?
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)

Comment ajouter d'autres éléments que ceux d'une liste ?
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)
		
		

Lorsque j'agis sur les attributs d'un checkbox, c'est sur le span associé qu'est répercutée mon action
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


Comment filtrer et masquer des éléments d'un repeater ?
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
	

Comment passer des valeurs d'une page à une autre ... PostbackUrl, CrossPostBack et Server.Transfer
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 ...


Pourquoi je perds la valeur de mon contrôle lors d'un postback ?
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
		' code à placer pour alimenter le contrôle
	End If
End Sub

	

precedent    sommaire    suivant   

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.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com