Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 118, comments - 95, trackbacks - 697

[Spring.NET #28] Spring.Core, Validation Framework e WinForm

Il framework di supporto per le WinForms si chiama Spring.NET RichClient ed è un progetto disponibile a parte rispetto a Spring.NET, sviluppato da Harald Radi. Ad oggi l'ultima versione scaricabile dal sito, la 0.2.1, è un po vecchiotta e presenta diversi problemi, quindi vi consiglio di scaricare l'ultima versione del codice sorgente direttamente dal trunk. Anche in questo questo post mi limiterò a parlare solo dell'integrazione fra le WinFroms ed il Validation Framework, altri aspetti riguardanti le applicazioni Windows e Spring.NET verrànno trattati in post futuri. Finite queste precisazioni iniziamo creando un'applicazione Windows ed aggiungendo i riferimenti alle librerie Spring.Core e Spring.Windows. Continuiamo aggiungendo le ormai consuete classi Person, AddressInfo, il file di risorsa Messages.resx ed il file App.config (contenente la solita configurazione del MessageSource e delle regole di validazione delle classi di domino). Il codice di tutti questi file è presente nei vari post precedenti.

post_validation_win01

A questo punto dobbiamo creare una nuova Form ereditando dalla ValidatingFrom fornita da Spring.NET, alla quale daremo il nome PersonEditForm. Per facilitare e velocizzare l'esempio utilizzeremo il DataBinding aggiuingendo alla Form un controllo BindingSource, tramite il wizard di Visual Studio impostiamo la proprietà DataSource su Person, quindi proseguiamo trasciniamo dalla Data Sources Toolbox i vari controlli necessari. Proseguiamo aggiungendo un nuovo controllo ValidatorAdapter (namespace Spring.Windows.Validation), collegandolo tramite la proprietà ValidatorName all'id della regola di validazione da utilizzare, in questo caso PersonValidator. Per le TextBox: FirstName, DateOfBirth,  City e PostalCode, tramite la proprietà Providrs on ErrorRenderer, indichiamo quale gruppo (Provider) di ErrorMessage visualizzare, impostiamo rispettivamente: FirstNameMessage, DateOfBirthMessage, CityMessage e PostalCodeMessage. Al termine della procedura la Form risulterà simile a quella mostrata in figura.

Spostiamoci nel codice della Form, aggiungiamo un membro di tipo Person, usiamolo come DataSource ed impostiamo i metodi di risposta per l'evento Click di ogni Button:

   1:  using System;
   2:  using System.Windows.Forms;
   3:  using Spring.Windows.Forms;
   4:   
   5:  namespace SpringSeries.Core.ValidationWindowsForms{
   6:      public partial class PersonEditForm : ValidatingForm {
   7:          private Person _person = new Person(1);
   8:   
   9:          public PersonEditForm() {
  10:              InitializeComponent();
  11:          }
  12:   
  13:          private void PersonEditForm_Load(object sender, System.EventArgs e) {
  14:              personBindingSource.DataSource = _person;
  15:          }
  16:   
  17:          private void btnSave_Click(object sender, System.EventArgs e) {
  18:              this.DialogResult = DialogResult.OK;
  19:              this.Close();
  20:          }
  21:   
  22:          private void btnCancel_Click(object sender, System.EventArgs e) {
  23:              this.DialogResult = DialogResult.Cancel;
  24:              this.Close();
  25:          }
  26:      }
  27:  }

Effettuiamo, sempre nella Form, l'override del metodo GetFormBackingObject, all'interno del quale non facciamo altro che restituire l'oggetto da validare:

   1:  protected override object GetFormBackingObject() {
   2:      return _person;
   3:  }

Spring.NET si occuperàdi istanziare un Validator, il quale verrà utilizzato all'interno del metodo OnClosing della From per effettuare la validazione, passandogli come parametro l'oggetto restituito dal metodo GetFormBackingObject. E' importante sottolineare che la validazione verrà effettuata soltato quando il DialogResult della Form è diverso dallo stato di Cancel. La classe Program essere modificata in modo da ereditare dalla classe Application fornita da Spring.NET. Nel metodo Main invochiamo il metodo InitializeContext(), necessario per inizializzare correttamente l' ApplicationContext. 

   1:  using System;
   2:  using Spring.Windows;
   3:   
   4:  namespace SpringSeries.Core.ValidationWinForm
   5:  {
   6:      public class Program : Application
   7:      {
   8:          [STAThread]
   9:          private static void Main()
  10:          {
  11:              Program _program = new Program();
  12:              _program.InitializeContext();
  13:              _program.Run(new PersonEditForm());
  14:          }
  15:      }
  16:  }

Eseguiamo l'applicazione, clicchiamo il pulsante OK e potremo notare un risultato simile a questo:

post_validation_win02

Technorati Tag:

Print | posted on sabato 16 febbraio 2008 19:53 | Filed Under [ .NET OpenSource Spring.NET ]

Powered by:
Powered By Subtext Powered By ASP.NET