Makale Özeti

Bu makalemizde AutoCompleteStringCollection koleksiyon sınıfı ile masaüstü uygulamalarda kullanıcının TextBox'a girdiği metni algılayarak karşısına o metinle ilgili seçeneklerin çıkarılması işlemini inceleyeceğiz.

Makale

Geliştirdiğimiz veri tabanı destekli uygulamalarımız da kullanıcının daha hızlı işlem yapabilmesi için ufak tefek kolaylıklar sağlamaktayız.İşte bu yazımız da küçük ama etkili yöntemlerden biri olan AutoCompleteStringCollection sınıfını kullanarak kullanıcı dostu bir özelliği inceleyeceğiz.Bu sınıf yardımı ile  örneğin bir kayıt formunu düşünelim, kullanıcı kayıt formunu doldururken isim alanına bilgi girerken her seferin de adın tamamını yazmak yerine girmek istediği isimin baş harfine bastığında girmiş olduğu harf ile başlayan isimleri listeleyebiliriz.İşte bunun gibi kolaylıklar sağlayarak uygulamalar yazabilmekteyiz.
Biz bu özelliği TextBox’da kullanacağız.Textbox'ımız da AutoComplete özelliğini aktif hale getirmek için AutoCompleteStringCollection isimli sınıf dan bir nesne yaratıyoruz ve bu nesne  içerisinde koleksiyon olarak üye barındırdığından oluşturduğumuz nesneyi datasource olarak attığımız kontrole otomatik tamamlama işlevi kazandırmaktadır.Nesnemizin içerisine tamamlamasını istediğimiz bilgileri nesne'nin Add() metodunu kullanarak da ekleyebiliriz.
Kullanacak olduğumuz özelliğin çeşitli şekilleri bulunmaktadır.Aşağıda girmiş olduğumuz bilgilerin tamamlanmasını sağlayan AutoCompleteMode  özellikleri açıklanmıştır.Bunlar;
Suggest :  Özelliğimizi Suggest yaparsak eğer biz TextBox’a veri girerken girmiş olduğumuz karakterin devamı ile olanları listeler.Görsel olarak çalışma şekli aşağıdaki gibidir.

Append : Bu özelliği aktif yaparsak ise karakterleri biz girerken ona benzer olanları aşağıda Suggest'deki gibi listelemez.Biz içeriği girdikçe ona uyan bilgiler doğrultusunda tamamlama işlemi yapar. “S” harfine bastığımızdan ilk bulduğu kayıt’ı getirmiştir.Aslında “S” ile başlayan “Serhat” ve “Serpil” olmasına rağmen.Bu yöntemde tek bir kayıt’ı getirmek istiyorsak kendimiz belirtmek zorundayız  AutoCompleteMode’na  Append  atandığı zaman ki çalışma şekli tahmin de edeceğiniz gibi aşağıdaki gibidir.

SuggestAppend : Bu özellik ise girilen bilgiler doğrultusunda hem Suggest'de ki gibi karaktere uyan bilgileri listeler ve Append özelliğini de kullanarak kontrol üzerinden bilginin devamının tamamlanmasını beklemektedir aşağıdaki gibi.

Biz örneğimizde AutoCompleteSource özelliğini CustomSource yapıyoruz. Bu özelliği eğer dinamik olarak değil de sabit veriler arasında listeleme yapmak için kullanıyor olsaydık  code bölümünde nesne oluşturmamıza gerek yoktur.TextBox'ımızın Properties'in den AutoCompleteCustomSource isimli koleksiyondan verilerimizi elle girebiliriz.Daha sonra AutoCompleteMode'u tamamlaması istediğimiz türü belirtip AutoCompleteSource'ı da CustomSource yaparak hiç kod yazmadan otomatik tamamlama özelliğini eklemiş olurduk.

Fakat biz örneğimiz de işleri uzatarak en uzun yoldan tamamlama özelliğini kullanacağız :) .Uygulamamızın amacı bizden normal Sql bağlantısın da gerekli olan DataSource ve Database bilgilerini aldıktan sonra veritabanına bağlanarak kayıtları getirmektir.Daha sonra ise girmek istediğimiz Tablo adını ve o girdiğiz tablodan hangi kolon üzerinden TextBox'ımız da AutoComplete özelliğini aktif hale getirmek istiyorsak tablomuzda ki kolonun index'ini girmekteyiz.Tüm bilgileri girdikten sonra Kayıtları Getir isimli butonuna bastığımızda ise Veri tabanı bilgileri doğrultusunda DataGrid'imiz de tablo bilgilerimizi doldurup TextBox'ımız dan da belirttiğimiz kolondaki index bilgileri üzerinden otomatik tamamlama özelliğini çalıştıracağız.Biraz daha geliştirilerek TextBox'da otomatik olarak listelenen kayıtlara göre GridView'e de sorgu atılıp o doğrultu da ki bilgiler getirilebilir mesela.

 Programda bilgileri doğru şekilde girildiğinde ki çalışır hali aşağıdaki gibi olacaktır.Aşağıdaki görüntüye bakacak olursak kolon index'ine 1 verdiğimizden 0 numaralı index'e sahip olan “id” kolonu değil de 1 numaralı index'e sahip olan “ad” kolonuna göre TextBox'ta belirtmiş olduğumuz AutoCompleteMode  türünden listeleme yapmaktadır.

Yukarıda uygulamamızın çalışır halini de gösterdikten sonra kod açıklamalarına geçebiliriz.

using System;

using System.Data;

using System.Windows.Forms;

using System.Data.SqlClient;

namespace WindowsFormsApplication4

{

    public partial class Form1 : Form

    {

        //AutoCompleteStringCollection sınıfından bir nesne yaratıyoruz.Bu nesne veritabanımızdan belirttiğimiz kolondaki bilgileri satır satır okurken nesnemizde Add() metodu ile ekleyerek TextBox'ımızda listelenmesini sağlayacağız.

        AutoCompleteStringCollection otomatikTamamlama = new AutoCompleteStringCollection();

       

        SqlCommand cmd;

        SqlConnection con;

 

        public Form1()

        {

            InitializeComponent();

        }

        private void btnAyarla_Click(object sender, EventArgs e)

        {

            try

            {

                lblYukleniyor.Text = "Kayıtlar Yükleniyor";

                lblTamamlandi.Visible = false;

 

                string datasource = txtDataSource.Text;

                string databaseName = txtDatabaseName.Text;

                string tabloAdi = txtTabloAdi.Text;

 

                con = new SqlConnection("data source=" + datasource + ";initial catalog=" + databaseName + "; integrated security=true");

 

                con.Open();

 

                cmd = new SqlCommand();

                cmd.Connection = con;

                cmd.CommandText = "select * from " + txtTabloAdi.Text;

               

                SqlDataReader dr = cmd.ExecuteReader();

               

                int kolon = int.Parse(txtKolon.Text.ToString());

 

                while (dr.Read())

                {

                    //Burada ise global olarak en üstte AutoCompleteStringCollection sınıfından oluşturduğumuz otomatikTamamlama isimli nesneye Add() metoduyla SqlDataReader nesnemize kolon değişkenimizdeki değeri vererek okuma işleminde belirttiğimiz kolondaki bilgileri otomatikTamamlama nesnesine ekliyoruz.

                    otomatikTamamlama.Add(dr[kolon].ToString());

                }

                con.Close();

                //while döngüsü ile okuduktan sonra gerekli kolondaki bilgileri nesnemize atayıp  hangi kontrole source olacağını belirtmemiz gerekiyor.Burada txtKayitGir isimli kontol olan listelemenin yapıldığı kontrolün AutoCompleteCustomSource özelliğine bilgilerin eklenmiş olduğu otomatikTamamlama nesnesini atayarak artık TextBox'ımızda o nesne içerisindeki bilgileri girdimiz doğrultusunda listelediğini göreceksiniz.

                txtKayitGir.AutoCompleteCustomSource = otomatikTamamlama;

               

                kayitGetir();

            }

            catch

            {

                lblYukleniyor.Text = "Hata oluştu !";

                MessageBox.Show("Geçersiz veritabanı bilgileri girildi !", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

       }

Yukarıda ki txtKayitGir’in AutoCompleteCustomSource özelliğine eklemiş olduğumuz değerlerin bulunduğu nesnemizi atadığımızı görüyoruz.TextBox’ımız Collection olarak değer alabildiğinden AutoCompleteStringCollection sınıfından oluşturduğumuz nesneyi Source olarak gösterebiliyoruz.

kayitGetir() isimli metot da ise veritabanımıza bağlanıp kullanıcının tablo adının belirttiği yani TextBox’dan gelen değeri  kullanarak SqlCommand nesnemizi tanımlıyoruz.Diğer işlemler ise normal veri okuma şeklindedir.SqlDataAdapter nesnemizin Fill isimli metodunu kullanarak cmd nesnemizi çalıştırıp kayıtları DataTable’mıza aktarıyoruz ve son olarak da bilgilerin olduğu bu DataTable nesnesini dataGridView’a aktararak kayıtları başarılı bir şekilde gösteriyoruz.

                void kayitGetir()

        {

            cmd = new SqlCommand("select * from "+txtTabloAdi.Text, con);

            SqlDataAdapter da = new SqlDataAdapter();

            DataTable dt = new DataTable();

 

            da.SelectCommand = cmd;

            da.Fill(dt);

 

            dataGridView1.DataSource = dt;
       }

Kayıtlarımızı listelediğimiz dataGridView’ın DataBindingComplete isimli Events’ini çalıştırarak veritabanından kayıtların gridView’e yüklenmesinden sonra işlem yapmamızı sağlıyoruz.

        private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)

        {

            lblYukleniyor.Visible = false;

            lblTamamlandi.Visible = true;

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            lblTamamlandi.Visible = false;

        }

        private void btnRestart_Click(object sender, EventArgs e)

        {

            Application.Restart();

        }

    }

}

Tabi ki TextBox’ımızın AutoCompleteSource özelliğini kullanarak bir çok işlemler yapabiliriz.Örneğin basit bir browser yapmak istiyorsak ve önce ki girilen adresleri de listelemek istiyorsak TextBox’ımızın  AutoCompleteSource özelliğini “AllUrl” yapmamız yeterli olacaktır.AutoCompleteMode’dan ise listeleme şeklini belirttikten sonra artık her browser’da olan adres listeleme özelliğini eklemiş oluyoruz aşağıdaki gibi.

 Bu şekilde veritabanımıza bağlanarak  AutoCompleteStringCollection sınıfını kullanıp işlemler yaptık.Hiç veritabanı üzerinden işlem yapmayıp nesnemizin Add() metodunu kullanarak da yapabilirdik fakat uygulama içerisinde veritabanından gelen kayıtlar üzerinden bu işlemleri yapabildiğimizi bilmek faydalı olacaktır.
MSDN'den diğer özelliklerine bakabilirsiniz.

Bir sonraki makalede görüşmek dileğiyle.İyi çalışmalar herkese :)

Serhat TAŞ
www.serhattas.net