Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment récupérer les valeurs d'un CheckBoxList ?

8 réponses
Avatar
Gilbert Tordeur
Bonjour,

J'utilise pour la première fois des CheckBoxList. Je la déclare ainsi :

<%@ Page Language="VB" MasterPageFile="~/FinCauM00.master"
AutoEventWireup="false"
CodeFile="FinCau025.aspx.vb" Inherits="FinCau025" Title="Recherche des
demandes"
Culture="fr-FR" MaintainScrollPositionOnPostback="False"
EnableViewState="True" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
Runat="Server">
<h1>Recherche des demandes de caution bancaire</h1>
<h2>Critères de recherche</h2>
<table>
<tr>
<td align="left" valign="top">
<asp:CheckBoxList ID="ChlSociete" runat="server">
</asp:CheckBoxList>
</td>
<td align="left" valign="top">
<asp:CheckBoxList ID="ChlBu" runat="server">
</asp:CheckBoxList>
</td>
<td align="left" valign="top">
<asp:CheckBoxList ID="ChlEtat" runat="server">
</asp:CheckBoxList>
</td>
</tr>
<tr>
<td align="center" colspan="3">
<input id="BtnReset" type="reset" value="Reset"
/>&nbsp;&nbsp;&nbsp;&nbsp;
<input id="BtnRechercher" type="submit" value="Rechercher" />
</td>
</tr>
</table>
etc...
</asp:Content>


Les CheckBoxList sont garnies par programmation, comme ceci :

If Not IsPostBack Then
For i As Integer = 0 To ListeTriee.Count - 1
ChlSociete.Items.Add(New ListItem(ListeTriee.Keys(i),
ListeTriee.Values(i)))
Next
ChlSociete.SelectedValue =
ObjSessionFinCau000.CurrentLegalEntityId.ToString
End If


Mon problème est le suivant : après un clic sur le bouton Rechercher, le
programme doit déterminer quelles cases sont cochées. Or, ChlSociete est
vide ! (les autres aussi.). J'ai pourtant positionné EnableViewState="True"
sur la page. Y a-t-il une erreur de détail, ou bien n'ai-je encore rien
compris au fonctionnement d'asp.net ?

Et quelle est la solution ?

Merci d'avance,
Gilbert.

8 réponses

Avatar
Jérémy Jeanson
Bonjour Gilbert,

Pourquoi n'utiliserais tu pas plutôt une méthode d'alimentation plus
convnetionnelle de tes control via le dataSource comme on peut les
autres controls :

If Not IsPostBack Then
ChlSociete.DataTextField = "Value"
ChlSociete.DataValueField = "Key"
ChlSociete.DataSource = listeDeDonnees
ChlSociete.DataBind()
End If

Cela sous entendrait bien entendu de ne plus avoir un objet avec des
listes de propriété mais une liste d'objet disposant d'une propriété
Value et d'une Propriété Key. Ce serrait plus facile à maintenir par la
suite qu'un dispositif à plusieurs liste et plus dans une philosophie POO.

C'est le genre de code que j'utilise et je n'ai jamais de soucis de
postback comme celui que tu rencontres.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Gilbert Tordeur
Bonjou Jérémy.

J'ai essayé ta suggestion, mais cela ne change rien :

Protected Sub Page_Load(ByVal sender As Object _
, ByVal e As System.EventArgs) _
Handles Me.Load
Call OuvrirContexteFinance()
If Not IsPostBack Then
Call ChargerListeSociete()
Call ChargerListeBu()
Call ChargerListeEtat()
Else
Call LireCriteresRecherche()
Call ChargerGrille()
End If
End Sub


Private Sub ChargerListeSociete()
Dim ListeTriee As New SortedList(Of String, String)
For Each NumSociete As Integer In
ObjSessionFinCau000.LstAllowedLegalEntityIds
Dim DetailsSociete As CjcLegalEntityDetails =
ObjSessionFinCau000.GetLegalEntityDetails(NumSociete)
Dim NomSociete As String
If IsNothing(DetailsSociete) Then
NomSociete = NumSociete.ToString
Else
NomSociete = DetailsSociete.LegalEntityName
End If

ListeTriee.Add(NomSociete, NumSociete.ToString)
Next

DataSourceSociete = New List(Of CjcItemDataSource)

For i As Integer = 0 To ListeTriee.Count - 1
DataSourceSociete.Add(New CjcItemDataSource(ListeTriee.Keys(i),
ListeTriee.Values(i)))
Next

ChlSociete.DataTextField = "Key"
ChlSociete.DataValueField = "Value"
ChlSociete.DataSource = DataSourceSociete
ChlSociete.DataBind()
ChlSociete.SelectedValue =
ObjSessionFinCau000.CurrentLegalEntityId.ToString
End Sub

La CheckBoxList s'affiche bien, mais au deuxième passage dans le programme,
je mets un point d'arrêt sur l'événement PageLoad, et je constate qu'elle ne
comporte aucun élément. Elle n'est pas rechargée automatiquement.

Que faire ?
Avatar
Gilbert Tordeur
En fait, il faut recharger les checklistbox dans Page_Init et non dans
page_Load !

Problème résolu.

Gilbert.
Avatar
Jérémy Jeanson
Bonjour Gilbert,

En fait c'est un peu plus subtil que ça, il faut que tu regardes un peu
du côté de la documentation pour bien saisir le DataBind et le moment où
il doit survenir.

Dans la plus par des controls nos données sont présentes mais
inaccessibles en fonction du moment où l'on veut les atteindre. Le
GridView est un bonne exemple pour cela, il affiche bien des données
mais à certain moment il n'a pas de lignes donc il faut passer par
d'autres propriétés.

Pour le post sur le CheckBoxList j'ai quand même pas mal de difficulté à
comprendre l'utilité de passer dans le init... tu fais des choses
particulière sur ton control? si oui à quel moment?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Gilbert Tordeur
Jérémy,

Tu as tout le code dans les emails précédents. Pour afficher les
checkboxlists la première fois, aucun problème. Pour relire les items et
déterminer lesquels sont cochés, ça ne semble fonctionner que si je recharge
les checkboxlists dans Page_Init ; dans Page_Load c'est trop tard, on dirait
que les Request.Form ont déjà été traités.

Gilbert
Avatar
Delf
Gilbert Tordeur avait prétendu :

Mon problème est le suivant : après un clic sur le bouton Rechercher, le
programme doit déterminer quelles cases sont cochées. Or, ChlSociete est vide
! (les autres aussi.). J'ai pourtant positionné EnableViewState="True" sur la
page. Y a-t-il une erreur de détail, ou bien n'ai-je encore rien compris au
fonctionnement d'asp.net ?



Personnellement, j'évite d'utiliser le ViewState pour stocker ce genre
d'information lors d'un PostBack, ça peut très vite alourdir les pages.

Je préfère encore passer par le Page_Init() pour réalimenter les
contrôles, quitte-à utiliser le cache objet afin d'éviter de refaire
une requête sur le SGBD pour récupérer les données (pour les données de
référentiels).
Avatar
Jérémy Jeanson
Bonjour Delf,

Tu pars là sur un grand débat... ViewState versus Cache...

Tel quel il n'y a pas vraiment de gagnant, tout dépend de ce que tu veux
combattes, mais aucune solution ne permet de se battre sur tout les
front (activité serveur, client, bande passante....) il y aura toujours
quelques choses qui clochent.

Microsoft a déjà fait de beaux progrès sur le ViewState et continuera
certainement à en faire... Pour ceux pour qui cela ne suffit pas ils
fournissent le MVC :

- Aujourd'hui la mode pour les personnes qui veulent se passer de
ViewState est le MVC.

- Pour ceux qui veulent garder en productivité, c'est de ne pas se poser
de question si l'invention d'une nouvelle usine à gaz et d'employer les
control avec le ViewState (tout en désactivant le ViewState de certains
controls quand il est inutile)

Mon avis perso est que le chois doit se faire en fonction de son niveau
de maîtrise de .net et du temps que l'on peut consacrer à la réalisation
d'un projet...

Sans oublier qu'il faut penser à la maintenabilité du projet et à ses
évolutions (qui se feront certainement par un autre développeur... d'où
un temps plus long pour celui-ci si il doit s'immerger en profondeur
dans votre code)
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Cshark
Bonjour Jeremy,

voilà j'ai vu votre discussion et ça tombe bien vu que moi aussi j'ai petit
souci avec le viewstate, je détaille un peu le sujet:

sur mon formulaire web j'ai 3 Dropdownlist fonctionnant en cascade, c'est à
direla 3ème dépend de la 2ème et cette dernière dépend de la 1ère, toutes les
3 sont alimenté via datasource depuis une BD, l'exemple que je donne est
comme suit:

la 1ème liste déroulante contient les noms des départements
la 2ème contient la liste les noms des régions
la 3éme contient la liste des prefecture

le mécanisme est comme suit, une fois la page chargée, la liste des
département est remplie automatiquement, celle des régions aussi mais pas
celle des prefectures.

si je choisis un dapartement , un autopostback est lancé devant donner par
la suite et automatiquement , la région à qui il appartient et aussi la liste
des prefectures qu'il contient.

là est le souci avec mon viewstate, si je met ce dernier à false (sur la
3ème liste des prefectures) le chargement des listes se fait normalement même
en changeant tel ou tel departement , les prefectures correspondantes à ce
dernier sont chargée sans faute sur la 3 liste mais une fois que je veut
faire une mise à jour en renvoyant la page, celà me cause un souci indiquant
que la 3ème liste (prefecture) ne contient aucune donnée à envoyer vu qu'elle
est obligatoire sur le formulaire c'est comme si elle était vide, maintenant
si je met le viewstate à true, celà ne pose pas de problème lors d'une mise à
jour mais le souci est que l'ensemble des prefecture sont chargées sur la
3ème liste une fois que je fasse une selection sur la 1ère liste
(departement).

peux-tu m'éclairer sur ce topic stp ?

merci