2012-12-21 4 views
12

Sto passando un elenco di clienti tramite il costruttore. Quindi è un database per un ListBox. Dispongo anche di un database per consentire la modifica del nome del cliente, aggiornare automaticamente il ListBox e l'elenco dei clienti, il che è molto bello.Come annullare le modifiche apportate tramite Databinding?

Tuttavia, desidero che le modifiche non vengano mantenute se l'utente fa clic sul pulsante Annulla. Sto dicendo al programma di impostare l'elenco dei clienti a quello vecchio, ma non funziona, quando apro di nuovo la finestra il ListBox mostra i nomi dei clienti aggiornati piuttosto che i vecchi nomi.

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Collections.Generic; 

namespace Bingding_Test 
{ 
    public partial class Form_Customers : Form 
    { 
     List<Customer> customers; 
     List<Customer> old_customers; 
     BindingSource bs = new BindingSource(); 

     public Form_Actors(List<Customer> _customers) 
     { 
      InitializeComponent(); 

      customers = _customers; 
      old_customers = new List<Customer>(_customers); 

      bs.DataSource = customers; 
      listBox1.DataSource = bs; 
      listBox1.DisplayMember = "Name"; 

      txtb_name.DataBindings.Add("Text", bs, "Name"); 
     } 

     void Btn_cancelClick(object sender, EventArgs e) 
     { 
      actors = old_customers; 
      this.Close(); 
     } 

     void Btn_saveClick(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 
    } 
} 

Qualcuno sa cosa posso fare per assicurarmi che tutte le modifiche non vengano salvate quando faccio clic sul pulsante Annulla?

risposta

5

Per quanto ho capito, la tua domanda riguarda la possibilità di annullare le modifiche apportate al tuo List<Customer> tramite txtb_name. Per impostazione predefinita, DataBindings applica automaticamente le modifiche, al termine della convalida. È possibile controllare DataSourceUpdateMode a modificare questo comportamento, in modi diversi, a seconda dell'implementazione:

  1. Prima di impostare eventuali attacchi su txtb_name (dovrebbe essere possibile con come il vostro codice è scritto):

    txtb_name.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never; 
    
  2. Dopo aver impostato binding su txtb_name (possibile anche con il codice):

    foreach(Binding b in txtb_name.DataBindings) 
    { 
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never; 
    } 
    
  3. Dopo aver impostato i binding utilizzando BindingManagerBase (CurrencyManager o PropertyManager) - un approccio più generico, in quanto consente di gestire molti controlli in un'unica operazione, può essere utile quando il progetto si evolve.

    foreach(Binding b in bindingManager.Bindings) 
    { 
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never; 
    } 
    

Per complex setups è possibile utilizzare ResumeBinding e SuspendBinding di BindingManagerBase, possono essere sovrascritte per fornire un comportamento personalizzato sulla convalida, per esempio, se più campi deve convalidato come un intero pezzo logica, piuttosto che uno da uno.

Si prega di notare che, anche se si imposta DataSourceUpdateMode = DataSourceUpdateMode.Never, ci sarà sempre un aggiornamento che lo attraversa, according to MSDN (vedi sezione Osservazioni):

Anche quando la modalità di aggiornamento è impostata su Mai, l'origine dei dati sarà aggiornato quando viene creato per la prima volta l'associazione, quindi si verificherà sempre almeno un aggiornamento .

Se questo non è accettabile per te, vale a dire si sta costruendo un programma di classe enterprise con requisiti molto rigorosi, suggerisco la manipolazione tutto manualmente - smettere di usare DataBindings.

Il credito per il suggerimento allo DataSourceUpdateMode va a Frederik Gheysels per il suo articolo su WinForms: DataBinding on a cancellable Dialog Form.

+0

Quando si dice bind manualmente, vuoi dire di non usare affatto il databinding? Ad esempio -> textBox1.Text = variable.strName. – TheScholar

+0

@TheScholar: sembra che mi sia sbagliato, cioè puoi implementare l'annullamento con DataBindings - vedi la mia modifica. – Neolisk

+0

Grazie Neolisk! Analizzerò questo aspetto e vedrò se risolve il mio problema: D – TheScholar