Blog Stats
  • Posts - 7
  • Articles - 0
  • Comments - 138
  • Trackbacks - 0

 

Friday, December 9, 2005

Il setting mancato

 In Visual Studio  2005  è immediato gestire le impostazioni della propria applicazione. Infatti il designer offre la possibilità di impostare un binding (mediante la sezione application settings dell'editor di proprietà ) fra le proprietà dei componenti e il file di impostazioni dalla propria applicazione.  Non voglio spiegare come funziona il tutto (è ampiamente spiegato nell'help) ma voglio esporre un piccolo problema in cui mi sono imbattuto.

Utilizzando il nuovo e colorato ToolStripMenuItem, è possibile creare dei menù con a lato il segno di spunta. Supponiamo di voler memorizzare nel file lo stato del ToolStripMenuItem. In un primo momento, preso da pigrizia, utilizzo il property editor, e collego la proprietà "CheckState" ad un campo del mio file di impostazione. Scrivo il codice per salvare il tutto nell'evento formclosing, compilo la mia applicazione e la provo.  Non ottengo l'effetto sperato, ad ogni avvio della mia applicazione lo stato del ToolStripMenuItem è quello di default. Perchè?

Andiamo a vedere il codice che genera Visual Studio :

this.tsmTest.CheckState = global::TestProperties.Properties.Settings.Default.testTsm;

Lo confronto con il codice generato per un CheckBox

 

this.chkTest.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::TestProperties.Properties.Settings.Default, "test1", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

 

 

La causa del problema è chiara, cioè il valore “Checked” del toolStripMenuItem tsmTest, non viene messo in binding, ma viene smplicemente impostato con il valore memorizzato nel file di impostazioni. Un rapida ricerca in MSDN ed è spiegato il perché:

mentre il CheckBox, deriva da Control, che implementa l’interfaccia IBindableComponent , il toolStripMenuItem  non deriva da Control  (deriva da Component àToolStripMenu) e cosa ben più importante non implementa l’interfaccia  IBindableComponent: pertanto non è possibile impostare un binding su di esso.

 

Quindi devo gestirmi manualmente  il salvataggio dello stato del mio ToolStripMenu , scrivendo ad esempio il seguente codice nell’evento formclosing

 

  Properties.Settings.Default.testTsm = tsmTest.CheckState;

  Properties.Settings.Default.Save(); //salvo le impostazioni

 

 

Bisogna anche prestare attenzione al fatto che per il ToolStripMenuItem, non essendo messo realmente in binding,  gli eventi legati alle impostazioni (SettingChanging, SettingsSaving…) non vengono generati. Con riferimento all’esempio di prima, ogni volta che cambio il “CheckState” del mio toolstripmenuitem  l’evento SettingChanging non viene generato.

 

 

 

Copyright © Giuseppe Merlino