5 Ocak 2010 Salı

CheckedListBox

CheckedListBox       



               CheckedBoxList componenti  genel olarak bir grup veri arasından bir veya birden fazla seçim yapmak için kullanılır.ListBox dan farklı olarak listedeki değerlerin yanında seçmek için bir checkbox bulunur.

Görüntüsü ;

 şeklindir.








         Aslında component özelliklerine bakarsak normal bir Listboxdan farksız olduğunu görüceksiniz.Aslında öyle.Bikaç Ayrıntı Hariç.Birkaç özelliğini incelemek gekirse ;
   
            Listeye bir veri eklemek istediğimizde veya verilerle ilgili diğer işlemlerde ListBoxda olduğu gibi items altında bulunan metotlar kullanılır.

                CheckedListBox1.Items.Add("Kastamonu");  //Listeye Veri Ekle
                int i = CheckedListBox1.Items.IndexOf("İstanbul"); //İstanbul bilgisini index değerini bul

                string value = CheckedListBox1.Items[1].ToString(); //indexi 1 olan veriyi oku
        
          Buraya kadar ListBoxdan çokta farklı olmadığını gördük.ListBox dan farklı olarak ise ;

          for (int i = 0; i < CheckedListBox1.CheckedItems.Count; i++)
            {
                MessageBox.Show(CheckedListBox1.CheckedItems[i].ToString());
            }

        
         Yukarıda lisetede seçili olan elemanları CheckListBoxın CheckItem özelliğinden faydalanarak mesaj olarak gösterdik.Tabi burada amaç sadece ne işe yaradığını öğrenmek. MessageBox.Show yerine bir çok farklı kod yazılabilirdi..Bunlardan biride seçilen kayıtların veritabanına yazılması gibi.

       CheckBoxın birkaç önemli özelliğinden bahsetmek gerekirse
               bool status = CheckedListBox1.GetItemChecked(1);//Listede Indexi 1 olan verinin seçim durumunu göster

      listedeki bir  değerin  durumu öğrenme gösterilir.Bunun tersi olarak ise
              CheckedListBox1.SetItemChecked(1, true);//Indexi 1 olan verinin seçimini true yap
      listedeki bir değerin durmunu değiştirme olabilir.

       CheckListBoxın önemli özelliklerinden biride  CheckOnClick özelliği.Listeden seçim yaparken tek tıklamadamı yoksa çift tıklamadamı seçileceği.
              CheckOnClick=false ; durumunda eğer listeden bir değeri ilk defa seçiyorsanız sadece o satır seçilir.Yanındki kutucuğun değerini değiştirmek isterseniz tekrar tıklamanız gerekecektir.Bu ise seri işlemlerde zaman kaybına yol açmaktadır.
              CheckOnClick=true; durumuda ise listeden bir değeri seçdiğiniz anda yandaki kutucuğun durumu değişir.Bu gibi durumda ise listedeki veriler arasında dolaşırken istenmeyen sonuçlara neden olur.
              Bu iki farklı durumda da  tam istediğimiz sonucu elde edemedik.Aslında TreeView componentinde olduğu gibi sadece kutucuğa tek tıklayarak durumunu değiştirmek işimizi görebilirdi.Ama componentin özelliğinide değiştiremezdik :).Bunun yerine bir takım kodlar yazaran bunu mümkün kılmak gerekirdi.Yine TreeView componetinden yola çıkarak  düşünmek gerekirdi.Kutucuğa tıklanıldığında durmunun değişmesi ...Tam da istediğim buydu.Burdan yola çıkarak bir kaç kod ile bu sorunu hallettim..

Kodları inceleyecek olursak ;
       int EskiDeger=-1 ;//Listenin son index değerini tutmak için tanımlı değişken
      //Bu değişkeni tanımlamızın amacı seçilen veri üzerinde ek bir işlem yapmaya gerek duymamak.Eleman seçili ise tek tıklama ile kutucuğun durumu değiştirlebilir.
       private void CheckedListBox1_MouseDown(object sender, MouseEventArgs e)
        {
        //Listeye Mouse ile tıklandığı anda işlemler gerçekleşmeli
        if (e.X < 14) // İlk olarak tıkladığımız yerin X konumu kontrol ediyoruz..kutuya tıkladığımızdan emin olmamız lazım Buradaki 14 değeri yaklaşık olarak kutucuğun genişliğidir
            {
                    int Secilen=CheckedListBox1.SelectedIndex;//Seçilen değerin index değerini alıyoruz
                    if (EskiDeger!=Secilen)//Burada seçilen değerin üzerinde işlem yapmak istemediğimizden bir önceki değer ile karşılaştırıyoruz
                   {
                          bool durum=CheckedListBox1.GetItemChecked(Secilen);//Tıkladığımız kutunun değerini oku
                          CheckedListBox1.SetItemChecked(Secilen, !durum); //Burada  ise tıkladığız değerin durumu ! işareti ile tersine döndürdük (true ise false / false ise true olacaktır)
                     }
                    EskiDeger=Secilen//Son olarak ise EskiDeger değişkenine seçtiğimiz index numarısnı yazmak
              }
        }

       Kodlarımız bu kadar kısa ve basit.Fakat yaptığı iş gerçekten önemli..Artık listedeki bir kutucuğu seçmek için o satırı seçmemize gerek kalmayacaktır :)

      Herkese minimum hatalı programlar :)

7 yorum:

  1. s.a kardeş benim aradığım ordaki seçeneklerden birini işaretlediğimizde diğerlerinin false(pasif) hale gelmesi.Bu konuda yardımcı olabilirsen çok sevinirim. vectraci.dikey@hot.com

    YanıtlaSil
  2. for (int k = 0; k < checkedListBox1.SetItemChecked(k, false); )
    {
    checkedListBox1.SetItemChecked(k, false);
    }
    //unutmadan şunuda belirtiyim şöyle bir kod denedim fakat==>Error 1 Operator '<' cannot be applied to operands of type 'int' and 'void' HATASI VERDİ

    YanıtlaSil
  3. Tam olarak istediğini anlamadım ama ;
    Eğer tüm kayıtları false yapmak istersen
    ---------------------------------
    for (int i = 0; i < checkedListBox1.Items.Count;i++ )
    {
    checkedListBox1.SetItemChecked(i, false);
    }
    --------------------------------
    Listeden 1 tane seçip diğerlerinin false olmasını istersen
    ---------------------------------
    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
    for (int i = 0; i < checkedListBox1.Items.Count; i++)
    {
    if (i!=e.Index)
    checkedListBox1.SetItemChecked(i, false);
    }
    }
    ------------------------------
    kolay gelsin ..

    YanıtlaSil
  4. Teşekkürler güzel bir yazı olmuş.

    YanıtlaSil
  5. Emeğine sağlık aydınlatıcı olmus ama peki checkedListBox içindeki seçilmiş olan bir kay veriyi nasıl veri tabnına kaydedicez kaydet butonuna basınca

    YanıtlaSil
  6. emeğine sağlık peki kaydet butonuyla seçılmiş olann birkaç veriyi nasıl kadedicez veri tabına

    YanıtlaSil
  7. Konu üstünden çok zaman geçmiş ama ben şimdi gördüğüm için bundan sonra bakacak kişilere'de söylemiş olayım:
    Soru sormadan önce araştırıp kendiniz birşeyler deneyin eğer iyi araştırdığınız ve aklınıza gelen bütün cevapları tükettiğiniz zaman soru sormanızda veya konu açmanızda fayda var :)

    Eline sağlık güzel konu işimi gördü.

    YanıtlaSil