Changer la sélection ListBox ne déplace pas les modifications de BindingSource vers DataSet

StackOverflow https://stackoverflow.com/questions/609052

Question

Il se peut que la réponse à cette question soit "N'utilisez pas de DataSets dactylographiés sans utiliser le navigateur de liaisons." Je suis toutefois curieux du comportement que je constate.

J'ai donc créé un formulaire dans lequel chaque contrôle a été déplacé depuis l'explorateur de sources de données. J'ai supprimé le navigateur de liaison, car il est moche et inapproprié pour ce formulaire particulier. J'ai ajouté un contrôle ListBox et défini DataSource sur BindingSource.
Notez que le contrôle ListBox n'est pas lié, il se remplit simplement à partir de BindingSource. Par magie, je ne comptais pas dessus, naviguer dans le contrôle ListBox permet de naviguer dans BindingSource et tous les autres contrôles se mettent à jour en conséquence.

Je peux apporter des modifications aux contrôles liés et appeler explicitement EndEdit sur BindingSource, puis mettre à jour la source de données via l'adaptateur de table. Fonctionne très bien.

Lorsque je modifie les contrôles liés et que je clique sur une nouvelle option dans la liste, je veux pouvoir vérifier les modifications et demander à l'enregistrement ou à la réinitialisation s'il y en a.

Voici l'étrange partie que je n'ai pas pu comprendre.

Peu importe l’événement auquel j’attache, DataSet.HasChanges ne renvoie pas true avant le deuxième changement de ListBox. J'ai cherché et essayé des dizaines de suggestions, la plupart ridicules, mais quelques-unes semblaient prometteuses. Pas de chance.

Modifier: ce n'est pas le deuxième clic qui est important, c'est lorsque vous cliquez sur l'élément d'origine (modifié).

Était-ce utile?

La solution

Depuis que j'ai posé la question, j'en ai appris un peu plus sur BindingSources, DataSets et TableAdapters.

Voici ce qui fonctionne:

    private void MyListBox_Click(object sender, EventArgs e)
    {
        this.myBindingSource.EndEdit();
        if (myDataSet.HasChanges())
        {
            if (MessageBox.Show("Save changes?", "Before moving on", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                myTableAdapter.Update(myDataSet.myDataTable);
            }
            else
            {
                myDataSet.RejectChanges();
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top