none
Comment dissocier les évènements d'une bindingList produits par le propertyGrid (lors d'un refresh) et les événements produits par un vrai nouvelle ajout d’un BO dans la liste ? RRS feed

  • Discussion générale

  • Bonjour,

    Je travaille actuellement sur le développement d'une interface graphique en winform. L’architecture logicielle se compose des 4 couches (BO, DAL, BLL, UI) et j’utilise la puissance du « binding » pour présenter les BO (qui implémente l’interface INotifyPropertyChanged) dans les UI suivant :

    -           Le détail d’un BO via une propertyGrid.

    -           Une collection de BO (BindingList) via l’éditeur de collection du propertuGrid ou bien une dataGridView.

    Il est vrai que le databinding est un gain de temps évident même si je reste un peu déçu que l’héritage visuel ne fonctionne pas sur ses composants.

    J’ai remarqué que sur le propertyGrid présentant une  personne (BO) lorsque l'on appel l’éditeur de collection pour saisir une nouvelle  adresses (BO) à la personne, j’obtiens une myriade d’événements du ListChangedEventHandler :

    -           En premier, capture listChangedEventHandler avec l’argument ListChangedEventArgs à RESET.

    -           Puis capture de N listChangedEventHandler avec l’argument ListChangedEventArgs à ItemAdded (correspondant au nombre d'adresses déjà présent dans la collection).

    La même enchainement se reproduit à la fermeture de l’éditeur de collection.

    Comment dissocier les évènements d'une bindingList produits par le propertyGrid (lors des refresh) et les événements produits par un vrai nouvel ajout de BO dans la bindingList ?

    Merci par avance de vos conseils,

    Cordialement,

    Cédric

     

    Ci-dessous pour l'exemple le code des BO :

     

    using System;
    
    using System.Collections.Generic;
    
    using System.Text;
    
    using System.ComponentModel;
    
    
    
    namespace CollectionApplication
    
    {
    
    
    
        // A delegate type for hooking up change notifications.
    
        public delegate void ChangedEventHandler(object sender, EventArgs e);
    
    
    
        class Person
    
        {
    
            public event ChangedEventHandler PersonChanged;
    
    
    
            protected virtual void OnPersonChanged(EventArgs e)
    
            {
    
                if (PersonChanged != null)
    
                    PersonChanged(this, e);
    
            }
    
    
    
            public Person(string pFirstName, string pLastName)
    
            {
    
                _FirstName = FirstName;
    
                _LastName = LastName;
    
                OnPersonChanged(EventArgs.Empty);
    
            }
    
    
    
            private string _FirstName;
    
            public string FirstName
    
            {
    
                get { return _FirstName; }
    
                set { _FirstName = value; OnPersonChanged(EventArgs.Empty); }
    
            }
    
    
    
            private string _LastName;
    
            public string LastName
    
            {
    
                get { return _LastName; }
    
                set { _LastName = value; OnPersonChanged(EventArgs.Empty); ; }
    
            }
    
    
    
            private BindingList<Address> _ListAddress = new BindingList<Address>();
    
            public BindingList<Address> ListAddress
    
            {
    
                get { return _ListAddress; }
    
                set { _ListAddress = value; OnPersonChanged(EventArgs.Empty); ; }
    
            }
    
    
    
        }
    
    
    
        class Address
    
        {
    
    
    
            public event ChangedEventHandler AddressChanged;
    
    
    
            protected virtual void OnAddressChanged(EventArgs e)
    
            {
    
                if (AddressChanged != null)
    
                    AddressChanged(this, e);
    
            }
    
    
    
            public Address(string pCity, string pFirstName)
    
            {
    
                _City = pCity;
    
                _FirstName = pFirstName;
    
                OnAddressChanged(EventArgs.Empty);
    
            }
    
    
    
            private string _FirstName;
    
            public string FirstName
    
            {
    
                get { return _FirstName; }
    
                set { _FirstName = value; OnAddressChanged(EventArgs.Empty); }
    
            }
    
    
    
            private string _City;
    
            public string City
    
            {
    
                get { return _City; }
    
                set { _City = value; OnAddressChanged(EventArgs.Empty); ; }
    
            }
    
    
    
        }
    
    
    
        class ListPersons
    
        {
    
            public List<Person> PersonsList = new List<Person>();
    
    
    
            public ListPersons()
    
            {
    
                PersonsList.Add(new Person("One", "AAA"));
    
                PersonsList.Add(new Person("Two", "BBB"));
    
                PersonsList.Add(new Person("Three", "CCC"));
    
    
    
                PersonsList[0].ListAddress.ListChanged += new ListChangedEventHandler(ListAddress_ListChanged);
    
                PersonsList[1].ListAddress.ListChanged += new ListChangedEventHandler(ListAddress_ListChanged);
    
                PersonsList[2].ListAddress.ListChanged += new ListChangedEventHandler(ListAddress_ListChanged);
    
    
    
                PersonsList[0].ListAddress.Add(new Address("PARIS", "One"));
    
                PersonsList[0].ListAddress.Add(new Address("VALENCE", "One"));
    
                PersonsList[1].ListAddress.Add(new Address("LYON", "Two"));
    
                PersonsList[2].ListAddress.Add(new Address("MARSEILLE", "Three"));
    
            }
    
    
    
            void ListAddress_ListChanged(object sender, ListChangedEventArgs e)
    
            {
    
                switch (e.ListChangedType)
    
                {
    
                    case ListChangedType.ItemAdded:
    
                        break;
    
                    case ListChangedType.ItemChanged:
    
                        break;
    
                    case ListChangedType.ItemDeleted:
    
                        break;
    
                    case ListChangedType.ItemMoved:
    
                        break;
    
                    default:
    
                        break;
    
                }
    
            }
    
    
    
            // This will be called whenever the list changes.
    
            private void ListChanged(object sender, EventArgs e)
    
            {
    
                Console.WriteLine("This is called when the event fires.");
    
            }
    
    
    
        }
    
    
    
    }

     

    mercredi 13 octobre 2010 11:13

Toutes les réponses

  • Bonjour,

    Il est vrai que le databinding est un gain de temps évident même si je reste un peu déçu que l’héritage visuel ne fonctionne pas sur ses composants.
    C'est à dire ?

    Pouvez-vous nous expliquer pourquoi le déclenchement des événements par BindingList<T> vous pose problème ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 17 octobre 2010 16:23
    Modérateur