Serkan Ayyıldız

Meraklı bir yazılım uzmanı...

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:

combobox


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:

combobox-property

Şimdide formumuza şehirleri getir isimli bir buton ekleyelim:

button

Butonumuza da bir isim veriyoruz:

button-property

Son olarak butonumuzun ismini yine Properties penceresindeki Text özelliğinden değiştirelim:

button-name

combobox-name

Projemizin amacı ise; kullanıcı butona tıkladığında ComboBox nesnesine şehirlerin isimleri gelsin.
Butonumuza çift tıklayarak kod kısmına geçiyoruz:

button-click

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:

combobox-item-add

Ya da örnek olarak daha önce öğrendiğimiz diziler ve döngüler konularını kullanabilir.Örneğin;

for-dongusu

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:

combobox-for-dongusu

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:

combobox-count

Tam bu esnada projemizi tekrar çalıştıralım ve bu defa butonumua iki kez tıklayalım:

combobox-tekrar-eden

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:

combobox-if-kontrol

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-item-clear

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:

combobox-clear

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:

windows-label

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:

combobox-selecteditem-changed

Öncelikle seçilen indeks numarasını yakalayalım:

combobox-index-value

Ardından gelen değeri label kontrolümüze yazı olarak verelim:

label-text-combobox

Programımızı çalıştırıyoruz ve örnek olsun diye şehirlerden Antalya'yı seçiyoruz:

combobox-select

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:

combobox-messagebox

Programımızı yeniden çalıştırıyoruz:

messagebox

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:

button-combobox

Ardından yeni bir sınıf oluşturuyoruz:

c-sharp-class

c#-sinif

ve sınıfımızı hazırlıyoruz:

class-property

Oldukça sade bir class oluşturduktan sonra marka sınıfımızdan birden çok instance alarak combobox nesnemize dolduruyoruz:

class-instance

Projemizi çalıştırıyor ve markaları getir butonumuza tıklıyoruz:

combobox-doldur

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 :

display-member

veya bu özelliği kod satırında da verebiliriz:

combobox-display-member

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):

class-override

Bu yöntemlerden hangisini kullanırsak kullanalım aynı kapıya çıkıyoruz:

combobox-override

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:

tostring-override

Yeniden programımızı çalıştıralım:

form-combobox

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. :)



Bir yorum bırak E-posta adresiniz yayınlanmayacaktır.

Menu