Attribute disabled dans une CheckBoxList

amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008 - 17 déc. 2004 à 11:38
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 19 déc. 2004 à 16:32
SAM

Dans ma page asp.net, j'ai une CheckBoxList que je remplis à l'aide d'information d'une base de données.

Je souhaites rendre disabled certaine case à cocher de la liste (en fonction de certaines conditions).

Pour une CheckBox, il existe une propriété Enabled qui remplit ce rôle mais pour les ListItem qui remplisse une CheckBoxList, cette propriété n'existe pas.

J'ai voulu utiliser la propriété Attributes :
CheckBoxList F_list;
F_list.Attributes.Add("key","valeur");

mais elle nécessite une clé et une valeur alors que "disabled" qui est valide dans une balise html n'a pas de valeur.

A noter qu'il est bien sur possible d'utiliser un tableau de CheckBox, (CheckBox[]) que l'on insère dans une table par exemple mais ... si il existe une solution avec une CheckBoxList, je la préfère.

Merci.

9 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 déc. 2004 à 15:59
Je suis pas sur de tomber dans le mil a ta question.

Mais c'est une aberration !!! il ne faut pas utiliser ceci !!! certes ca passe, mais les standard du web etablit par le W3C ne l'acceptent pas! il faut passer par un
c'est assez choquant au debut, mais une fois bien reflechie, ca peut paraitre logique et on peut meme aller jusqu'a dire que ca simplifie pas mal de chose.

pour revenir a ton problème je pense pas que cela va arranger grand chose d'ajouter un attribut à la liste, je ne pense pas que cela va te mettre le disabled="disabled" sur chaque checbox. la solution serait alors de faire quelque chose du genre :

Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender
For Each c As CheckBox In cbl.Controls
If "ta" = "condition" Then
c.Enabled = False
End If
Next
End Sub

ou cbl et ton checkboxlist, mais j'aime pas trop cette solution, et je suis pas sur non plus que ca marche, normalement oui :)

Cyril
0
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
17 déc. 2004 à 17:49
SAM

C'était une bonne idée mais la tous les checkbox de la checkboxlist deviennent enabled ou pas tous ensemble, selon la valeur du premier élément.

La solution machkboxlist.Items[i].Attributes.Add("disabled","disabled") ne fonctionne pas non plus. rien n'est inséré.

Je pense que la seule solution est de passer par un tableau de CheckBox, qui remplace la CheckBoxList.
Chaque CheckBox du tableau peut alors être manipulé indépendament des autres.

Merci.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 déc. 2004 à 18:19
et t'as essayé avec ma méthode ? faire un for each sur tout les controles du checkboxlist ?

Cyril
0
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
17 déc. 2004 à 21:25
SAM

Oui justement, c'est ta méthode que j'ai essayé.

Si tu met le premier à Enabled = true alors tous les CheckBox de la liste sont Enabled même si tu en mets à false.

Idem dans le sens contraire, si le premier est à false, ils sont tous à false.

int i=0;
foreach (CheckBox chk in MaCheckBoxList.Controls)
{
if (i==0)
chk.Enabled = true;
else
chk.Enabled = false; // ne sert à rien, ils seront tous à true

i = i + 1;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 déc. 2004 à 21:50
c pas le meme controle que tu changes ?
tu as VS.net ? Regarde en mode debug et pas à pas ce que ca te fais. et dis mois aussi MaCheckBoxList.Controls.count et verfifie si c'est pas les memes
chk.text, ca me semble bizarre.

sinon tu peux me donner comment tu lies ta liste a ta source de données ?

et tu as placé ce code dans quels evenement ?
dans le page_load, le prerender ? essaye plusieurs endroits ... le prerender me semble bien :) ou alors le databinding

la je vois plus trop ou est le problème, si tout ce que je t'ai dit n'a rien changé, je regarderais ce soir avec VS.net :big)

Cyril
0
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
18 déc. 2004 à 12:54
SAM

Oui, tu as raison. En faites, ma CheckBoxList est remplit avec des ListItem dans ma page aspx.

En traçant le programme, j'obtient les valeurs suivantes :

F_config.Controls.Count = 1 alors que
F_config.Items.Count = 5 (bon nombre);

J'ai besoin du Value qui me sert ensuite à faire mes tests en fonction d'un choix utilisateur et rendre enabled ou non le checkbox. C'est dans un evênement lié à un click sur un bouton.

Il faudrait que je remplisse la CheckBoxList avec des CheckBox au lieu de ListItem. Les CheckBox n'ont pas de propriété Value mais je peux me servir de la propriété ID (à voir).

Le tableau de CheckBox (CheckBox[ ]) ne me convient pas trop car les Value doivent être inséré dans la page aspx et non via le code. Je pourrais mettre un pour faire un split et construire dynamiquement ma liste de CheckBox mais si il y a une solution via la CheckBoxList, c toujours bon à savoir.

Je vais faire quelques recherches et je laisserais un message si je trouves une solution.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
18 déc. 2004 à 14:49
Je prendrais VS quand j'aurais le temps pour clore le programme, car tout ca me semble bizarre !

je suis pas sur de t'avoir compris. tu le met dans le click ? tu peux m'expliquer à quoi te sert ta list, tu ajoutes ta liste au click, ou alors tu modifies tes checkbox au click ?

Je viens de regarder : ce code la n'est peut etre pas vraiment valide :

int i=0;
foreach (CheckBox chk in MaCheckBoxList.Controls)
{
if (i==0)
chk.Enabled = true;
else
chk.Enabled = false; // ne sert à rien, ils seront tous à true

i = i + 1;
}

Le type de Check pose peut etre problème essaye plutot comme ca
foreach (Controls chk in MaCheckBoxList.Controls) puis regarde dans le debug le type de chk : chk.gettype et parse ton controle avec ce type : surement ca
(listitem)chk.enabled
ou (checkbox)chk.enabled

et puisqu'apparement tu n'as qu'un controle dans cbl.controls, je pense qu'il doit s'agir d'une table, et quand tu la met enabled, tout les enfants seront enabled, verifie le type de l'unique control grace au debug

essaye alors comme ca :
foreach (Controls chk in MaCheckBoxList.Items)

j'espere que cette fois c'est bon

Cyril
0
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
19 déc. 2004 à 14:03
SAM

Dans ma page, j'ai plusieurs LinkButton associé à des éléments. Ma CheckBoxList me sert à associer des valeurs à ces éléments. Un élément peut donc être associé à zéro, un ou plusieurs valeurs.

Les valeurs sont transmises dans les propriété Value des ListItem qui servent à remplir la CheckBoxList dans la page.

valeur 1
etc...

Certaine valeurs sont déjà associété et dans l'evenement lié au click sur un LinkButton, je veux donc rendre enabled = false plusieurs CheckBox de la CheckBoxList.

Le problème est qu'une CheckBoxList est remplit avec des ListItem et qu'un ListItem n'a pas de propriété Enabled. Il n'y a pas non plus de lien entre CheckBox et ListItem.

foreach(Controls chk in F_config.Items)
{
((CheckBox)chk).Enabled = false; // envoi une exception cast non valide
}

Ce qui est bizarre, c que le nombre de ListItem est le nombre de CheckBox dans la liste mais le nombre de Controls (Controls.Count) est égal à 1.

Si j'affiche sont type (chk.GetType().ToString()), il est du type CheckBox. La propriété Enabled de ce control mise à true ou false est appliqué sur tous les CheckBox de la liste. C'est effectivement bizarre.

Te prends pas trop la tête sur mon problème surtout que j'ai une solution de rechange. J'utiliserais un input type="hidden" pour envoyer mes valeurs en paramètres à la classe d ema page et je remplirais un tableau de CheckBox. Ils seront indépendant et je pourrais mettre Enabled = true/false selon ma condition.

(A moins que tu ais envie de trouver la solution avec un CheckBoxList).

Pour moi, la CheckBoxList n'est pas faite pour traiter les CheckBox indépendament les uns des autres !!!

En tout cas, merci de t'y être intéressé.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
19 déc. 2004 à 16:32
OK j'ai enfin pris le temps d'ouvrir VS.net et de regarder ca :)

donc le problème vient qu'un listitem n'est pas un control !!! et oui ce truc la n'hérites pas d'objet, c'est pour ca que controls.count = 1. j'aime pas trop les checkboxlist, mais maintenant je sais pourquoi :)

donc pour modifier un item, va falloir tout faire à la main, rechercher le control et ajouter ce qu'on veut dedans. On peut soit le faire directement en asp.net soit en javascript, la solution coté serveur est preferable, mais j'y avais pas pensé au debut, donc je me suis lancé rapidement dans un bout de script javascript :

voice ce que j'ai fait :

Dim i As Integer = 0
For Each c As ListItem In F_config.Items
Literal1.Text &= c.Text & " - " & F_config.UniqueID & "_" & i.ToString & "
"
Literal1.Text &= "<script language=""javascript""><!--" & vbNewLine & "document.getElementById(""" & F_config.UniqueID & "_" & i.ToString & """).setAttribute(""disabled"", ""disabled"") " & vbNewLine & "-->" & vbNewLine & "</script>"
i += 1
Next

j'ai fait ca vite fait, mais si tu utilises javascript, tu as quand meme interet à travailler un peu le javascript, enregistrer une fonction via page.startupregisterscript qui demande un tableau en paramètre et dans la boucle for, tu ajoutes tes elements dans un tableau javascript et tu appelles ta fonction js avec ce tableau :)

mais mieux vaut faire ca coté serveur ce sera moins lourd

@+

Cyril
0
Rejoignez-nous