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 :

Nouvel enregistrement pas retrouvé d'un formulaire à l'autre


Sujet :

C#

  1. #1
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 131
    Points : 2 237
    Points
    2 237
    Par défaut Nouvel enregistrement pas retrouvé d'un formulaire à l'autre
    Bonjour tout le monde,

    Dans mon formulaire principal, j'ai un BindingSource lié à une table de DataSet1, et une DataGridView est liée à ce BindingSource.

    À l'ouverture de l'application, les données s'affichent dans la DataGridView, jusque là tout se passe bien.

    Maintenant, je veux insérer un nouvel enregistrement.

    Je trouve que c'est plus clair pour l'utilisateur de le faire avec un formulaire dédié, que j'ouvre en mode dialogue dans le code d'un bouton du formulaire principal.

    Après ça, le formulaire principal retrouve le nouvel enregistrement dans le DataSet, mais pas dans le BindingSource qui pourtant est basé dessus, et donc pas non plus dans DataGridView, ce qui, je pense que vous avez suivi, serait le but.

    J'ai cru qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bindingSource1.SuspendBinding()
    bindingSource1.ResumeBinding()
    j'allais corriger ça, mais ça n'a pas l'air d'être le cas.

    BindingSource a une méthode Add. Alors je me suis dit bonne pioche, je vais me servir de ça.

    Mais ça lève une exception : le contenu de bindingSource1 ne sera plus homogène, ce que j'essaie d'insérer n'est pas du même type que le reste.

    Uh ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ? bindingSource1.List[0].GetType()
    {Name = "DataRowView" FullName = "System.Data.DataRowView"}
    S'ensuit une littérature, si ça branche quelqu'un je pourrai copier ça.

    Ah, oui, évidemment, ce n'était pas un DataRowView, que je tentais d'ajouter, mais mon objet Repas.

    dataSet1 et bindingSource1 ont été créés par l'interface graphique, pour le bindingSource1 j'ai renseigné DataSource = DataSet1 (et le nom de la table dans DataMember).

    Bon, alors première étape, est-ce que vous avez compris ce que j'ai dit ?
    Et si oui, savez-vous me dire où je me suis trompé ?

    Des fois que ça aide, il me semble qu'ici quelqu'un a en gros le même problème que moi :
    https://stackoverflow.com/questions/...ata-in-another

    Projet WinForms basé sur .Net Framework 4.7.2, avec données sur SQL Express
    Microsoft Visual Studio Community*2022 (64*bits) - Current
    Version 17.6.4

    Pour ce qui est de .Net Framework, la version que je donne ci-dessus apparaît dans les propriétés du projet.
    Dans "À propos de Visual Studio", c'est 4.8.09037.

    SQL Server Management Studio 15.0.18386.0
    SQL Server Management Objects (SMO) 16.100.46437.65
    Outils clients Microsoft Analysis Services 15.0.19618.0
    Microsoft Data Access Components (MDAC) 10.0.19041.3208
    Microsoft MSXML 3.0 6.0
    Microsoft .NET Framework 4.0.30319.42000
    Système d'exploitation 10.0.19045

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Essaye peut-être avec bindingSource1.ResetBinding(false)
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 131
    Points : 2 237
    Points
    2 237
    Par défaut
    Ça me rappelait un peu quelque chose parce que j'avais déjà essayé, hélas ça ne donne pas le nouvel enregistrement.

    J'ai aussi essayé avec ResetBinding(true), plus parce que ça ne mange pas de pain que par réelle conviction.

    Par ailleurs j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataView view = new DataView(ds.Repas);
    view.RowStateFilter = DataViewRowState.CurrentRows;
    et j'ai un peu joué sur RowStateFilter, dans Added il n'y a rien, c'est encore CurrentRows le plus coopératif.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    peut-être voir le processus décrit à la fin de la doc https://learn.microsoft.com/en-us/do...ramework-4.7.2

  5. #5
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 131
    Points : 2 237
    Points
    2 237
    Par défaut
    J'ai écrit une procédure pour l'événement DataSet1_MergeFailed, qui ne semble pas s'exécuter.

    Sur bindingSource1.ResetBindings() j'ai mis un point d'arrêt, là je vois qu'on exécute Row_Enter, mais sur le dernier enregistrement précédemment existant (le premier affiché dans la liste).

    Ce serait intéressant d'exécuter Row_Enter avec la nouvelle date.

  6. #6
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 131
    Points : 2 237
    Points
    2 237
    Par défaut
    De guerre lasse j'ai mis ça dans le code du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!bindingSource1.Contains(new Repas { LaDate = DateTime.Parse(view[0]["Ladate"].ToString()) }))
    {
        bindingSource1.ResetBindings(false);
    }
    Mais ça continue de s'exécuter jusqu'à ce que je crie grâce.

    (avant j'ai essayé avec ResetBindings(true)).

    dans DateTime.Parse(view[0]["Ladate"].ToString())
    j'ai bien la nouvelle date.

    Tiens, au départ c'était LaDate, apparemment on n'est pas à cheval sur la casse.

    On dirait que quelque part une propriété est verrouillée, il faut que j'arrive à réaliser laquelle. Et surtout par quoi.

    ***

    Souvent, au moment d'exécuter, l'application échoue à compiler, et je dois effacer le fichier Form1.resx : il échoue à afficher les valeurs de ucTension1.DataSource et printForm1.PrinterSettings

    Pour cette dernière ça fait un bon moment, pour l'autre c'est plus récent.

    Après avoir effacé le fichier Form1.Resx, dans Form1.designer.cs, je dois mettre en commentaire l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                this.printForm1.PrinterSettings = ((System.Drawing.Printing.PrinterSettings)(resources.GetObject("printForm1.PrinterSettings")));

  7. #7
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 131
    Points : 2 237
    Points
    2 237
    Par défaut
    Bon, problème réglé.

    J'ai viré le BindingSource, et l'insertion de l'enregistrement se fait avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void btnNewDay_Click(object sender, EventArgs e)
    {
        frmInsertDate frm = new frmInsertDate();
        frm.ShowDialog(Control.FromHandle(this.Handle));
        DataSet1 ds = new DataSet1();
        ds.Tables["Repas"].AcceptChanges();
        RepasTableAdapter ta = new RepasTableAdapter();
        ta.Fill(ds.Repas);
        dataGridView1.DataSource = null;
        dataGridView1.Refresh();
        dataGridView1.DataSource = ds.Repas;
        dataGridView1.Refresh();
    }
    Et aussi sec, la nouvelle ligne apparaît en haut de la DataGridView.

    Je suppose que parfois l'objet BindingSource doit être utile, mais là ce n'était pas un bon exemple.

    J'ai du mal à me représenter dans quel cas l'utiliser, du coup.

    ***
    Au passage je réalise une chose : c'est un nouveau DataSet1, que j'ai créé par code. Donc, il n'est pas verrouillé à ce qu'il contenait avant l'insertion d'enregistrement.

    ***
    Hum ... Je suppose que pour optimiser l'utilisation de la mémoire, il serait sage de "disposer" de l'ancien DataSet1 ?

    ***
    Ah, ben oui ; à la fin du traitement du bouton :

  8. #8
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bon, je viens après la bataille, mais tant pis

    Concernant le BindingSource : cette classe peut servir à faire du one-way binding ou du two-way binding en fonction de sa source :
    • one-way binding : toute modification effectuée sur le binding source est répercutée sur la collection sous-jacente (grosso modo, le DataSource)
    • two-way binding : toute modification effectuée sur le binding source est répercutée sur la collection sous-jacente ET toute modification sur la collection sous-jacente est répercutée sur le BindingSource


    Pour activer le Two-Way Binding, il faut que le DataSource implémente l'interface IBindingList. Ce n'est malheureusement pas le cas du DataSet. C'est pour cela que toute modification du dataset n'est pas automatiquement répercutée sur le bindingsource.

    Normalement, un bindingSource.ResetBinding(false) est sensé rechercher les modifications et mettre à jour le binding source. Par contre, comme le DataSource de la bindingSource est un dataset, il faut peut être s'assurer avant que les changements ont été validées (méthode AcceptChanges())


    Sinon, au passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (!bindingSource1.Contains(new Repas { LaDate = DateTime.Parse(view[0]["Ladate"].ToString()) }))
    {
        bindingSource1.ResetBindings(false);
    }


    Sauf à ce que Repas soit une struct OU implémente la méthode Equals pour faire une comparaison par valeur et non par référence, l'égalité ne sera jamais vraie, et un objet sera créé à chaque itération dans cette boucle infinie.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 131
    Points : 2 237
    Points
    2 237
    Par défaut
    Bonjour,

    En fait non, ce n'était pas tout-à-fait fini, et j'allais venir faire une mise à jour. Je me suis rendu compte depuis que le BindingSource était utilisé pour mettre à jour d'autres contrôles, de type TextBox.

    Tant que je faisais la mise à jour sur le BindingSource d'abord, le DataSet était mis à jour en même temps (pas toujours de façon satisfaisante sinon il n'y aurait pas eu le fil), dans l'autre sens ... il y a des surprises.

    Et je me suis retrouvé dans une situation inattendue : après mise à jour du DataSet j'ai bien les données à jour dans le BindingSource, mais pas du BindingSource vers les contrôles.

    Et dans DataGridView_RowEnter, je dois me livrer à ce genre de gymnastique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txbObservations.Text = ((DataRowView)((DataView)bindingSource1.List)[e.RowIndex])["Observations"].ToString();
    avec en fait une factorisation ensuite, pour mettre à jour plusieurs TextBoxes sur le même modèle, en passant juste en paramètre la partie du nom après le préfixe, et le DataGridViewCellEventArgs.

    Donc ... le BindingSource s'est bien mis à jour (depuis la base de données, après que le DataSet se soit vu appliquer un AcceptChanges), mais pour ce qui est des contrôles il a fallu donner un coup de pouce.

    Le txbObservations.Refresh() ne suffit pas, et on peut même s'en passer.

    Mais créer un nouveau DataSet n'était pas une si bonne idée, car du coup le BindingSource n'était plus mis à jour, donc les TextBoxes non plus.

    Du coup voici la mise à jour du code du bouton pour la nouvelle date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                frmInsertDate frm = new frmInsertDate();
                frm.ShowDialog(Control.FromHandle(this.Handle));
                dataSet1.Tables[0].Rows.Clear();
                RepasTableAdapter ta = new RepasTableAdapter();
                ta.Fill(dataSet1.Repas);
    Donc, on ne supprime pas le DataSet, mais on le vide et on le remplit de nouveau, pour qu'il soit à jour.

    Et c'est là que donc le BindingSource est bien mis à jour sans que je m'en occupe, mais pas les TextBoxes, curieusement.

    Jusqu'à ce que je le fasse dans DataGridView_RowEnter, et cette fois on dirait que ça y est.

    Dans la mesure où j'ai dû aller chercher l'information dans le BindingSource pour mettre à jour les contrôles, peut-être que j'aurais pu la chercher dans le DataSet, et la syntaxe aurait même été plus légère. Mais j'ai peut-être oublié quelque chose, qui rendrait au BindingSource son caractère automatique.

    Pourtant, dans Form1.Designer.cs, j'ai bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this.txbObservations.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, "Observations", true));
    Merci pour cet éclairage, et merci à tous ceux qui ont apporté leur contribution.

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    J'ai fais un petit exemple complet mettant en oeuvre le two-way binding

    J'ai mis quelques commentaires dans le code.


    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
     
    using System.ComponentModel;
     
    namespace TestDataGridView
    {
        internal static class Program
        {
            [STAThread]
            static void Main()
            {
                ApplicationConfiguration.Initialize();
                Application.Run(new MyForm());
            }
        }
     
        public class MyForm : Form
        {
            /// <summary>
            ///  Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            ///  Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            #region Windows Form Designer generated code
     
            /// <summary>
            ///  Required method for Designer support - do not modify
            ///  the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                components = new System.ComponentModel.Container();
                nameTextBox = new TextBox();
                firstNameTextBox = new TextBox();
                nameLabel = new Label();
                firstNameLabel = new Label();
                personListDataGridView = new DataGridView();
                nameDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
                firstNameDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
                personBindingSource = new BindingSource(components);
                newPersonButton = new Button();
                ((System.ComponentModel.ISupportInitialize)personListDataGridView).BeginInit();
                ((System.ComponentModel.ISupportInitialize)personBindingSource).BeginInit();
                SuspendLayout();
                // 
                // nameTextBox
                // 
                nameTextBox.Location = new Point(78, 24);
                nameTextBox.Name = "nameTextBox";
                nameTextBox.Size = new Size(174, 23);
                nameTextBox.TabIndex = 0;
                // 
                // firstNameTextBox
                // 
                firstNameTextBox.Location = new Point(78, 53);
                firstNameTextBox.Name = "firstNameTextBox";
                firstNameTextBox.Size = new Size(174, 23);
                firstNameTextBox.TabIndex = 1;
                // 
                // nameLabel
                // 
                nameLabel.AutoSize = true;
                nameLabel.Location = new Point(12, 27);
                nameLabel.Name = "nameLabel";
                nameLabel.Size = new Size(37, 15);
                nameLabel.TabIndex = 2;
                nameLabel.Text = "name";
                // 
                // firstNameLabel
                // 
                firstNameLabel.AutoSize = true;
                firstNameLabel.Location = new Point(12, 56);
                firstNameLabel.Name = "firstNameLabel";
                firstNameLabel.Size = new Size(60, 15);
                firstNameLabel.TabIndex = 3;
                firstNameLabel.Text = "first name";
                // 
                // personListDataGridView
                // 
                personListDataGridView.AllowUserToResizeColumns = false;
                personListDataGridView.AllowUserToResizeRows = false;
                personListDataGridView.AutoGenerateColumns = false;
                personListDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                personListDataGridView.Columns.AddRange(new DataGridViewColumn[] { nameDataGridViewTextBoxColumn, firstNameDataGridViewTextBoxColumn });
                personListDataGridView.DataSource = personBindingSource;
                personListDataGridView.Location = new Point(12, 82);
                personListDataGridView.Name = "personListDataGridView";
                personListDataGridView.RowTemplate.Height = 25;
                personListDataGridView.Size = new Size(409, 284);
                personListDataGridView.TabIndex = 4;
                // 
                // nameDataGridViewTextBoxColumn
                // 
                nameDataGridViewTextBoxColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                nameDataGridViewTextBoxColumn.DataPropertyName = "Name";
                nameDataGridViewTextBoxColumn.HeaderText = "Name";
                nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn";
                // 
                // firstNameDataGridViewTextBoxColumn
                // 
                firstNameDataGridViewTextBoxColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                firstNameDataGridViewTextBoxColumn.DataPropertyName = "FirstName";
                firstNameDataGridViewTextBoxColumn.HeaderText = "FirstName";
                firstNameDataGridViewTextBoxColumn.Name = "firstNameDataGridViewTextBoxColumn";
                // 
                // personBindingSource
                // 
                personBindingSource.DataSource = typeof(Person);
                // 
                // newPersonButton
                // 
                newPersonButton.Location = new Point(12, 372);
                newPersonButton.Name = "newPersonButton";
                newPersonButton.Size = new Size(121, 23);
                newPersonButton.TabIndex = 5;
                newPersonButton.Text = "new person";
                newPersonButton.UseVisualStyleBackColor = true;
                newPersonButton.Click += newPersonButton_Click;
                // 
                // Form1
                // 
                AutoScaleDimensions = new SizeF(7F, 15F);
                AutoScaleMode = AutoScaleMode.Font;
                AutoSize = true;
                ClientSize = new Size(433, 407);
                Controls.Add(newPersonButton);
                Controls.Add(personListDataGridView);
                Controls.Add(firstNameLabel);
                Controls.Add(nameLabel);
                Controls.Add(firstNameTextBox);
                Controls.Add(nameTextBox);
                Name = "Form1";
                Text = "Form1";
                ((System.ComponentModel.ISupportInitialize)personListDataGridView).EndInit();
                ((System.ComponentModel.ISupportInitialize)personBindingSource).EndInit();
                ResumeLayout(false);
                PerformLayout();
            }
     
            #endregion
     
            private TextBox nameTextBox;
            private TextBox firstNameTextBox;
            private Label nameLabel;
            private Label firstNameLabel;
            private DataGridView personListDataGridView;
            private Button newPersonButton;
            private BindingSource personBindingSource;
            private DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn;
            private DataGridViewTextBoxColumn firstNameDataGridViewTextBoxColumn;
     
            private static int _counter = 0;
            private IList<Person> _persons;
     
            public MyForm()
            {
                InitializeComponent();
     
                // Remplacer ici la création de la liste par une List<Person>, et on perd le two-way binding
                //_persons = new List<Person>(this.GetPersons());
                _persons = new BindingList<Person>(this.GetPersons());
                this.personBindingSource.DataSource = _persons;
     
     
                this.firstNameTextBox.DataBindings.Add(new Binding("Text", this.personBindingSource, "FirstName", true));
                this.nameTextBox.DataBindings.Add(new Binding("Text", this.personBindingSource, "Name", true));
            }
     
            private List<Person> GetPersons()
            {
                return new List<Person>
                {
                    new Person() { Name = "John", FirstName = "Doe" },
                    new Person() { Name = "Jane", FirstName = "Doe" },
                    new Person() { Name = "John", FirstName = "Smith" },
                    new Person() { Name = "Jane", FirstName = "Smith" },
                };
            }
     
            public Person NewPerson()
            {
                _counter++;
                return new Person() { FirstName = $"TATA {_counter}", Name = "TOTO" };
            }
     
            private void newPersonButton_Click(object sender, EventArgs e)
            {
                // Ici, on ajoute un nouvel élément à la liste source du BindingSource
                // et pas au BindingSource lui-même. Le BindingSource se charge de mettre
                // à jour la liste des éléments affichés dans le DataGridView.
                // C'est possible car la liste source est implémente l'interface IBindingList<T>
                Person person = NewPerson();
                _persons.Add(person);
            }
        }
    }
    Je ne sais pas si le DataSet est indispensable dans ton code, mais si tu peux t'en passer, le BindingList va te simplifier beaucoup de chose
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/11/2022, 15h44
  2. Réponses: 0
    Dernier message: 15/05/2020, 14h04
  3. Réponses: 3
    Dernier message: 09/08/2014, 06h42
  4. Réponses: 9
    Dernier message: 04/06/2012, 10h28
  5. enregistrement des données d'une formulaire à une autre
    Par rihab007 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/06/2008, 12h32

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