WinForms ComboBox
Veri Bağlama Hatasını Anlamak
Eğer .NET’te Windows Forms uygulamaları geliştiriyorsanız, ComboBox
kontrolü ile çalışırken bazı beklenmeyen davranışlarla karşılaşmış olabilirsiniz. İki ComboBox
kontrolü aynı veri kaynağına bağlandığında yaygın bir sorun ortaya çıkar. Bir ComboBox
‘ta seçimi değiştirdiğinizde, diğer ComboBox
da otomatik olarak değişir! Bu yazı, bunun neden olduğunu ve nasıl düzeltebileceğinizi inceleyecek.
Sorun
Örnek Kurulum
Aşağıda iki ComboBox
kontrolü oluşturulan ve bir string listesini bağlanan bir örnek düşünün:
List<string> myitems = new List<string>
{
"Öğe 1",
"Öğe 2",
"Öğe 3"
};
ComboBox box = new ComboBox();
box.DataSource = myitems;
ComboBox box2 = new ComboBox();
box2.DataSource = myitems;
Ne Oluyor?
- Aynı Veri Kaynağına Bağlama: Her iki
ComboBox
kontrolü de aynı öğeler listesini kullanır. - Seçimi Değiştirme: Bir
ComboBox
‘ta seçilen öğeyi değiştirdiğinizde, diğerComboBox
‘ta da aynı öğe otomatik olarak seçilir.
Bu Neden Oluşuyor?
Sorunun kökeni, .NET framework’ünde veri bağlamanın nasıl ele alındığıyla, özellikle BindingContext
ile ilgilidir.
BindingContext
‘ı Anlamak
BindingContext
, bu değişikliklerin neden aynı anda gerçekleştiğini anlamak için önemlidir. İşte nasıl çalıştığının bir açıklaması:
- Paylaşılan Kontrol Bağlamı: Varsayılan olarak, Windows Form’daki tüm kontroller aynı
BindingContext
‘i paylaşır. - Veri Bağlama Mekanizması: Bir
ComboBox
‘ınDataSource
‘unu ayarladığınızda, buBindingContext
‘i kullanarak birConcurrencyManager
referansına ulaşır. - Geçerli Seçimi İzleme:
ConcurrencyManager
, listedeki geçerli seçili pozisyonu takip etmekten sorumludur. Her ikiComboBox
kontrolü aynı bağlamı paylaştığından, aynı geçerli seçimi yansıtırlar.
BindingContext
‘in nasıl çalıştığını daha derinlemesine incelemek için resmi Microsoft Dokümantasyonunu inceleyebilirsiniz.
Çözüm: Dizileri Kullanmak
Seçimlerin aynı anda değiştirilmesini önlemek için ComboBox
kontrollerinizi bağlama şeklinizi değiştirebilirsiniz. List
‘e doğrudan bağlamak yerine bunu bir diziye dönüştürün:
ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Neden Bu Çalışır
- Ayrı Diziler:
.ToArray()
kullanarak, diğerComboBox
ileBindingContext
referansını paylaşmayan yeni bir dizi örneği oluşturursunuz. - Bağımsız Seçimler: Artık her
ComboBox
kendi veri bağlamına sahip olacak ve birbirleriyle müdahale etmeden farklı seçimleri koruyacaktır.
Sonuç
WinForms ile geliştirme yaparken bazen veri bağlama incelikleri nedeniyle beklenmeyen davranışlar ortaya çıkabilir. BindingContext
ve ConcurrencyManager
‘ın nasıl çalıştığını anlamak, bu sorunları etkili bir şekilde çözmenizi sağlar. Veri kaynağınızı bağlarken bir diziye dönüştürerek istenen işlevselliğe ulaşabilir ve uygulamanızın beklenildiği gibi etkileşimde bulunmasını sağlayabilirsiniz.
Anahtar Çıkarım
WinForms’ta veri bağlamanın nasıl çalıştığına her zaman dikkat edin. Uygun bir şekilde ele alınmadan aynı kaynağa birden fazla kontrol bağlamak, bu tür karmaşık durumlara yol açabilir!