Özellikle desktop uygulamalarda kullanıcı veya uygulama bazlı bazı ayarları korumak isteriz. Örneğin kullanıcının bir formu en son hangi modda, hangi büyüklükte veya renk ayarlarında kapattığı bilgilerini saklayıp kullanıcının programı bir sonraki açışında bu ayarları yüklememiz her zaman ihtiyaç duyduğumuz bir durumdur. Framework 2.0, bu amaçla System.Configuration.ApplicationSettingsBase sınıfı ve en önemlisi bu işlemleri yapmamız için settings designer ekranı sunar.
Saklanmasını istediÄŸimiz konfigürasyon deÄŸiÅŸkenlerini öncelikle settings desinger’da tanımlayacağız. Bu aracı açmak için Solution Explorer penceresi içerisinde projemizi saÄŸ tıklayıp Properties bölümüne girelim. Bu ekranda deÄŸiÅŸken adını, tipini, geçerlilik alanını ve istenirse deÄŸerini girelim. Örnek olarak bir windows application oluÅŸturdum ve formun kullanıcının en son bıraktığı lokasyon ve boyut bilgilerini korumak için iki deÄŸiÅŸken tanımladım; System.Drawing.Size türünde FormSize ve System.Drawing.Point türünde FormLocation

Bu iÅŸlemden sonra Visual Studio tarafından proje içerisinde Properties klasörü, Settings.settings ve Settings.cs dosyaları oluÅŸturulur. Bu dosyalarda deÄŸiÅŸkenleri saklayan veya onlara eriÅŸmemizi saÄŸlayan sınıf ve üyeleri bulunmaktadır. Settings.Designer.cs dosyasındaki deÄŸiÅŸken property’leri aÅŸağıdaki gibidir;
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("200, 300")]
public global::System.Drawing.Size FormSize {
get {
return ((global::System.Drawing.Size)(this["FormSize"]));
}
set {
this["FormSize"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0, 0")]
public global::System.Drawing.Point FormLocation {
get {
return ((global::System.Drawing.Point)(this["FormLocation"]));
}
set {
this["FormLocation"] = value;
}
}
Bundan sonra yapacağımız iÅŸlem, kod içerisinde bu ayarları ilgili alanlara yüklemektir. Ayarlardaki deÄŸiÅŸkenlere ulaÅŸmak için Properties.Settings.DefaultDeÄŸiÅŸken Adı sınıfı kullanılır. Bunu Form’un Load() metodu içerisinde yükleyelim.
private void Form1_Load(object sender, EventArgs e)
{
this.Location = Properties.Settings.Default.FormLocation;
this.Size = Properties.Settings.Default.FormSize;
}//Form1_Load
Bunu doÄŸrudan program baÅŸladığında bind edilmesini istersek Form’un Properties penceresindeki (ApplicationSettings) bölümünde ilgili eÅŸleÅŸtirmeyi yapabiliriz.

Kullanıcı, kullanım esnasında bu ayarları deÄŸiÅŸtirebileceÄŸi için programı kapatmadan hemen önce ayarları saklamamız gerekir. Bunun için en uygun alan, FormClosing eventidir. Bu event içerisinde ayarları ilgili property’lerden set edip System.Configuration’tan Properties.Settings.Default.Save() metodu çağıracağız.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.FormLocation = this.Location;
Properties.Settings.Default.FormSize = this.Size;
Properties.Settings.Default.Save();
}//Form1_FormClosing
Bu mantıkla, birçok property’nin deÄŸerini saklayabileceÄŸimiz gibi uygulama içerisindeki bir çok nesneyi de (Array, Koleksiyon sınıfları, Normal deÄŸiÅŸken . . .) koruyabiliriz.
Dinamik Connection String
Windows uygulamalarında bu yöntemi kullanarak uygulamanın kullandığı connection string bilgisini dışarıdan okutabilir ve gerektiÄŸi zaman programın ayarlar kısmında bu bilgileri deÄŸiÅŸtirebiliriz. Örnek bir projede connection string’in oluÅŸtuÄŸu elementleri aÅŸağıdaki gibi properties bölümüne girelim.

private void Form1_Load(object sender, EventArgs e)
{
SqlConnectionStringBuilder oSqlCnn;
oSqlCnn = new SqlConnectionStringBuilder();
oSqlCnn.DataSource = Properties.Settings.Default.Sunucu;
oSqlCnn.InitialCatalog = Properties.Settings.Default.Veritabani;
oSqlCnn.UserID = Properties.Settings.Default.KullaniciAdi;
oSqlCnn.Password = Properties.Settings.Default.Sifre;
string CnnStr;
CnnStr = oSqlCnn.ConnectionString;
MessageBox.Show(CnnStr);
}

Programda Button1 tıklandığı zaman aşağıdaki gibi bu bilgileri revize edebiliriz.
private void button1_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Sunucu = "YeniSunucu";
Properties.Settings.Default.Veritabani = "YeniVeriTabani";
Properties.Settings.Default.KullaniciAdi = "YeniKullaniciAdi";
Properties.Settings.Default.Sifre = "YeniSifre";
Properties.Settings.Default.Save();
}
Örnekte sadece SqlClient providerina uygun bir connection string oluşturuldu daha generic bir yapı için bu şekilde elementlere ayırmak yerine sadece ConnectionStr isminde tek bir entry oluşturuplup o okunabilir ve revize edilebilir.
Bu yönteme alternatif olarak ayarlar, kullanıcının registry’sinde veya web service’sinde tutulabilir. Bu yöntemlerin örneklerini aÅŸağıdaki adreslerde bulabilirsiniz;
http://msdn2.microsoft.com/en-us/library/ms181001.aspx
http://msdn2.microsoft.com/en-us/library/ms180994.aspx




Ocak 21st, 2008 at 09:46
Hocam peki be settings dosyası App.config dosyasımı ?
Ocak 21st, 2008 at 11:39
.NET, uygulamayla ilgili client değişken ayarlarını, kullanıcı ve exenin sürümüne bağlı olarak tuttuğu için bu bilgileri kullanıcının ApplicationData klasöründe app.config benzeri olan user.config dosyasında tutar. ApplicationData klasörü, genellikle C:\Document and Settings\<User>\Local Settings\Application Data pathinde bulunur. Bilindiği gibi bir çok Microsoft programı, kullanıcıyla ilgili ayarları bu klasörde saklar.
İstemcinin bu klasörünün pathini, Environment sınıfıyla okuyabilirsiniz.
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);Uygulama, tasarlandığı, derlendiği zaman bu ayarlar, uygulamaya ait app.config dosyasında tutulur. Her setting için aşağıdaki gibi tanımlama yapılır.
<?xml version="1.0" encoding="utf-8"?><configuration>
<userSettings>
<CsharpWindowsApplication1.Properties.Settings>
<setting name="FormSize" serializeAs="String">
<value>676, 48</value>
</setting>
</CsharpWindowsApplication1.Properties.Settings>
</userSettings>
</configuration>