Mehmet

WFN Üye
Konular
1,067
Mesajlar
1,068
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
İlk kontrol etmeniz gereken üç nokta vardır: ayar User kapsamındadır, değer değiştirildikten sonra Properties.Settings.Default.Save() çağrılır ve uygulama açılırken ayarın üzerine varsayılan değer yazılmaz. Bu üç koşuldan biri eksikse uygulama çalışırken değer değişmiş görünür; uygulamayı kapatıp açtığınızda ise eski değer geri gelir. Aşağıdaki örnekte kullanıcı ayarını doğru tanımlayıp kaydederek ve açılışta okuyarak sorunu ayırabilirsiniz.

Ayar neden gerçekten kaybolmuş gibi görünür?​


Windows Forms ve masaüstü uygulamalarında ayarlar genellikle iki kapsama ayrılır. Application kapsamındaki ayarlar uygulamanın ortak ve çoğunlukla salt okunur yapılandırmasıdır. User kapsamındaki ayarlar ise mevcut kullanıcıya ait tercihler içindir; tema, pencere konumu, son seçilen klasör veya kullanıcı tarafından değiştirilen seçenekler bu kapsama konur.

Çalışma anında değiştirilen değer, yalnızca bellekteki ayar nesnesinde tutulabilir. Uygulama kapatılırken diske yazılması için kullanıcı ayarını kaydetmeniz gerekir..NET’in varsayılan ayar sağlayıcısı kullanıcı ayarlarını kullanıcı profilindeki uygulamaya özel user.config dosyasına yazar; Settings.settings veya proje içindeki app.config dosyası çalışma sırasında güncellenmez. Bu nedenle Visual Studio’daki ayar dosyasına bakıp değerin değişmediğini görmek, kaydetme işleminin başarısız olduğunu tek başına kanıtlamaz.

Önce ayarın kapsamını düzeltin​


Visual Studio’da projenin ayarlar bölümünü açıp sıfırlanan ayarın Scope değerini kontrol edin. Kullanıcının değiştireceği bir ayarsa kapsam User olmalıdır. Application seçiliyse ayarı çalışma zamanında kalıcı kullanıcı tercihi olarak kullanmaya çalışmayın; bu kapsam uygulama varsayılanları içindir.

Örneğin kullanıcı bir renk seçiyorsa ayar şu mantıkta tanımlanmalıdır:
  • Ad: ThemeColor
  • Tür: Uygun bir renk türü veya uygulamanızın kullandığı serileştirilebilir tür
  • Kapsam: User
  • Varsayılan değer: Uygulamanın ilk açılışta kullanacağı renk
Ayarın kapsamını değiştirmek yalnızca yeni çalıştırmalarda beklediğiniz sonucu vermeyebilir; mevcut kullanıcıya ait eski user.config dosyasında hatalı veya bozuk kayıt bulunabilir. Bu durumda önce kodun gerçekten hangi ayarı okuduğunu ve yazdığını doğrulayın. Gerekirse test kullanıcısının ayar dosyasını yeniden oluşturmak için uygulamayı kapatıp kullanıcıya ait eski ayar verisini temizleyebilirsiniz; bunu gerçek kullanıcı verisini silmeden, yalnızca ayarların yeniden oluşturulacağını bilerek yapın.

Değeri değiştirdikten sonra Save çağırın​


Aşağıdaki örnek, varsayımsal bir Windows Forms uygulamasında User kapsamındaki RememberLastFolder ayarını değiştirir ve kalıcı olarak kaydeder:

C#:
private void chkRememberLastFolder_CheckedChanged(object sender, EventArgs e)
{
    Properties.Settings.Default.RememberLastFolder =
        chkRememberLastFolder.Checked;

    Properties.Settings.Default.Save();
}

Burada ilk satır ayarı bellekte değiştirir, Save() ise mevcut değeri kullanıcı ayarlarının kalıcı deposuna yazar. Yalnızca ilk satırı yazarsanız onay kutusu uygulama açıkken doğru görünebilir; uygulama yeniden başlatıldığında eski değer okunur.

Birden fazla ayarı aynı anda değiştiriyorsanız her değişiklikte kaydetmek yerine ayar ekranındaki Uygula veya Kaydet işleminde hepsini atayıp bir kez Save() çağırabilirsiniz:

C#:
private void btnSave_Click(object sender, EventArgs e)
{
    Properties.Settings.Default.RememberLastFolder =
        chkRememberLastFolder.Checked;
    Properties.Settings.Default.LastFolder = txtFolder.Text.Trim();
    Properties.Settings.Default.WindowWidth = (int)nudWidth.Value;

    Properties.Settings.Default.Save();
}

Bu örnekte RememberLastFolder, LastFolder ve WindowWidth ayarlarının tamamı User kapsamına alınmış olmalıdır. Kaydetme düğmesine basıldığında hata oluşmuyorsa işlem bellekteki değerleri kalıcı ayar deposuna yazmayı dener; kesin kontrol için uygulamayı tamamen kapatıp yeniden açmanız gerekir.

Açılışta kaydedilen değerin üzerine yazmayın​


Ayar kaydedildiği hâlde uygulama açıldığında sıfırlanıyorsa en sık görülen ikinci neden, açılış kodunun kayıtlı değerin üzerine varsayılan değeri yazmasıdır. Şu kullanım hatalı olabilir:

C#:
private void MainForm_Load(object sender, EventArgs e)
{
    Properties.Settings.Default.RememberLastFolder = false;
    chkRememberLastFolder.Checked =
        Properties.Settings.Default.RememberLastFolder;
}

Form açılırken önce false atanır, ardından bu yeni değer okunarak arayüze uygulanır. Böylece daha önce kaydedilmiş true değeri kaybolmuş gibi görünür.

Doğru yaklaşım, açılışta ayara değer atamak yerine kayıtlı değeri okumaktır:

C#:
private void MainForm_Load(object sender, EventArgs e)
{
    chkRememberLastFolder.Checked =
        Properties.Settings.Default.RememberLastFolder;
    txtFolder.Text = Properties.Settings.Default.LastFolder;
    nudWidth.Value = Properties.Settings.Default.WindowWidth;
}

Varsayılan değer yalnızca ayarın daha önce hiç kaydedilmediği ilk kullanım için ayar tanımında bulunmalıdır. Kullanıcı ayarı zaten mevcutsa açılış kodu onu zorla değiştirmemelidir. Özel bir sıfırlama düğmesi yazıyorsanız sıfırlama işlemini yalnızca kullanıcı bu düğmeye bastığında yapın.

Otomatik veri bağlama kullanıyorsanız iki yönlü akışı kontrol edin​


Bir kontrolü ayara bağladıysanız uygulama açılırken ayarın kontrole, kullanıcı değişiklik yaptığında da kontrolün ayara aktarılması beklenir. Ancak form yüklenirken çalışan başka bir kod kontrolün değerini varsayılana getirirse bu değer ayara geri yazılabilir. Bu nedenle aşağıdaki sırayı koruyun:
  1. Form veya ayar ekranı açılırken kayıtlı ayarı okuyun.
  2. Bu değeri ilgili kontrole uygulayın.
  3. Kullanıcı değişiklik yaptığında yeni değeri kullanıcı ayarına aktarın.
  4. Kullanıcı Kaydet veya Uygula işlemine bastığında Save() çağırın.
  5. Uygulamayı kapatıp yeniden açarak değerin geri okunduğunu kontrol edin.
Ayarın kapsamı doğru ve Save() çağrısı mevcut olduğu hâlde değer yine değişiyorsa başlangıç kodunda, form yükleme olayında, ayar ekranının açılışında veya bir veri bağlama olayında aynı ayara atama yapan satırları arayın. Settings.Default ile başlayan atamaları özellikle kontrol edin. Sorunun kaynağı çoğu zaman kaydetme satırının eksikliği değil, kaydedilen değerin programın başka bir yerinde hemen varsayılanla değiştirilmesidir.

Hangi sonuç ne anlama gelir?​


Sorunu izole etmek için geçici olarak bir ayarı yalnızca tek bir yerde değiştirip kaydedin. Örneğin bir onay kutusunu işaretleyin, Kaydet düğmesine basın, uygulamayı tamamen kapatın ve yeniden açın. Sonucu şu şekilde yorumlayabilirsiniz:
Gözlenen durumMuhtemel anlamıSonraki kontrol
Uygulama açıkken değer değişiyor, yeniden açınca eski hâline dönüyorSave çağrılmıyor, ayar Application kapsamındadır veya kayıtlı değer açılışta eziliyordurKapsamı, Save çağrısını ve başlangıç atamalarını kontrol edin
Save çağrılıyor fakat uygulama açılışında varsayılan değer görünüyorAçılış kodu veya veri bağlama kayıtlı değerin üzerine yazıyor olabilirLoad, constructor ve ayar ekranı açılışındaki atamaları izleyin
Yalnızca yeni sürümde eski ayarlar yok oluyorUygulama kimliği veya sürüm bilgisi değiştiği için farklı bir kullanıcı ayarı klasörü kullanılıyor olabilirSürüm geçişi için ayar yükseltme veya özel taşıma mantığı ekleyin
Farklı Windows kullanıcılarında farklı değerler görülüyorUser kapsamındaki ayarlar kullanıcıya özeldir; bu tek başına hata değildirOrtak değer gerekiyorsa kullanıcı ayarı yerine uygun ortak yapılandırma veya veritabanı tasarlayın
Tablodaki ilk durum, yalnızca Save() eksik olduğunu kanıtlamaz; yanlış kapsam veya açılışta üzerine yazma da aynı belirtiyi oluşturur. İkinci durum ise kayıt işleminin kesinlikle başarılı olduğunu da kanıtlamaz; başlangıç kodunu düzeltmeden önce kaydetme ve okuma noktalarını ayrı ayrı doğrulamak gerekir.

Yeni sürümde ayarların sıfırlanması​


.NET’in varsayılan kullanıcı ayarı sağlayıcısı, kullanıcı ayarlarını uygulamanın kimliği ve sürümüyle ilişkili bir klasörde tutar. Ana derlemenin sürüm bilgisi, ürün bilgisi veya uygulamanın yolu değiştiğinde yeni bir ayar klasörü oluşabilir. Bu durumda uygulama eski user.config dosyasını okumadığı için ayarlar ilk kurulumdaki varsayılan değerlere dönmüş gibi görünür.

Bu davranış, Save() çalışmadığını kanıtlamaz. Eski dosya hâlâ kullanıcı profilinde bulunabilir; yeni sürüm yalnızca başka konumu kullanıyor olabilir. Kullanıcı ayarlarının sürümler arasında korunması gerekiyorsa uygulama açılışında önceki sürüm ayarlarını yükseltme mantığı uygulayın veya sürümden bağımsız bir ayar deposu tasarlayın. Basit bir kullanıcı tercihi için standart ayarlar yeterli olabilir; lisans, iş verisi, büyük kayıtlar veya kaybedilmesi ciddi sonuç doğuracak bilgiler için yalnızca user.config dosyasına güvenmeyin.

Sorun düzelmezse hangi bilgileri kontrol edin?​


Önce uygulamanın gerçekten çalıştırdığınız sürümünü kontrol edin. Visual Studio’da farklı bir yapılandırmanın, eski bir çalıştırılabilir dosyanın veya farklı bir kullanıcı profilinin kullanılması, doğru kodu değiştirmenize rağmen eski davranış görmenize yol açabilir. Ardından şu bilgileri aynı testte kaydedin:
  • Ayarın adı ve Application/User kapsamı
  • Değerin atandığı kod satırı
  • Ayarın kaydedildiği kod satırı
  • Uygulamanın açılışında ayarın okunduğu kod
  • Uygulamanın hangi Windows kullanıcısıyla ve hangi sürümle çalıştığı
  • Uygulama kapanırken veya kaydederken oluşan hata iletisinin tamamı
Save() sırasında erişim, serileştirme veya yapılandırma hatası alıyorsanız hata iletisinin tamamını ve ilgili ayarın türünü inceleyin. Kullanıcı ayarının türü serileştirilemiyorsa metin, sayı, Boolean gibi basit türlerle deneyerek sorunun depolama işleminde mi yoksa özel türün serileştirilmesinde mi olduğunu ayırabilirsiniz. Hata yok, fakat değer açılışta değişiyorsa önceliği açılış kodu ve veri bağlama incelemesine verin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic