La modifica della selezione di ListBox non comporta lo spostamento delle modifiche da BindingSource a DataSet
-
03-07-2019 - |
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).
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();
}
}
}