La modifica della selezione di ListBox non comporta lo spostamento delle modifiche da BindingSource a DataSet

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

Domanda

La risposta a questa domanda potrebbe rivelarsi, " Non utilizzare DataSet digitati senza utilizzare Binding Navigator. " Sono curioso, tuttavia, del comportamento che sto vedendo.

Quindi, ho creato un modulo in cui ogni controllo è stato trascinato da Explorer Origini dati. Ho eliminato Binding Navigator perché è brutto e inappropriato per questo particolare modulo. Ho aggiunto un ListBox e impostato DataSource su BindingSource.
Notare che ListBox non è associato, si sta semplicemente compilando da BindingSource. Con un po 'di magia su cui non contavo, spostarmi in ListBox sta navigando su BindingSource e tutti gli altri controlli si aggiornano di conseguenza.

Posso apportare modifiche ai controlli associati e chiamare esplicitamente EndEdit su BindingSource e quindi aggiornare DataSource tramite l'adapter della tabella. Funziona alla grande.

Quando apporto modifiche ai controlli associati e faccio clic su una nuova opzione in ListBox, voglio essere in grado di verificare le modifiche e chiedere di salvare o ripristinare se ce ne sono.

Ecco la strana parte che non sono stato in grado di capire.

Indipendentemente dall'evento a cui mi allego, DataSet.HasChanges non restituisce true fino alla seconda modifica di ListBox. Ho cercato e provato decine di suggerimenti, molti dei quali ridicoli, ma alcuni sembravano promettenti. Nessuna fortuna.

Modifica: non è significativo il secondo clic, è quando si fa di nuovo clic sull'elemento originale (modificato).

È stato utile?

Soluzione

Da quando ho posto la domanda, ho imparato qualcosa in più su BindingSources, DataSet e TableAdapters.

Ecco cosa funziona:

    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();
            }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top