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 :

DataBinding entre un tableau d'entier et des textbox.


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 44
    Points
    44
    Par défaut DataBinding entre un tableau d'entier et des textbox.
    Bonjour,
    Je travaille avec VS2005 avec le Framework 2.0.

    J'ai découvert depuis peu le DataBinding.
    j'arrive à lier la propriété (simple) d'un objet métier à la propriété d'un objet Visuel, sans souci.

    J'aimerais à présent lier une propriété d'un objet qui est un tableau d'entier int[] à des textbox.

    Exemple un tableau de 5 éléments dont chaque élément serait lié à un Textbox (donc 5 textbox).

    Et bien je sèche dessus depuis ce matin sans aucune aide utile trouvée sur le net (peu être aussi que je ne cherche pas avec les mots clé correct).
    Il faut dire que je suis assez débutant avec C# .NET.

    Si quelqu'un avait un lien utile (si ce que je cherche à faire est possible), ou bien une petite explication rapide pour me sortir de ce brouillard, j'en serait content.

    D'avance Merci.
    Julien

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 388
    Points : 502
    Points
    502
    Par défaut
    Lu,
    est-ce que tu peux préciser ce que tu veux faire?
    Est-ce que tu veux que lorsque les valeurs de ton tableau changent, le texte des textbox changent aussi?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 44
    Points
    44
    Par défaut
    Salut,
    Merci de t'intéresser à mon problème.

    Citation Envoyé par Quatre_Couleurs Voir le message
    Lu,
    Est-ce que tu veux que lorsque les valeurs de ton tableau changent, le texte des textbox changent aussi?
    C'est tout à fait cela, C'est le principe du DataBinding non?
    Je n'ai aucun problème pour lier une propriété "simple", mais dès que la propriété est un tableau.... bah la manière "normale" ne fonctionne plus.

    jusqu'a présent je faisais ceci, qui fonctionne bien pour les "simple"
    Un formulaire avec un textbox et un label et le code suivant

    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
     public partial class Form1 : Form
        {
            DTTest _dtTest = new DTTest(4);
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                //ajout du binding => les deux fonctionnent 
                //textBox1.DataBindings.Add("Text", _dtTest, "Num", false, DataSourceUpdateMode.OnValidation);
                textBox1.DataBindings.Add("Text", _dtTest, "Num", false, DataSourceUpdateMode.OnPropertyChanged);
                //abonnenment au property changed de _dtTest pour verifier le double sens du binding
                _dtTest.PropertyChanged += new PropertyChangedEventHandler(_dtTest_PropertyChanged);
     
            }
     
            void _dtTest_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                label1.Text = _dtTest.Num.ToString();
            }
        }
        /// <summary>
        /// Une classe toute bête pour tester le DataBinding
        /// </summary>
        public class DTTest : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private int _num;
            public int Num
            {
                get { return _num; }
                set
                {
                    _num = value;
                    if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Num"));
                }
            }
            public DTTest(int num)
            {
                Num = num;
            }
        }
    Ca marche bien.
    Mais à présent si je place par exemple 2 TextBox et que je modifie DTTest pour avoir une propriété Nums qui n'est autres qu'un tableau d'int , je ne sais pas comment lie mes textbox à la propriété (ici en l'occurence à UN element du tableau)

    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
     }
        /// <summary>
        /// Une classe toute bête pour tester le DataBinding
        /// </summary>
        public class DTTest : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private int[] _nums;
            public int[] Nums
            {
                get { return _nums; }
                set
                {
                    _nums = value;
                    if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Nums"));
                }
            }
            public DTTest(int num)
            {
                Nums = new int[num];
                Random rnd = new Random(1);
                for (int i = 0; i < num; i++)
                {
                    Nums[i] = rnd.Next(100);
                }
     
            }
        }
    Comment utilise ici DataBinding.Add?

    J'espère avoir été plus clair, et encore merci de m'avoir lu et de te pencher sur mon souci.
    Cordialement,
    Julien

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 44
    Points
    44
    Par défaut
    Re,

    > Quatre_Couleurs: j'ai vu que tu avais poster une seconde réponse si je ne me trompe pas, mais je ne la vois pas.

    J'ai beau fouiller le net et lire des tuto et autres Chm, mais je ne trouve rien de probant. Toujours les même exemple avec un DataGrid (ou ListBox) et autre DataSource.

    Je ne sais pas si je fais suis sur la bonne voie, mais j'entends parler de CurrencyManager ainsi que de PropertyDescriptor. Mais je ne sais même pas si ces objets sont ceux que je cherche.

    Si je ne me trompe pas ce que je souhaite faire est du DataBinding "complex".

    Cela m'étonne que rien n'existe de "simple" à mettre en place pour faire ce que je veux.

    OUla, je ce mettre à .NET est difficile au vue du nombre de possibilité offerte par le FrameWork. et je me perds...

    D'avance merci pour les eventuels coup de pouce.
    Cordialement,
    Julien

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 44
    Points
    44
    Par défaut Une solution trouvée
    Bonjour,
    Juste un petit mot pour vous prévenir que j'ai (enfin un collègue et moi) réussi à trouver une solution qui peu convenir.

    Après plusieurs recherches infructueuses pour essayer de faire cela "simplement", nous nous sommes donc orienté vers ceci:

    - Un objet IntCollection héritant de List<Int> et implémentant les interfaces ITypedList et IBindingList
    - Un objet IntPropertyDescriptor héritant de PropertyDescriptor et implémentant l'interface INotifyPropertyChanged
    - On modifie par le code les propriétés de l'objet IntCollection pour crée une propriété par élément de tableau, puis on ajoute un Binding au TextBox sur les propriétés créées


    Pour mettre en place le Binding:

    - On crée un objet IntCollection et on lui passe notre tableau d'entier. Pour chaque élément du tableau, on ajoute à un champ de type PropertyDescriptorCollection des objets de type IntPropertyDescriptor et on s'abonne à leur événement PropertyChanged. On gère aussi notre List<Int>.
    - On ajoute le Binding au TextBox.
    - Si une modification est apportée (depuis le code, ou depuis une saisie TextBox) , La méthode SetValue (hérité de PropertyDescriptor) de l'objet IntPropertyDescriptor est appelée et nous levons ici l'événement PorpertyChanged.
    - L'objet IntCollection gère sa List<Int> et lève alors à son tour un événement ListChanged proposé par IBindingList
    - Hop le tour est joué (et quelques jour de prises de tête aussi)

    Il est assez difficile d'expliquer clairement ce que nous avons fait.
    Donc si quelqu'un à le même problème, je posterai les classe commentées.
    Il est possible aussi qu'il y ai plus simple comme méthode, mais la "documentation" sur le DataBinding n'est pas des plus explicite à ce sujet.

    Voilà.
    En tout cas merci à ceux qui ont essayé de ce pencher sur mon problème.

    Cordialement,
    Julien

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    tu connais la BindingList ? elle implémente déjà IBindingList, ça ferait pas mal de code en moins à écrire par rapport à un héritage de List.
    ಠ_ಠ

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 44
    Points
    44
    Par défaut
    Re,
    Citation Envoyé par Guulh Voir le message
    Hello,
    tu connais la BindingList ? elle implémente déjà IBindingList, ça ferait pas mal de code en moins à écrire par rapport à un héritage de List.
    Et bien non je ne connaissais pas. Je suis encore novice et je me perds facilement dans Tous ces objets.
    En tout cas merci, j'y jetterai un coup d'oeil dès que je peux.

    @+
    Julien

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

Discussions similaires

  1. Algorithme O(N) de génération des suites arithmétiques à partir d'un tableau d'entiers
    Par blackbird1 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/05/2015, 16h28
  2. Tableau entre table-layout et les valeurs des TD
    Par aelmalki dans le forum Balisage (X)HTML et validation W3C
    Réponses: 17
    Dernier message: 03/12/2010, 23h35
  3. Réponses: 0
    Dernier message: 20/04/2010, 22h22
  4. [HTML] Tableau pour l'enregistrement des données
    Par ghyosmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 01/11/2005, 15h28
  5. Réponses: 6
    Dernier message: 23/05/2005, 10h47

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