A Propos de l'auteur

Name of author Bruno Raby
Je suis un passionné de développement logiciel et j'ai trouvé le projet BlogEngine.NET superbe. J'ai créé ce blog pour apporter ma contribution au développement des applications webs et des différents StarterKits.

Ecrivez moi Send mail

Calendrier

<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar

Recent comments

Authors

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2012

Sign in

CheckBoxList - Liste de cases à cocher exclusive

by Bruno 1/22/2008 6:15:00 AM

Après avoir longuement observé le comportement de l'objet CheckBoxList, je cherche à faire une liste de case à cocher qui soit exclusive c'est à dire qu'une seule case ne soit cochée à la fois. Si l'utilisateur vient à décocher la case cochée, c'est la première de la liste qui redevient sélectionnée.

Bon c'est un simple exercice "de style" sinon il suffit d'utiliser une RadioList mais le style radio button ne me plait pas je veux des carrés ! et je trouve pas le moyen de modifier un tant soit peu la radio list ... bon c'est comme ça que je me justifie

Bon ça a l'air façile. Par exemple, je reçois par "object sender" le nouvel objet (une CheckBox) sélectionné par l'utilisateur, j'invalide le permier, je valide celui-là.
Non non pas du tout, l'objet "sender" me renvoit l'ensemble de la ListItem CheckBoxList Selected et démerdez-vous. Il n'y a qu'a voir la littérature sur le sujet pour voir que les développeurs sont obligés de parcourir la liste pour voir quelle case est cochée.

Les objets Microsoft ont parfois des propriétées et des comportements étranges notamment CheckBoxList et sa propriété SelectedIndex :

Définition :  SelectedIndex, Obtient ou définit l'index ordinal le moins élevé des éléments sélectionnés dans la liste.(hérité de ListControl.)

Et et cela ne sert strictement à rien ? Cette information n'a acune utilité alors on peut se dire qu'elle est hérité et par conséquent doit pouvoir servir ailleurs je veux dire pour d'autres objets. Si au moins elle pouvait retournée l'objet sélectionné par l'utilisateur mais ce n'est pas le cas.

On pourra remarquer que faire :

CheckBoxList1.Items[ CheckBoxList1.SelectedIndex ].Selected = false;

si tant est que CheckBoxList1.SelectedIndex ne soit pas égal à -1 sinon c'est le crache, positionne la valeur de CheckBoxList1.SelectedIndex sur la prochaine case sélectionnée comme le semble supposer sa définition.

Mais à quoi cela peut-il bien servir ? Ha si quand même, admettons que l'on veuille parcourir la liste des éléments selectionnés, il suffit alors de faire un While SelectedIndex != -1. Bon ca peut servir mais pas pour notre exemple. Les objets de la page .aspx sont les suivants :

<asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged">
<asp:ListItem Selected="True">choix 1</asp:ListItem>
<asp:ListItem>choix 2</asp:ListItem>
<asp:ListItem>choix 3</asp:ListItem>
<asp:ListItem>choix 4</asp:ListItem>
<asp:ListItem>choix 5</asp:ListItem>
</asp:CheckBoxList>
<br />
<asp:Button ID="ButtonParcourir" runat="server" OnClick="ButtonParcourir_Click" Text="Parcourir" />
<br />
<asp:Label ID="LabelText" runat="server" Text="Label"></asp:Label>

La fonction OnClick du bouton peut s'écrire comme cela :

protected void ButtonParcourir_Click( object sender, EventArgs e )
{
    if ( CheckBoxList1.SelectedIndex != -1 )
    {
        while ( CheckBoxList1.SelectedIndex != -1 )
        {
            LabelText.Text += CheckBoxList1.Items[ CheckBoxList1.SelectedIndex ].Value + "<br/>";
            CheckBoxList1.Items[ CheckBoxList1.SelectedIndex ].Selected = false;
        }
    }
}

C'est plutôt concis comme écriture vous en conviendrez. 

Alors pour la fonction OnSelectedIndexChanged je vous livre mon code. Compte tenu de ce que j'ai lu sur Internet je n'ai rien trouvé de convenable pour résoudre mon problème. Bien sûr on sait tous gérer des CheckBox de façon indépendantes mais ce n'est pas ce que je voulais faire. Voilà je n'ai trouvé à écrire que ca :

protected void CheckBoxList1_SelectedIndexChanged( object sender, EventArgs e )
{
    if ( CheckBoxList1.SelectedIndex == -1 )
    {
        CheckBoxList1.Items[ 0 ].Selected = true;
    }
    else
    {
        for ( int i = 0;i < CheckBoxList1.Items.Count;i++ )
        {
            ListItem li = CheckBoxList1.Items[ i ];
            if ( li.Selected && ( li.Value != CheckBoxList1.Items[ CheckBoxListSelectedIndex ].Value ) )
            {
                CheckBoxList1.Items[ CheckBoxListSelectedIndex ].Selected = false;
                CheckBoxListSelectedIndex = i;
            }
        }
    }
}

Pour pallier au comportement de SelectedIndex et des autres propriétés de CheckBoxList on utilise une  variable static :

public partial class PageTest1 : System.Web.UI.Page
{
    static int CheckBoxListSelectedIndex = 0;
   
    ...
}

Ce qui n'est pas très bon pour les applications multi-utilisateurs.

Vous ne pouvez pas utiliser les deux fonctions en même temps il faut mettre la propriété AutoPostBack de la CheckBoxList à false.

Si vous avez d'autres suggestions je suis preneur.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

ASP.NET

Related posts

Comments

Powered by BlogEngine.NET 1.2.1.0
Theme by Mads Kristensen