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

Windows Forms Discussion :

UserControl + Binding


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 22
    Par défaut UserControl + Binding
    Bonjour.
    Lorsque je craie un Binding pour lier une propriété de type object d'un UserControl que j'ai fait la liaison se fait bien.
    Mais lorsque je fait un EndEdit() sur le BindingSource qui a servi de DataSource a mon Binding celui-ci semble "valider" la valeur de ma propriété comme si cette valeur avait changé.

    Résultat même si aucune modification n'a été réellement faire dans la source de donnée, celle si apparait comme modifiée.

    exemple:
    Le control
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public partial class UserControl1 : UserControl
        {
            private object m_objId = null;
            public UserControl1()
            {
                InitializeComponent();
            }
            public object Id
            {
                get { return this.m_objId; }
                set { this.m_objId = value; }
            }
        }
    la liaison avec la donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UserControl1 ctr = new UserControl1();
    BindingSource src = new BindingSource();
    ...
    // initialisation de mon BindingSource
    ...
    Binding b = new Binding("Id",src,"nom de propriété dans la source de donnée");
     
    ctr.DataBindings.Add(b);

  2. #2
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Quand tu fait EndEdit sur ton BindingSource, cela appel le EndCurrentEdit du currencyManager qui lui fait un EndEdit sur ton object contenu dans ton bindingSource

    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
     
    public override void EndCurrentEdit()
    {
        if ((this.Count > 0) && this.CurrencyManager_PullData())
        {
            object obj2 = ((this.Position >= 0) && (this.Position < this.list.Count)) ? this.list[this.Position] : null;
            IEditableObject obj3 = obj2 as IEditableObject;
            if (obj3 != null)
            {
                obj3.EndEdit();
            }
            ICancelAddNew list = this.list as ICancelAddNew;
            if (list != null)
            {
                list.EndNew(this.Position);
            }
        }
    }
    Il va tjrs appeler le EndEdit de ton obj si celui-ci implémente IEditableObject. A toi de valider si ton object a vraiment changer!

  3. #3
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 22
    Par défaut
    Bonjour,
    Pour commencer, merci pour cette réponse.

    Ensuite, quand vous me parlez de IEditableObject, je suppose que c'est en parlent de "private object m_objId" de mon UserControl puisque c'est sur celui-ci que ce fait la liaison. Si c'est le ça, je ne sais pas en réalité quel est de vrais type de l'objet.

    Quand a l'extrais de code que vous avez mis, c'est un extrais de ce qu'il y a dans le currencyManager ?

    Encore merci pour l'intérêt porté a mon problème.

  4. #4
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 22
    Par défaut
    J'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class UserControl1 : UserControl, IEditableObject
    mais je ne rentre jamais dans mes EdnEdit() ou BeginEdit() ...
    faut il y faire appel explicitement ?

  5. #5
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 22
    Par défaut
    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
     
    public class MaClasse: UserControl
    {
         private TextBox Tb = new TextBox();
     
         public TextBox textBox
         {
              get{ return this.Tb; }
         }
     
         public string Txt
         {
              get{ return this.Tb.Text; }
              set{ this.Tb.Text = value; }
         }
    }
    Liaison1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MaClasse MC = new MaClasse();
    BindingSource BS = new BindingSource();
    ...
    Binding B = new Binding("Txt",BS,"une propriété de BS");
     
    MC.DataBindings.Add(b);
    Liaison2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MaClasse MC = new MaClasse();
    BindingSource BS = new BindingSource();
    ...
    Binding B = new Binding("Text",BS,"une propriété de BS");
     
    MC.textBox.DataBindings.Add(b);
    - La liaison 1 ne fait pas ce dont j'ai besoin... Même si la valeur de "Txt" n'a pas changé, si je fait un BS.EndEdit() la source de donné de BS fait comme si la valeur avait changé

    - La liaison 2 fait bien ce que je désir. Elle fait passé la source de donnée de BS comme modifié uniquement si la valeur a réellement changée.

    Que dois je rajouter a ma classe "MaClasse" pour que le "Txt" de celle-ci se comporte comme le "Text" d'un "TextBox "?

  6. #6
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 22
    Par défaut
    Ca y est, je pense avoir trouvé.

    en implémentant l'interface INotifyPropertyChanged

    Et en générant l'évènement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [UserControl] Binding vers le parent
    Par al2000 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 26/09/2011, 17h41
  2. UserControl : Binding observableCollection
    Par Naimor dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 03/01/2011, 20h27
  3. [WPF] Probléme de binding dans un UserControl :(
    Par UNi[FR] dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 17/07/2008, 16h51
  4. Binding entre deux UserControl
    Par mehdi_ouni dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 11/03/2008, 17h10
  5. [WPF] UserControl -> binding ??
    Par UNi[FR] dans le forum C#
    Réponses: 1
    Dernier message: 10/09/2007, 12h31

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