ComboBox Kontrolü ve Nesne Yönelimli Programlama
C# öğrenmek isteyen yazılım uzmanı adaylarına tekrar merhabalar. :)
Nesne yönelimli programlama konularını yeterince öğrendikten sonra artık Windows Form projelerine başlama zamanı gelmiş demektir.Bugün öğreneceğimiz konunun ana başlığı ComboBox kontrolü olacak.
ComboBox kontrolü içerisinde temel ilkel değişken tiplerine (string,int gibi) ait nesneler tutabildiği gibi nesne yönelimli programlama konusunda öğrendiğimiz sınıf örneklerini de tutabilmektedir.
Dersimize basitten karmaşığa doğru gideceğiz,öncelikle yeni bir Windows Form projesi oluşturalım ve ToolBox penceresinden ComboBox kontrolünü formumuza sürükleyip bırakalım:
Mouse ile ComboBox'ı seçtikten sonra kontrolümüze Properties penceresinden "Name" özelliğine bir isim veriyoruz,bu isimi C# kod tarafında kullanacağız:
Şimdide formumuza şehirleri getir isimli bir buton ekleyelim:
Butonumuza da bir isim veriyoruz:
Son olarak butonumuzun ismini yine Properties penceresindeki Text özelliğinden değiştirelim:
Projemizin amacı ise; kullanıcı butona tıkladığında ComboBox nesnesine şehirlerin isimleri gelsin.
Butonumuza çift tıklayarak kod kısmına geçiyoruz:
Elbette bu örnek için 81 ilin adını tek tek yazmayacağız,bunun yerine 5 şehir versek yeterlidir. :)
Bir ComboBox kontrolü içerisine nesneler ekleyebilmek için Items propertysinin Add metodunu kullanırız,
şehirleri tek tek yazalım:
Ya da örnek olarak daha önce öğrendiğimiz diziler ve döngüler konularını kullanabilir.Örneğin;
Her iki kullanım arasında hiçbir fark yok,hangisi kolayınıza geliyorsa onu kullanabilirsiniz. :)
Projemizi çalıştırıp butonumuza tıklıyoruz:
Buraya kadar ComboBox'a eleman eklemeyi öğrendik şimdi sırasıyla diğer kullanım seçeneklerine göz
atalım...
ComboBox'ın yapısı gereği IEnumerable (sayılabilir,sırasıyla) olduğu için Add() metoduyla eklediğimiz
string ya da int farketmeksizin her nesne yeni bir diziye eklenir gibi davranır.
Dolayısıyla ComboBox içerisindeki eleman sayısına rahatlıkla ulaşabiliriz,bunu da yine Items propertysinin Count alt propertysiyle elde ederiz:
Tam bu esnada projemizi tekrar çalıştıralım ve bu defa butonumua iki kez tıklayalım:
Bilgisayar kullanıcısı programımızı çalıştırıp butona iki kez tıklayabilir ve ComboBox nesnemize iki kez üst üste aynı şehirleri ekleyebilir,doğal olarak biz yazılımcılar kullanıcının yapabileceği hataları öngörerek önlemleri alırız.Bunun için kendi kendimize şöyle düşünebiliriz:
"Bir ComboBox bir kez doldurulmuşsa ikinci kez yeniden doldurulmasın.."
Yani ComboBox içerisindeki eleman sayısı sıfırdan büyükse içerisinde eleman var demektir ve yeniden eklenmemesi
için basit bir if karar yapısı koşulu yazalım:
ve programımızı çalıştırdığımızda ne kadar butona tıklarsak tıklayalım şehirler yalnızca bir kez doldurulacak,böylece
aynı şehir listesini tekrar ekletmemiş olacağız.
ComboBox kontrolü ile öğreneceğimiz bir diğer konu ise içeriğindeki nesnelerin tek seferde kolaylıkla silinebildiğidir,
bunun için yine Items propertysinin Clear() metodunu kullanıyoruz:
Eğer bu noktada programımızı çalıştırırsak şehirleri ekledikten hemen sonra sileceği için ComboBox kontrolümüzün boş olacağını görürürüz.
ComboBox yapısının tıpkı string ya da int dizisi gibi olduğunu söylemiştik,bir dizide nasıl ki indeks mantığı varsa ve
indeks sıfırdan başlıyorsa ComboBox'ta da bu aynen geçerli,tek fark ise seçilen indeks olayıdır.Şimdi forumuza iki adet label ekleyelim:
Soldaki labelin yalnızca Text özelliğini değiştirdik,sağdakinin ise Text özelliğine "-" işareti koyduk ve Name özelliğine "lblIndeks" yazdıktan sonra SelectedIndexChanged eventine (olayına) geldik.
Bir bilgisayar kullanıcısı ComboBox'tan herhangi bir seçim yaptığında bunu arkaplan kodlarından rahatlıkla yakalayabiliyoruz,bize bu imkanı veren SelectedIndexChanged olayı o an kaçıncı indeksin seçildiğin verebildiği için oluşturduğumuz labela seçilen indeks değerini yazdıralım.
SelectedIndexChanged olayına hızlıca geçmek için ComboBox kontrolümüzün üzerine iki kez çift tıklıyoruz:
Öncelikle seçilen indeks numarasını yakalayalım:
Ardından gelen değeri label kontrolümüze yazı olarak verelim:
Programımızı çalıştırıyoruz ve örnek olsun diye şehirlerden Antalya'yı seçiyoruz:
Listede 4 numaralı şehir olan Antalya'nın indeks karşılığı olarak karşımıza 3 olarak geldi,bunun nedeni dizilerdeki ilk eleman daima sıfırıncı konumdadır.
Bazen biz yazılımcılar için seçilen indeks numarası değil de seçilen nesnenin doğrudan ismi gerekebilir ve bunun için
SelectedItem (seçilen öğe) propertysini ToString() metoduyla string ifadeye çeviriyoruz; bu örneğimizde ise
seçilen şehri mesaj kutusunda gösterelim:
Programımızı yeniden çalıştırıyoruz:
Gördüğünüz gibi ComboBox'ın gayet kolay bir kullanımı var. :)
Şimdi nesne yönelimli programlama konusuyla ilgili örneğimize geçelim, öncelikle formumuza yeni bir buton ve bir combobox ekliyoruz ve butonumuzun ismine markaları getir yazıyoruz:
Ardından yeni bir sınıf oluşturuyoruz:
ve sınıfımızı hazırlıyoruz:
Oldukça sade bir class oluşturduktan sonra marka sınıfımızdan birden çok instance alarak combobox nesnemize dolduruyoruz:
Projemizi çalıştırıyor ve markaları getir butonumuza tıklıyoruz:
Peki combobox kontrolümüze neden markaların isimleri değil de böyle garip isimler geldi?
Bunun cevabı .Net Framework'ün mimarisinde yatıyor; bir combobox nesnesine başka bir sınıftan örnekleme (instance) alınmış bir nesneyi (örneğimizdeki marka1 gibi) verdiğimizde combobox o nesnenin hangi özelliğini bilmemektedir.
O yüzden comboboxa Marka sınıfımızın hangi özelliğindeki değeri yansıtacağını biz yazılımcılar belirtmemiz gerekiyor ve bunu yapmanın 2 yolu vardır;
Birincisi aşağıdaki gibi combobox property ekranından Display Member (görüntülenecek üye) özelliğine sınıfımızda kullandığımızı propertylerden birinin ismini vererek :
veya bu özelliği kod satırında da verebiliriz:
ya da gerçek bir yazılımcı gibi davranarak sınıfımızı daha önce nesne yönelimli programlama konusunda öğrendiğimiz override tekniğiyle ToString() metodunu yeniden yapılandırarak (ezerek):
Bu yöntemlerden hangisini kullanırsak kullanalım aynı kapıya çıkıyoruz:
Peki neden override tekniğini öneriyorum?
C# nesne yönelimli bir programlama dilidir, bizim projelerimizde oluşturduğumuz static dışındaki her sınıf System.Object sınıfından otomatik biçimde kalıtım (inheritance) almaktadır ve System.Object sınıfındaki ToString() metodu içinde bulunduğu namespace ve sınıfın adını döndürmektedir.
Eğer oluşturduğumuz her sınıfımızın içinde ToString() metodunu override etmezsek kalıtımını aldığı System.Object sınıfındaki gibi davranarak kendi içinde bulunduracağı namespace ve class adını verecek ve böylece combobox örneğimizdeki gibi kullanıcının ekranına anlamsız bir metin sunacaktır.
O halde diyebiliriz ki; Combobox, kendisine verilen sınıfın ToString() metodu ne veriyorsa onu ekranda gösterecektir.Bunu şu şekilde kanıtlayalım, override metodumuza dönelim ve MarkaAdi property'mizin soluna Marka sözcüğünü koyalım:
Yeniden programımızı çalıştıralım:
Evet, gerçekten de combobox kontrolümüz kendisine verilen sınıf örneğindeki ToString() metoduna bakıyormuş :)
Sanırım tam bu noktada nesne yönelimli programlamanın ne olduğu biraz daha canlanmış olmalı, unutmayın iyi bir yazılımcı nesne yönelimli programlamayı oldukça iyi kullanabilmeli yoksa her combobox, listbox gibi kontrollerde yeniden yeniden DisplayMember tanımlayarak zaman kaybederek projenin teslim süresini geciktirerek imajını zedelemiş olur.
Combobox makalemizin böylece sonuna gelmiş bulunuyoruz,bir sonraki makalemizde görüşmek üzere kendinize iyi bakın. :)
Nesne yönelimli programlama konularını yeterince öğrendikten sonra artık Windows Form projelerine başlama zamanı gelmiş demektir.Bugün öğreneceğimiz konunun ana başlığı ComboBox kontrolü olacak.
ComboBox kontrolü içerisinde temel ilkel değişken tiplerine (string,int gibi) ait nesneler tutabildiği gibi nesne yönelimli programlama konusunda öğrendiğimiz sınıf örneklerini de tutabilmektedir.
Dersimize basitten karmaşığa doğru gideceğiz,öncelikle yeni bir Windows Form projesi oluşturalım ve ToolBox penceresinden ComboBox kontrolünü formumuza sürükleyip bırakalım:
Mouse ile ComboBox'ı seçtikten sonra kontrolümüze Properties penceresinden "Name" özelliğine bir isim veriyoruz,bu isimi C# kod tarafında kullanacağız:
Şimdide formumuza şehirleri getir isimli bir buton ekleyelim:
Butonumuza da bir isim veriyoruz:
Son olarak butonumuzun ismini yine Properties penceresindeki Text özelliğinden değiştirelim:
Projemizin amacı ise; kullanıcı butona tıkladığında ComboBox nesnesine şehirlerin isimleri gelsin.
Butonumuza çift tıklayarak kod kısmına geçiyoruz:
Elbette bu örnek için 81 ilin adını tek tek yazmayacağız,bunun yerine 5 şehir versek yeterlidir. :)
Bir ComboBox kontrolü içerisine nesneler ekleyebilmek için Items propertysinin Add metodunu kullanırız,
şehirleri tek tek yazalım:
Ya da örnek olarak daha önce öğrendiğimiz diziler ve döngüler konularını kullanabilir.Örneğin;
Her iki kullanım arasında hiçbir fark yok,hangisi kolayınıza geliyorsa onu kullanabilirsiniz. :)
Projemizi çalıştırıp butonumuza tıklıyoruz:
Buraya kadar ComboBox'a eleman eklemeyi öğrendik şimdi sırasıyla diğer kullanım seçeneklerine göz
atalım...
ComboBox'ın yapısı gereği IEnumerable (sayılabilir,sırasıyla) olduğu için Add() metoduyla eklediğimiz
string ya da int farketmeksizin her nesne yeni bir diziye eklenir gibi davranır.
Dolayısıyla ComboBox içerisindeki eleman sayısına rahatlıkla ulaşabiliriz,bunu da yine Items propertysinin Count alt propertysiyle elde ederiz:
Tam bu esnada projemizi tekrar çalıştıralım ve bu defa butonumua iki kez tıklayalım:
Bilgisayar kullanıcısı programımızı çalıştırıp butona iki kez tıklayabilir ve ComboBox nesnemize iki kez üst üste aynı şehirleri ekleyebilir,doğal olarak biz yazılımcılar kullanıcının yapabileceği hataları öngörerek önlemleri alırız.Bunun için kendi kendimize şöyle düşünebiliriz:
"Bir ComboBox bir kez doldurulmuşsa ikinci kez yeniden doldurulmasın.."
Yani ComboBox içerisindeki eleman sayısı sıfırdan büyükse içerisinde eleman var demektir ve yeniden eklenmemesi
için basit bir if karar yapısı koşulu yazalım:
ve programımızı çalıştırdığımızda ne kadar butona tıklarsak tıklayalım şehirler yalnızca bir kez doldurulacak,böylece
aynı şehir listesini tekrar ekletmemiş olacağız.
ComboBox kontrolü ile öğreneceğimiz bir diğer konu ise içeriğindeki nesnelerin tek seferde kolaylıkla silinebildiğidir,
bunun için yine Items propertysinin Clear() metodunu kullanıyoruz:
Eğer bu noktada programımızı çalıştırırsak şehirleri ekledikten hemen sonra sileceği için ComboBox kontrolümüzün boş olacağını görürürüz.
ComboBox yapısının tıpkı string ya da int dizisi gibi olduğunu söylemiştik,bir dizide nasıl ki indeks mantığı varsa ve
indeks sıfırdan başlıyorsa ComboBox'ta da bu aynen geçerli,tek fark ise seçilen indeks olayıdır.Şimdi forumuza iki adet label ekleyelim:
Soldaki labelin yalnızca Text özelliğini değiştirdik,sağdakinin ise Text özelliğine "-" işareti koyduk ve Name özelliğine "lblIndeks" yazdıktan sonra SelectedIndexChanged eventine (olayına) geldik.
Bir bilgisayar kullanıcısı ComboBox'tan herhangi bir seçim yaptığında bunu arkaplan kodlarından rahatlıkla yakalayabiliyoruz,bize bu imkanı veren SelectedIndexChanged olayı o an kaçıncı indeksin seçildiğin verebildiği için oluşturduğumuz labela seçilen indeks değerini yazdıralım.
SelectedIndexChanged olayına hızlıca geçmek için ComboBox kontrolümüzün üzerine iki kez çift tıklıyoruz:
Öncelikle seçilen indeks numarasını yakalayalım:
Ardından gelen değeri label kontrolümüze yazı olarak verelim:
Programımızı çalıştırıyoruz ve örnek olsun diye şehirlerden Antalya'yı seçiyoruz:
Listede 4 numaralı şehir olan Antalya'nın indeks karşılığı olarak karşımıza 3 olarak geldi,bunun nedeni dizilerdeki ilk eleman daima sıfırıncı konumdadır.
Bazen biz yazılımcılar için seçilen indeks numarası değil de seçilen nesnenin doğrudan ismi gerekebilir ve bunun için
SelectedItem (seçilen öğe) propertysini ToString() metoduyla string ifadeye çeviriyoruz; bu örneğimizde ise
seçilen şehri mesaj kutusunda gösterelim:
Programımızı yeniden çalıştırıyoruz:
Gördüğünüz gibi ComboBox'ın gayet kolay bir kullanımı var. :)
Şimdi nesne yönelimli programlama konusuyla ilgili örneğimize geçelim, öncelikle formumuza yeni bir buton ve bir combobox ekliyoruz ve butonumuzun ismine markaları getir yazıyoruz:
Ardından yeni bir sınıf oluşturuyoruz:
ve sınıfımızı hazırlıyoruz:
Oldukça sade bir class oluşturduktan sonra marka sınıfımızdan birden çok instance alarak combobox nesnemize dolduruyoruz:
Projemizi çalıştırıyor ve markaları getir butonumuza tıklıyoruz:
Peki combobox kontrolümüze neden markaların isimleri değil de böyle garip isimler geldi?
Bunun cevabı .Net Framework'ün mimarisinde yatıyor; bir combobox nesnesine başka bir sınıftan örnekleme (instance) alınmış bir nesneyi (örneğimizdeki marka1 gibi) verdiğimizde combobox o nesnenin hangi özelliğini bilmemektedir.
O yüzden comboboxa Marka sınıfımızın hangi özelliğindeki değeri yansıtacağını biz yazılımcılar belirtmemiz gerekiyor ve bunu yapmanın 2 yolu vardır;
Birincisi aşağıdaki gibi combobox property ekranından Display Member (görüntülenecek üye) özelliğine sınıfımızda kullandığımızı propertylerden birinin ismini vererek :
veya bu özelliği kod satırında da verebiliriz:
ya da gerçek bir yazılımcı gibi davranarak sınıfımızı daha önce nesne yönelimli programlama konusunda öğrendiğimiz override tekniğiyle ToString() metodunu yeniden yapılandırarak (ezerek):
Bu yöntemlerden hangisini kullanırsak kullanalım aynı kapıya çıkıyoruz:
Peki neden override tekniğini öneriyorum?
C# nesne yönelimli bir programlama dilidir, bizim projelerimizde oluşturduğumuz static dışındaki her sınıf System.Object sınıfından otomatik biçimde kalıtım (inheritance) almaktadır ve System.Object sınıfındaki ToString() metodu içinde bulunduğu namespace ve sınıfın adını döndürmektedir.
Eğer oluşturduğumuz her sınıfımızın içinde ToString() metodunu override etmezsek kalıtımını aldığı System.Object sınıfındaki gibi davranarak kendi içinde bulunduracağı namespace ve class adını verecek ve böylece combobox örneğimizdeki gibi kullanıcının ekranına anlamsız bir metin sunacaktır.
O halde diyebiliriz ki; Combobox, kendisine verilen sınıfın ToString() metodu ne veriyorsa onu ekranda gösterecektir.Bunu şu şekilde kanıtlayalım, override metodumuza dönelim ve MarkaAdi property'mizin soluna Marka sözcüğünü koyalım:
Yeniden programımızı çalıştıralım:
Evet, gerçekten de combobox kontrolümüz kendisine verilen sınıf örneğindeki ToString() metoduna bakıyormuş :)
Sanırım tam bu noktada nesne yönelimli programlamanın ne olduğu biraz daha canlanmış olmalı, unutmayın iyi bir yazılımcı nesne yönelimli programlamayı oldukça iyi kullanabilmeli yoksa her combobox, listbox gibi kontrollerde yeniden yeniden DisplayMember tanımlayarak zaman kaybederek projenin teslim süresini geciktirerek imajını zedelemiş olur.
Combobox makalemizin böylece sonuna gelmiş bulunuyoruz,bir sonraki makalemizde görüşmek üzere kendinize iyi bakın. :)