IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Bindinsource pour la mise à jour de variable d'objet


Sujet :

C#

  1. #1
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut [C#] Bindinsource pour la mise à jour de variable d'objet
    Bonjour,

    je m'interesse à la mise à jour de variable d'objet après une saisie dans un textbox par exemple.
    Avant, j'utilisais les évenements lancé par le controle mais je me suis interessé au BindingSource.
    J'ai réussi (en trompant VS2005) à modifier la propriété d'un objet après avoir saisi une valeur dans un textbox.
    Comment je disais, j'ai dû tromper VS2005. Car en utilisant les propriétés du control, je n'ai réussi qu'à choisir la propriété d'une classe. Ce qui a généré par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.MyClassBindingSource.DataSource = typeof(MyClass);
    Hors, j'ai remplacé cette expression par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyClass MyObject = new MyClass();
    this.MyClassBindingSource.DataSource = MyObject;
    Mais le designer de VS2005 n'aime pas trop. Car il me met un message disant qu'il ne connait pas MyObject.
    Comment faire en utilisant les propriété du control, définir le lien avec un objet et non avec une classe.

    En trichant, j'ai donc réussi lorsque je saisie une valeur dans mon textbox à modifier la propriété de l'objet.
    Mais comment faire l'inverse ?
    C'est à dire, si je modifie la propriété de mon objet, le textbox est modifié aussi.

    Merci.

  2. #2
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Salut Pilloutou,

    Je voulais tout d'abord te signaler par rapport à ton dernier Thread que tu enfreins les regles du MVC en utilisant le binding.

    Ensuite je voulais m'y mettre avec toi sur le binding Control-Objet , parce ce que c'est interressant.

    Bon j'ai trouvé une solution à ton probleme. Il faut que ta classe implemente l'interface INotifyPropertyChanged pour qu'elle puisse declencher l'evenement INotifyPropertyChanged

    Donc la solution est la suivante :
    La classe DemoCustomer est tirée de l'exemple msdn :

    Classe DemoCustomer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    public class DemoCustomer : INotifyPropertyChanged
    {
        // These fields hold the values for the public properties.
        private Guid idValue = Guid.NewGuid();
        private string customerName = String.Empty;
        private string companyNameValue = String.Empty;
        private string phoneNumberValue = String.Empty;
     
        public event PropertyChangedEventHandler PropertyChanged;
     
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
     
        // The constructor is private to enforce the factory pattern.
        private DemoCustomer()
        {
            customerName = "no data";
            companyNameValue = "no data";
            phoneNumberValue = "no data";
        }
     
        // This is the public factory method.
        public static DemoCustomer CreateNewCustomer()
        {
            return new DemoCustomer();
        }
     
        // This property represents an ID, suitable
        // for use as a primary key in a database.
        public Guid ID
        {
            get
            {
                return this.idValue;
            }
        }
     
        public string CompanyName
        {
            get {return this.companyNameValue;}
     
            set
            {
                if (value != this.companyNameValue)
                {
                    this.companyNameValue = value;
                    NotifyPropertyChanged("CompanyName");
                }
            }
        }
        public string PhoneNumber
        {
            get { return this.phoneNumberValue; }
     
            set 
            {
                if (value != this.companyNameValue)
                {
                    this.phoneNumberValue = value;
                    NotifyPropertyChanged("PhoneNumber");
                }
            }
        }
    }
    Et dans la Form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    private DemoCustomer MyCustomer;
     
    private void Form1_Load(object sender, EventArgs e)
    {
    MyCustomer = DemoCustomer.CreateNewCustomer();
    MyCustomer.CompanyName = "MS";
    Binding bindTextBox = new Binding("Text", MyCustomer, "CompanyName");
    textBox1.DataBindings.Add(bindTextBox);
    }
     
    private void button1_Click(object sender, EventArgs e)
    {
    MessageBox.Show(MyCustomer.CompanyName); // Affiche le contenu du textbox
    MyCustomer.CompanyName = "Sun"; // :P Change le contenu du textbox
    }

  3. #3
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    tu enfreins les regles du MVC en utilisant le binding.
    Oui dans le sens où les données saisies dans l'interface utilisateur ne passent pas par le contrôleur mais accède directement au modèle, c'est ça ?

    Mais quelques part, cela correspondrait à Observer. En effet, si une données du modèle change, Observer fait que les abonnés seront prévenus de la modification.
    Et avec INotifyPropertyChanged, c'est un peu pareil, non ?

  4. #4
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par Pilloutou
    Oui dans le sens où les données saisies dans l'interface utilisateur ne passent pas par le contrôleur mais accède directement au modèle, c'est ça ?
    Tout à fait!, la vue est fortement liée au Model, tout est tombé dans l'eau .

    Observer utilisé avec pattern MVC assure la séparation, il joue le role de la notification.

    Ton probleme est que tu n'es pas entrain de penser modelisation mais plutot technique. Dés que tu trouve une technique qui permet de resoudre un probleme tu fonces en oubliant le modele sur lequel tu t'es basé. Prends ton temps documente toi sur MVC, Observer .... Regarde des exmples. Lis les differentes discussions sur ce sujet dans le forum.

  5. #5
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Oui mais je repense à un truc,
    on est d'accord que la vue connaît le model dans le MVC, non ?
    Ainsi que le controller. Seul le model ne connaît ni la vue ni le controller.

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/12/2008, 11h36
  2. Réponses: 3
    Dernier message: 22/04/2007, 18h59
  3. Réponses: 3
    Dernier message: 29/03/2007, 16h05
  4. problème de mise à jour des variables
    Par King_T dans le forum Langage
    Réponses: 8
    Dernier message: 26/03/2007, 16h43
  5. Réponses: 4
    Dernier message: 02/05/2006, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo