05/01/2023 - xela1103 ha scritto:
posso creare queste variabili non dal pannello impostazioni ma da codice che però hanno la stessa prorietà di salvataggio?
Si, ma non dalla stessa applicazione che stai sviluppando. A runtime, le modifiche (intendo aggiunta o rimozione di proprietà) al file Settings.settings non sono persistenti tra una sessione e l'altra.
Potresti pensare di sviluppare un'estensione di VS che crei in automatico le proprietà, facendo una scansione di tutti gli oggetti di cui ti interessa mantenere le impostazioni. Così prima della compilazione fai aggiornare quel file e non ci pensi più.
Io avevo tentato tramite Extension Method in questo modo:
public static class FormExtentions
{
public static void SalvaProprietaForm(this Form form)
{
//gruppo
string nomeTipoForm = form.GetType().Name;
string[] nomiProprieta = { nomeTipoForm + "Location", nomeTipoForm + "WindowsState" };
foreach (string proprieta in nomiProprieta)
{
try
{
Properties.Settings.Default[proprieta] = form.Location;
}
catch
{
CreaNuovaProprieta(proprieta, typeof(Point));
Properties.Settings.Default[proprieta] = form.Location;
}
}
Properties.Settings.Default.Save();
}
public static void CaricaProprietaForm(this Form form)
{
string nomeTipoForm = form.GetType().Name;
string nomeProprieta = nomeTipoForm + "Location";
try
{
form.Location = (Point)Properties.Settings.Default[nomeProprieta];
nomeProprieta = nomeTipoForm + "WindowsState";
form.WindowState = (FormWindowState)Properties.Settings.Default[nomeProprieta];
}
catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Errore {1} per {0} ", nomeProprieta, ex.ToString()); }
}
private static void CreaNuovaProprieta(string nomeProprieta, Type tipoProprieta)
{
//Parte vecchia: non funziona se chiudo/riapro l'applicazione
SettingsProperty property = new SettingsProperty(nomeProprieta);
property.IsReadOnly = false;
property.PropertyType = tipoProprieta;
property.Provider = Properties.Settings.Default.Providers["LocalFileSettingsProvider"];
property.Attributes.Add(typeof(UserScopedSettingAttribute), new UserScopedSettingAttribute());
Properties.Settings.Default.Properties.Add(property);
Properties.Settings.Default.Save();
// Ricarico le proprietà
Properties.Settings.Default.Reload();
System.Diagnostics.Debug.WriteLine("Creata la proprietà {0} di tipo {1}", nomeProprieta, tipoProprieta);
}
}
E funzionicchia… Nel Load di ogni form riportavo il metodo CaricaProprietaForm e nel FormClosing il metodo SalvaProprietaForm che come vedi si gestiva da solo il caso in cui la proprietà non esiste. Dato che genera eccezione, la intercettavo andando a creare la proprietà mancante e poi valorizzandola.
In questo modo, ogni volta che aprivo una form e la spostavo, quando la chiudevo creavo (se non esisteva) la proprietà per la Location (stavo ragionando anche sulla WindowsState, ma ho desistito) e ci salvavo la posizione della form. Quando riaprivo un'altra istanza di quella classe, allora me la ritrovavo dove avevo lasciato la precedente. Ma se chiudo e riapro l'app, tutto viene perso. Ogni prima istanza, partiva in posizione 0,0 (se non diversamente specificato tramite designer della form.
Avrebbe più senso avere un proprio file di impostazioni su cui scrivere e leggere le varie proprietà, con lo stesso ragionamento, oppure, se ti appoggi ad un DB, creare una tabella dedicata che raccolga le impostazioni. Allora si che non hai problemi perché la persistenza la garantisci.
Gestire direttamente il file Settings.settings a runtime non è possibile.