Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

Il BindingHistoryManager per gli undo & redo

Nel mio programma di fatturazione ho incorporato una classe creata da me davvero utile. Vorrei farlo diventare un bel componente da droppare sulla Windows Forms. Si tratta in pratica di una classe che incorpora tutta la logica necessaria ad aggiungere le funzioni di Redo ed Undo. Lavora a stretto contatto con il data-binding tra un business object ed i controlli di una Windows Form, passando da un BindingSource opportuno.

La particolarità è che il business object deve implementare l'interfaccia IMementoConsumer, che come descrivevo qua richiede l'implementazione di due metodi SetMemento e CreateMemento.

public interface IMementoConsumer
{
    
void SetMemento(Memento m);
    Memento CreateMemento();
}

Il costruttore della mia classe è questo:

public BindingHistoryManager(BindingSource BindingSource)
{
    _bindingSource = BindingSource;
    _businessObject = (IMementoConsumer)_bindingSource.DataSource;
    _bindingComplete = 
true;
}

Il BindingHistoryManager lavora con il BindingSource, con il business object impostato nel corrispondente DataSource. Notare il casting diretto all'interfaccia IMementoConsumer, che è un vincolo necessario. Per tutto il ciclo di vita della mia classe, mantendo un riferimento al business object. Quando si scatena l'evento CurrentItemChanged del BindingSource, non faccio altro che usare il BindingHistoryManager per memorizzare un memento del business object. Sul form il codice è scarso, pulito e molto logico:

private void srcBS_CurrentItemChanged(object sender, EventArgs e)
{
    _history.Add(_history.CreateMemento());
}

La chiamata al metodo CreateMemento viene delegata al business object che, come detto sopra, deve implementare l'interfaccia corretta. Stessa logica per gli undo e i restore. All'interno di BindingHistoryManager, il metodo SetPreviousManager è implementato come segue:

public void SetPreviousMemento()
{
    
if (_historyPosition == 0) return;

    Memento m = 
this[--_historyPosition];
    _bindingComplete = 
false;
    _businessObject.SetMemento(m);
    _bindingSource.ResetCurrentItem();
    _bindingComplete = 
true;
}

Mi piacerebbe rendere disponibile questo mio piccolo lavoretto: se lavorate con business object e data-binding a stretto contatto, secondo me può essere davvero utile! Devo solo controllare che funzioni anche con controlli più particolari (ComboBox, DateTimePicker, etc.), e poi siamo a posto.

powered by IMHO 1.3

Print | posted on giovedì 4 maggio 2006 02:01 | Filed Under [ Tecnologia ]

Feedback

Gravatar

# E' pronto il logo

05/05/2006 21:55 | Technology Experience
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET