Groupebox lié aux données ( gère les radiobutton selon un index)

Soyez le premier à donner votre avis sur cette source.

Vue 10 800 fois - Téléchargée 295 fois

Description

Je développe d'habitude des applications de gestion et souvent je me trouve dans la situation où j'ai une table qui contient un champ numérique qui est représenté dans les interfaces utilisateurs sous forme d'un ensemble d'options (RadioButton)
Exemple : Table personne qui Contient la colonne Situation matrimoniale de type entier qui peut recevoir les valeurs 0 pour Célibataire, 1 pour Marié, 2 pour Divorcé.

Mon problème, c'est que je n'arrive pas à lier ces RadioButton aux données (la propriété Checed accepte les Boolean uniquement) donc je contourne ce problème généralement en liant la propriété Tag du Groupoption (qui contient les Radiootion) au Bindingsource et j'intercepte l'évènement "Bindingcomplete" pour assurer l'affichage des données.

Pour cette raison, j'ai pensé à étendre le control Groupoption et lui ajouter une propriété que je peux la liée facilement aux données.

L'aidé consiste à :
1. ajouter une propriété "currentindex" de type integer
2. Faire en sorte que chaque cotrole RadioButton placé par l'utilisateur final de mon Groupoption se voit doté d'une propriété suplimentaire appelée "Index" qui doit contenir la valeur de cette option (ex 0 si cette option est celle qui représente Célibataire)
3. Ajoute un évènement "OnIndexChanged" qui signale changement du choix.
Voilà c'est la première version et j'attends vos remarques et suggestions
Merci

Source / Exemple :


[ProvideProperty("Index", typeof(RadioButton))]
    [DefaultBindingProperty("CurrentIndex")]
    public partial class GOptions : GroupBox,IExtenderProvider 
    {
        private int _lastIndex = -1;
        [Description("Ce déclanche après le changement de l'option")]
        public event GOptionEventHandler OnIndexChanged;

        public GOptions()
        {
            InitializeComponent();
            this.ControlAdded += new ControlEventHandler(GOptions_ControlAdded);
            this.ControlRemoved += new ControlEventHandler(GOptions_ControlRemoved);            
            this._lstIndex = new Hashtable();
            this._currentIndex = 0;
        }

        void GOptions_ControlRemoved(object sender, ControlEventArgs e)
        {
            if (e.Control is RadioButton)
            {
                _lstIndex.Remove(e.Control);
            }            
        }

        void GOptions_ControlAdded(object sender, ControlEventArgs e)
        {
            if (e.Control is RadioButton)
            {
                this.SetIndex(e.Control, this.Controls.Count - 1);
                RadioButton op = e.Control as RadioButton;
                op.CheckedChanged += new EventHandler(op_CheckedChanged);  
            }
        }

        void op_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton op=sender as RadioButton;
            if (op.Checked)
            {
                _currentIndex = GetIndex(op);
                if (OnIndexChanged != null)
                    OnIndexChanged(this, new GOptionEventArgs(_currentIndex,_lastIndex));
                _lastIndex = _currentIndex;
            }
        }

        private int _currentIndex;

        [Browsable(false)]
        [Bindable(true)]
        [Description("Obtient ou définit l'option sélectionnée")]
        public int CurrentIndex
        {
            get { return _currentIndex; }
            set
            {
                if (this.DesignMode) return;
                _currentIndex = value;
                foreach (DictionaryEntry x in _lstIndex)
                {
                    if (x.Value.Equals(_currentIndex))
                    {
                        ((RadioButton)x.Key).Checked = true;
                        break;
                    }
                }
            }
        }

        [Browsable(false)]
        [Description("Obtient le RadioButton sélectionnée")]
        public RadioButton CurrentOption
        {
            get
            {
                RadioButton rst=null;
                foreach (DictionaryEntry x in _lstIndex)
                {
                    if (x.Value.Equals(_currentIndex))
                    {
                        rst= x.Key as RadioButton;
                    }
                }
                return rst;

            }
        }

        #region IExtenderProvider Membres
        private Hashtable _lstIndex;

        [ExtenderProvidedProperty()]
        [Description("L'index de l'option dans le groupe")]
        public int GetIndex(Control op)
        {
            if (_lstIndex.Contains(op))
                return (int)_lstIndex[op]; 
            else
                return -1;
        }

        public void SetIndex(Control op, int value)
        {
            if (_lstIndex.Contains(op))
            {
                if (IsUniqueValue(value))
                    _lstIndex[op] = value;
            }
            else
                _lstIndex.Add(op, value);
        }

        private bool IsUniqueValue(object value)
        {
            foreach (DictionaryEntry x in _lstIndex)
            {
                if (x.Value.Equals( value))
                {
                    return false;
                }
            }
            return true;
        }

        public bool CanExtend(object extendee)
        {
            return extendee is RadioButton && ((Control)extendee).Parent == this;
        }

        #endregion
    }

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.