- Konu sahibi
- #1
İlk kontrol etmeniz gereken üç nokta vardır: ayar User kapsamındadır, değer değiştirildikten sonra
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
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:
Aşağıdaki örnek, varsayımsal bir Windows Forms uygulamasında
Burada ilk satır ayarı bellekte değiştirir,
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
Bu örnekte
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:
Form açılırken önce
Doğru yaklaşım, açılışta ayara değer atamak yerine kayıtlı değeri okumaktır:
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.
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:
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:
Tablodaki ilk durum, yalnızca
.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
Bu davranış,
Ö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:
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
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:
- Form veya ayar ekranı açılırken kayıtlı ayarı okuyun.
- Bu değeri ilgili kontrole uygulayın.
- Kullanıcı değişiklik yaptığında yeni değeri kullanıcı ayarına aktarın.
- Kullanıcı Kaydet veya Uygula işlemine bastığında
Save()çağırın. - Uygulamayı kapatıp yeniden açarak değerin geri okunduğunu kontrol edin.
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 durum | Muhtemel anlamı | Sonraki kontrol |
|---|---|---|
| Uygulama açıkken değer değişiyor, yeniden açınca eski hâline dönüyor | Save çağrılmıyor, ayar Application kapsamındadır veya kayıtlı değer açılışta eziliyordur | Kapsamı, 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üyor | Açılış kodu veya veri bağlama kayıtlı değerin üzerine yazıyor olabilir | Load, constructor ve ayar ekranı açılışındaki atamaları izleyin |
| Yalnızca yeni sürümde eski ayarlar yok oluyor | Uygulama kimliği veya sürüm bilgisi değiştiği için farklı bir kullanıcı ayarı klasörü kullanılıyor olabilir | Sü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üyor | User kapsamındaki ayarlar kullanıcıya özeldir; bu tek başına hata değildir | Ortak değer gerekiyorsa kullanıcı ayarı yerine uygun ortak yapılandırma veya veritabanı tasarlayın |
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.