Transmettre les données d'un a un autre form

cs_Lorine Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 novembre 2009 - 5 oct. 2009 à 20:39
cs_Lorine Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 novembre 2009 - 7 oct. 2009 à 11:31
Bonjour,
J'ai un form dans lequel j'ai un menu avec
* charger la base de donnée
* Accès au deuxième form
Et une datagridview

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestCSharp2
{
    public partial class Test : Form
    {
        public System.Windows.Forms.BindingSource customersBindingSource;
        public Test()
        {
            InitializeComponent();
        }
        private void Test_Load(object sender, EventArgs e)
        {
        }
        private void chargerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.customersTableAdapter.Fill(this.northwindDataSet.Customers);
        }
        private void deuxiemeFormToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Test2 f2 = new Test2(this);
            f2.Show();
            this.Hide();
        }
    }
}

Mon deuxième form a 4 label avec 4 textBox et 4 boutons qui donne quelque chose comme
Label1 - textBox1
Label2 - textBox2
Label3 - textBox3
Label4 - textBox4

Bt1 - Bt2 - Bt3 - Bt4
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestCSharp2
{
    public partial class Test2 : Form
    {
        Test _parent;
        public Test2(Test form)
        {
            _parent = form;
            InitializeComponent();
        }

        private void Test2_Load(object sender, EventArgs e)
        {
            this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "CustomerID", true));
            this.textBox2.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "CompanyName", true));
            this.textBox3.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "ContactName", true));
            this.textBox4.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "ContactTitle", true));
        }
        private void Test2_FormClosing(object sender, FormClosingEventArgs e)
        {
            _parent.Show();
            this.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            _parent.customersBindingSource.MovePrevious();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            _parent.customersBindingSource.MoveNext();
        }
        private void button3_Click_1(object sender, EventArgs e)
        {
            _parent.customersBindingSource.MoveFirst();
        }
        private void button4_Click_1(object sender, EventArgs e)
        {
            _parent.customersBindingSource.MoveLast();
        }
    }
}

la connexion se fait sans soucis,
je peux charger, choisir une ligne, afficher mon deuxième form avec les donner de ma ligne
et naviguer du premier au dernier et du précédent au suivant.
le hic ce produit lorsque je ferme mon deuxième form pour revenir au premier form.
là il me montre cette partie de code
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing); // il souligne celle-ci !!
        }

et me dis que "L'exception InvalideOperation n'a pas été gérée"
comment faire pour revenir au premier form avec la ligne sur la quel je me suis arrêté dans le deuxième?
Merci de votre aide

4 réponses

cs_Psych0 Messages postés 30 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 22 juin 2010 1
6 oct. 2009 à 14:24
Ce que je te conseille, c'est d'aller lire le tutoriel de Bidou sur le passage de paramètres entre deux forms.

http://www.csharpfr.com/codes/PASSAGE-PARAMETRES_26735.aspx

Ensuite, dans ton cas bien précis, ce qui est envisageable, c'est qu'au niveau de ta 2e form tu t'abonnes à l'événement FormClosing et que dans la gestion de cet événement tu récupères l'id de la ligne sélectionnée que tu enverras à l'autre form grâce au passage de paramètres.

J'ai un peu la flemme de le faire en code là tout de suite, j'espère que j'ai été assez clair et que ça t'aidera ;-)
0
cs_Lorine Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 novembre 2009
7 oct. 2009 à 09:44
Je dois dire que je ne vois pas ou tu veux en venir avec le FormClosing
Je n'ai rien déclarer dans mon Form 2 dans le quel stocker les données en cours d'utilisation.
Je n'utilise que les éléments du Form 1.

J'espère que la forme est revenue car je comprend mieux le code que des explications

Merci
0
cs_Psych0 Messages postés 30 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 22 juin 2010 1
7 oct. 2009 à 11:01
Ok, désolé.

C'est ta phrase "comment faire pour revenir au premier form avec la ligne sur la quel je me suis arrêté dans le deuxième? " qui m'a induit en erreur.

Sinon pour ton erreur, j'ai tenté de recréer vite fait ton projet et j'ai eu une erreur également sur la même ligne, mais différente de la tienne :

Cross-thread operation not valid: Control 'label4' accessed from a thread other than the thread it was created on.

La manière la plus rapide pour passer cette erreur étant de setter la propriété CheckForIllegalCrossThread à false dans ta form test2.

Cependant je ne saurais que trop te conseiller d'éviter d'accéder à des propriétés / controles de ta form n°1 depuis ta form 2 et inversement.

Dans le cas présent je trouve plus "propre" que la lecture des infos en db se fasse dans la form2, ou elles sont utilisées.

Mais ce n'est que mon avis personnel, évidement.

Bonne continuation.
0
cs_Lorine Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 novembre 2009
7 oct. 2009 à 11:31
Merci beaucoup
comme dit voilà mon code dans le form 2 avec la ligne ajouter
        private void Test2_Load(object sender, EventArgs e)
        {
            this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "CustomerID", true));
            this.textBox2.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "CompanyName", true));
            this.textBox3.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "ContactName", true));
            this.textBox4.DataBindings.Add(new System.Windows.Forms.Binding("Text", _parent.customersBindingSource, "ContactTitle", true));
            Control.CheckForIllegalCrossThreadCalls = false; // Ligne ajouter!!
        }
0
Rejoignez-nous