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.