Program ayarlarının dinamik kaydedilmesi

Ö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

Program ayarlarının dinamik kaydedilmesi” üzerine bir düşünce

  1. Ahmet Kaymaz Yazar

    .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\\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"?>




    676, 48



    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.