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

Storcere il naso con drag'n'drop e data-binding?

Nel mio caso, non è stato così. Una delle funzionalità esposte dalla finestra Data Sources dell'IDE di VS2005 è quella di favorire un po' di drag'n'drop durante la creazione di Windows Forms che facciano uso di data-binding tra i controlli ed una datasource. Questo vale anche nel caso si utilizzino business object, e questo è davvero molto importante.

In VB6, se ricordo bene, l'unico modo di sfruttare il tandem drag'n'drop + data-binding era quello di trascinare un campo su una form completamente vuota. Tale meccanismo creava automaticamente il controllo, lo bindava ed eravamo contenti. Ehm, contenti magari proprio no, ma questo lo si capiva solo dopo!  Cosa è migliorato in VS2005? Questa tecnica rimane, ma il risultato è molto migliore.

Preparare la finestra Data Sources
La finestra Data Sources può essere visualizzata attraverso il menù Data --> Show Data Sources, equivalente a SHIFT+ALT+D. All'inizio apparirà vuota, per cui non ci rimane altro da fare che cliccare sul bottone Add New Data Source e selezionare quale tipo di datasource vogliamo gestire. A me interessa lavorare esclusivamente con business object, per cui basta selezionare Object ed andare avanti. Adesso è sufficiente selezionare l'oggetto da gestire, navigando tra tutti gli assembly referenziati dalla soluzione.

E qui comincia il bello. La finestra Data Sources mostra tutte le proprietà pubbliche del nostro oggetto, con un'icona di fianco che indica il controllo che verrà creato sulla Windows Form se trasciniamo quella proprietà. A me questo approccio non piace: sebbene siano obiettivamente nomi intelligenti, non mi piace che sia lui in automatico a dare un nome al controllo. Inoltre, aggiunge un BindingNavigator che odio, mentre il BindingSource è praticamente obbligatorio.

L'approccio migliore è quello di disegnare la Windows Form senza preoccuparsi troppo del binding. Disegnate i controlli come volete, date i nomi che preferite e via dicendo. Una delle cose che preferisco è fare drag'n'drop su un controllo pre-esistente, attivandone il binding sul business object, passando per il corrispondente BindingSource. Il codice generato dal designer è estremamente pulito:

this.txtHowManyFaults.DataBindings.Add
    (
new System.Windows.Forms.Binding("Text", this.hockeyPlayerBindingSource, "HowManyFaults", true));

La riga qui sopra è tratta da un progetto sample. La TextBox txtHowManyFaults è bindata alla proprietà HowManyFaults, esposta dall'oggetto referenziato nel hockeyPlayerBindingSource. Questo ci permette di progettare a design-time tutto il data-binding che ci serve, senza troppe sporcizie.

Migliorare il data-binding generato a design-time
Il lavoro fatto a design-time potrebbe non bastare. La porzione di codice riportata sopra crea implicitamente un oggetto Binding, che però espone altre proprietà interessanti, che non possiamo settare a design-time. Di solito, per risolvere questa questione uso l'evento Load della Windows Form, prelevo l'oggetto Binding sul controllo interessato e lo manipolo come voglio. Per esempio:

private void FormHockeyPlayer_Load(object sender, EventArgs e)
{
    Binding bnd = 
this.txtHowManyFaults.DataBindings["Text"];
    bnd.FormatString = "000";
}

Qui sopra, ottengo il riferimento all'oggetto Binding che è stato creato a design-time, e lo perfeziono assegnando una FormatString per la proprietà stessa (ma potrei modificare anche NullValue, o tutto quello che ci serve). Tecnicamente, dovrei continuare per ogni binding e settare le proprietà come voglio. Sull'evento Load vado a settare anche i DataSource di ogni BindingSource, cosa che ovviamente non abbiamo potuto fare a design-time, perchè in quel frangente non esiste ancora alcuna istanza dei nostri business object. Quindi, il codice completo è il seguente:

private void FormHockeyPlayer_Load(object sender, EventArgs e)
{
    Binding bnd = 
this.txtHowManyFaults.DataBindings["Text"];
    bnd.FormatString = "000";

    
this.hockeyPlayerBindingSource.DataSource = player;
    
this.faultsBindingSource.DataSource = player.Faults;
}

Conclusioni
Ci sarebbe ancora qualcosa su cui parlare, ma adesso non ne ho il tempo. Ne parlerò un'altra volta. Quello che ho voluto fare oggi è evidenziare che tutto sommato il drag'n'drop ha davvero i suoi vantaggi, specialmente se sfruttato con i business object del vostro dominio applicativo. Buona parte del lavoro può essere fatta a design-time usando solo il mouse, senza perdere tempo sulla tastiera. Ancora una volta, però, il vero sviluppatore lo si riconosce dalla sua capacità di mettere mano al codice e di perfezionare quello che il designer ha fatto per noi.

powered by IMHO 1.2

Print | posted on venerdì 26 maggio 2006 16:14 | Filed Under [ Tecnologia ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET