Bazı durumlarda TextBox'ımızda ki bilgilerin baş harfini belirttiğimizde onunla ilgili ve devamı ile ilgili bilgileri getirmek isteyebiliriz.Hatta tamamlama özelliğini bile kullanabiliriz buna deyineceğiz.
Textbox'ımızda autoComplete özelliğini akfit hale getirmek için AutoCompleteStringCollection isimli sınıfdan bir nesne yaratıyoruz, içerisinde kolleksiyon barındırır.Bu nesne datasource olarak attığımız kontrole otomatik tamamlama işlevi kazandırır.Bu nesnemizin içine tamamlamasını istediğimiz bilgileri oluşturduğumuz nesne'nin Add() metoduna parametre verilerek oluşturulur. Bu özelliği eklemek istediğimiz TextBox'ın properties'ine gidip AutoCompleteMode özelliğini Suggest yapıyoruz örneğimizde.
AutoCompleteMode Özellikleri
Suggest : Suggest yapmamızın mantığı karakterleri teker teker girerken devamı ile
olanları listeleyerek kolaylık sağlar.Mantığı aşağıdadır.
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.
SuggestAppend : Bu ise girilen bilgileri doğrultusunda hem Suggest'deki gibi karaktere göre kontrolün aşağısında uyan bilgileri listelediği gibi Append özelliğinide kullanarak kontrol üzerinden bilginin devamının tamamlama işlemini yapar.
AutoCompleteSource özelliğini ise CustomSource yapıyoruz.Bu ise tamamlama kaynağını belirtiyor.Mesela basit bir Web Browser yazıyor iseniz bu propertinin AllUrl özelliği cookies'deki siteleri getirir.Otomatik olarak tamamlayarak internet explorer veya mozilla tarzı adres çubuğu yapılabilir :)
Bu özelliği eğer dinamik olarak değilde sabit veriler arasında listeleme yapacak isek code bölümünde nesne oluşturmamıza gerek yoktur.TextBox'ımızın Properties'inden AutoCompleteCustomSource isimli kolleksiyondan 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ş oluruz.
Biz örneğimizde işleri uzatarak en uzun yoldan tamamlama özelliğini kullanacağız :) .Programcıkta işlevin amacı bizden normal Sql bağlantısında gerekli olan DataSource ve Database bilgilerini aldıktan sonra WINDOWS AUTHENTICATION modda bağlantığımızdan o kullanıcı adı ve şifrene gerek yok.Daha sonra ise girmek istediğimiz Tablo adını ve o girdiğiz tablodan hangi kolon üzerinden TextBox'ımızda autoComplete özelliğini aktif hale getirmek istiyorsak Tablomuzdaki kolonun index'ini gireceğiz.Tüm bilgileri girip Kayıtları Getir butonuna bastığımızda Veri tabanı bilgileri doğru ise dataGrid'imizde tablo bilgilerimizi doldurup TextBox'ımızdan da belirttiğimiz kolondaki bilgiler üzerinden otomatik tamamlamak üzere bilgilerin listelendiğini görüceksiniz.Daha da geliştirilerek textBox'da otomatik olarak listelenen kayıtlara göre GridView'ede sorgu atılıp o doğrultuda ki bilgileri getirilebilir.Şimdi aklıma geldi mesela :)
Program üzerinde AutoCompleteStringCollection sınıfından başka hiçbir yabancı kod yoktur.Diğerleri normal Sql Server'e bağlanılmada gerekicek bilgilerden oluşur.Bunlar SqlCommmand,SqlConnection,SqlDataReader ve DataTable.
Programda bilgileri doğru şekilde girersek çalışır hali aşağıdaki gibi olacaktır.Aşağıdaki görüntüye göre konuşacak olursak kolon index'ine 1 verdiğimizden 0 numaralı index'e sahip olan id kolonu değilde 1 numaralı index'e sahip olan ad kolonuna göre TextBox'ta listeleme yapacaktır.
Yukarıda çalışır halinide gösterdikten sonra kod açıklamalarına başlayabiliriz.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
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();
//Sql'e sorgu attığımız SqlCommand nesnesi ve bağlantı bilgilerini belirttiğimiz SqlConnection nesnesini global olarak tanımlıyoruz.
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;
//datasource , databaseName ve tabloAdi string değişkenlerine formumuzdaki textBox'lardan girilen değerleri atayarak SqlConnectionumuzu oluşturuken ki bilgilerimize ekliyoruz.
string datasource = txtDataSource.Text;
string databaseName = txtDatabaseName.Text;
string tabloAdi = txtTabloAdi.Text;
//Yukarıdaki değişkenleri connection bilgilerimize atadık
con = new SqlConnection("data source=" + datasource + ";initial catalog=" + databaseName + "; integrated security=true");
//veritabanımıza sorgu atabilmemiz için con nesnemizi açıyoruz.
con.Open();
//ve global olarak oluşturduğumu cmd isimli SqlCommand nesnemizi örnekleyerek cmd nesnemizin Connection parametresine yukarıda oluşturduğumuz connection nesnesini atayarak CommandText propertysine ise veritanımıza tüm kayıtları getirmesi için oluşturduğumu sorguyu yazarak tablo bilgisini kullanıcı belirleyeceğinden formdaki txtTabloAdi isimli kontrolden tablo adını vererek tüm kayıtları getirmesi için gereken sorguyu yazıyoruz.
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * from " + txtTabloAdi.Text;
//cmd nesnemizdeki tabloyu SqlDataReader ile satır satır okuyacağız.
SqlDataReader dr = cmd.ExecuteReader();
//Formda bulunan index bilgisini txtKolon isimli TextBox'tan alarak kolon isimli değişkenimize atıyoruz.
int kolon = int.Parse(txtKolon.Text.ToString());
//While döngüsü kurarak dr nesnemizde kayıtlar bitene kadar Read() metoduyla sonuna kadar okuma işlemi yapılıyor.
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());
}
//okuma işlemi bittiğinden bağlantımızı kapatıyoruz.
con.Close();
//while döngüsü ile okuyup gerekli kolondaki bilgileri nesnemize atadıktan sonra hangi kontrole source olacağını belirtmemiz gerekiyor.Burada ise textbox1 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.
textBox1.AutoCompleteCustomSource = otomatikTamamlama;
//tek yapmamız gereken kayitGetir() isimli metodu çağırmak olacaktır.Bu metot belirttiğimiz tablodaki kayıtlara alarak bir datatable nesnesini içine atıp bu datatable nesnesinide dataGrid'mize atayıp bize bilgileri gösterir.
kayitGetir();
btnAyarla.Enabled = false;
}
catch
{
//Bağlantımızda ve bilgilerimizde bir problem olduğunda listeleme işlemi yapılamadığından hata mesajını kullanıcıya veriyoruz.
lblYukleniyor.Text = "Hata oluştu !";
MessageBox.Show("Geçersiz veritabanı bilgileri girildi !", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void kayitGetir()
{
//Tüm bilgiler doğru olduğunda bu metodumuzda form'da belirtilen tabloya gidip tüm kayıtları getiren sorgumuzu yazıyoruz.
cmd = new SqlCommand("select * from "+txtTabloAdi.Text, con);
//Tablomuzu bir datatable'ye aktaracağımızdan aradaki bağlantıyı sağlayan SqlDataAdapter nesnemizi oluşturuyoruz.
SqlDataAdapter da = new SqlDataAdapter();
//Veritabanımızdaki tablomuzun tutulduğu table nesnemizi oluşturuyoruz.
DataTable dt = new DataTable();
//DataAdapter nesnemizin SelectCommand propertyisi ile cmd nesnemizi atayarak select işlemi yapacağımızı belirtiyoruz.
da.SelectCommand = cmd;
//dataadapter nesnemizde olan tabloyu hafızada duran DataTable nesnemize atmamız için da nesnemizin Fill() metodunu kullanarak datatable'ye atıyoruz.
da.Fill(dt);
//Ve artık veritabanımızdaki tablo dt isimli datatable nesnesinde olduğundan forma eklemiş olduğumuz dataGridView1 kontrolünün datasource özelliğinde atıyoruz.Böylece dt nesnemizin içinde bulunan tablodaki kayıtları dataGrid'imizde listelemiş oluyoruz.
dataGridView1.DataSource = dt;
}
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
//DataGrid'imizin DataBindingComplete event'i ise yükleme tamamlandığında çalışacak olan eventtir.Bu doğrultuda lbl'lerimizin değerlerini belirtiyoruz.
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)
{
//Restart butonu ise uygulamamızı yeniden başlatır.
Application.Restart();
}
}
}
Bu şekilde veritabanımıza bağlanarak AutoCompleteStringCollection sınıfını kullanıp işlemler yaptırdık.Direk Add() metodunu kullanarakta yapabilirdik aslında ama değişik olsun istedim.Bu benim işimi görmez diyerek kolay biçimde kullanıcı adı ve şifreli şeklinide yapabilirsiniz. :)
Projeyi kaynak koduyla indirmek için
Burdan ise MSDN'den yararlanarak metot ve diğer özelliklerine bakabilirsiniz.
Faydalı olması dileğiyle iyi çalışmalar herkese :)
Serhat TAŞ