Makale Özeti

Bu makalede sizlerle birlikte adını searchbox olarak belirlemenin uygun olacağı bir kontrolü yazacağız. Bu kontrol ilk bakışta bir ComboBox gibi gözüksede F2 tuşuna bastığımızda karşımıza detaylı bir arama ekranı çıkmakta ve istediğimiz kayıdı burda kriterlerimizi beliryerek rahatlıkla arayabilmekteyiz. ComboBox içinde çok fazla verinin olduğu durumlarda çözüm olarak kullanılabilecek olan bu kontrolü kullanmak için hiçbir ek kod yazmanıza gerek yoktur ve çok genel bir yapı olduğundan her form üzerinde rahatlıkla kullanılabilir.

Makale

         Merhabalar,

         Bu makalede sizlerle birlikte adını searchbox olarak belirlemenin uygun olacağı bir kontrolü yazacağız. Bu kontrol ilk bakışta bir ComboBox gibi gözüksede F2 tuşuna bastığımızda karşımıza detaylı bir arama ekranı çıkmakta ve istediğimiz kayıdı burda kriterlerimizi beliryerek rahatlıkla arayabilmekteyiz. ComboBox içinde çok fazla verinin olduğu durumlarda çözüm olarak kullanılabilecek olan bu kontrolü kullanmak için hiçbir ek kod yazmanıza gerek yoktur ve çok genel bir yapı olduğundan her form üzerinde rahatlıkla kullanılabilir.

         Kontrolümüzü yazmak için ilk önce bir tane Class Library tipinden proje oluşturuyoruz ve içine Helper.cs isminde bir class file yaratıyoruz. Bu dosyada bulunan class larda kontrolümüz tarafından kullanılacak olan genel yapıları saklayacağız. Şimdi isterseniz bu classların nasıl yazıldığını inceleyelim.

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
 
namespace SearchBoxComponent
{
        public class Helper
        {
            public enum enmSearchType
            {
                Like=0,
                Equal=1,
                NotEqual=2,
                Greater=3,
                Smaller=4
            }
        }
          Bu kısımda yazdığımız Helper isimli class ın içinde arama ve filitreleme işlemlerimizin hangi kriterlere göre yapılacağının saklanması için yazdığımız enum değişken bulunmaktadır. İzimlerden görebileceğiniz gibi bileşenimiz benzer, eşit olan veya olmayan, büyük veya küçük olan kayıtları filitreleyebilmektedir. Şimdi ise arama kriterlerimizin tutulacağı nesnemizi yazalım.
 
        public class Criteria
        {
            public Criteria()
            {
 
            }
            public Criteria(string parColumnName, SearchBoxComponent.Helper.enmSearchType parSearchType, string parCriteria)
            {
                this.proColumnName = parColumnName;
                this.proSearchType = parSearchType;
                this.proCriteria = parCriteria;
            }
          Nesnemizin yapıcı metodlarından bir tanesi boş iken diğerinde hangi kolonda filitreleme yapılacağının belirlendiği string değişkeni, aramanın hangi kritere göre yapılacağının belirlendiği enum tipinden değer ve filitreleme yapılacak değeri string cinsinden alan bir yapı mevcuttur ve bu değişkenleri class içinde tanımlanmış olan propertylere atamaktadır.
 
            private string memColumnName = "";
            private SearchBoxComponent.Helper.enmSearchType memSearchType =Helper.enmSearchType.Equal;
            private string memCriteria = "";
            public string proColumnName
            {
                get{return memColumnName;}
                set{memColumnName = value;}
            }
            public SearchBoxComponent.Helper.enmSearchType proSearchType
            {
                get{return memSearchType;}
                set{memSearchType = value;}
            }
            public string proCriteria
            {
                get{return memCriteria;}
                set{memCriteria = value;}
            }
            public string getCriteria()
            {
                if (memColumnName != "" && memCriteria != "")
                {
                    if (memSearchType == Helper.enmSearchType.Equal)
                    {
                        return memColumnName + " = '" + memCriteria + "'";
                    }
                    else if (memSearchType == Helper.enmSearchType.Like)
                    {
                        return  memColumnName + " like '" + memCriteria + "%'";
                    }
                    else if (memSearchType == Helper.enmSearchType.NotEqual)
                    {
                        return memColumnName + " <> '" + memCriteria + "'";
                    }
                    else if (memSearchType == Helper.enmSearchType.Greater)
                    {
                        return memColumnName + " > " + memCriteria;
                    }
                    else if (memSearchType == Helper.enmSearchType.Smaller)
                    {
                        return memColumnName + " < " + memCriteria;
                    }
                }
                return "";
            }
        }
          Bu kısımda ise ilk önce private memberlarımızı daha sonra propertylerimizi tanımlıyoruz ve nesnemizin en önemli özelliği olan getCriteria() metodunu yazıyoruz. Bu metod nesnedeki field'lara atanmış değerlerden yola çıkarak bize DataView nesnesinin RowFilter propertysine yazabileceğimiz şekilde bir sorgu cümlesi üretmekte ve bunu string tipinden geri döndürmektedir. Birçok kriteri aynı anda belirtebileceğimizi söylemiştik, bunu sağlayabilmek için bu kriterleri bir Collectionda tutmak doğru çözüm olacaktır.Bundan dolayı şimdi bu collection'umuzu yazalım.
 
        public class CriteriaCollection : CollectionBase
        {
            public string getQuery()
            {
                if (InnerList.Count > 0)
                {
                    StringBuilder insStringBuilder = new StringBuilder();
                    foreach (Criteria insCriteria in this.InnerList)
                    {
                        insStringBuilder.Append(insCriteria.getCriteria());
                        insStringBuilder.Append(" AND ");
                    }
                    return insStringBuilder.ToString();
                }
                return "";
            }
 
            #region IList<Criteria> Members
 
            public int IndexOf(Criteria item)
            {
                return InnerList.IndexOf(item);
            }
 
            public void Insert(int index, Criteria item)
            {
                InnerList.Insert(index, item);
            }
 
            #endregion
 
            #region ICollection<Criteria> Members
 
            public void Add(Criteria item)
            {
                InnerList.Add(item);
            }
 
            public bool Contains(Criteria item)
            {
                return InnerList.Contains(item);
            }
 
            public void CopyTo(Criteria[] array, int arrayIndex)
            {
                InnerList.CopyTo(array, arrayIndex);
            }
 
            public bool IsReadOnly
            {
                get
                {
                    return InnerList.IsReadOnly;
                }
            }
 
            public bool Remove(Criteria item)
            {
                InnerList.Remove(item);
                return true;
            }
 
            #endregion
 
            #region IEnumerable<Criteria> Members
 
            public new IEnumerator<Criteria> GetEnumerator()
            {
                return (IEnumerator<Criteria>)InnerList.GetEnumerator();
            }
 
            #endregion
        }
}
          Yazmış olduğumuz bu collection standart bir collection yazılımı olduğundan metodların neler olduklarını ve neler yaptıklarını burada ayrıca açıklamıyorum ancak bu collectionda işimize yarayan ve en çok kullanacağımız getQuery() isimli bir metod yazdık. Bu metod Collectionda bulunan her Criteria nesnemiz için tek tek nesnelerin getCriteria metodlarını çağırıyor ve bu metodların döndürdüğü string verileri bir StringBuilder yardımı ile aralarına AND ekleyerek birleştiriyor ve bize tüm kriterlere göre sorgu yapan sorgu cümlesini döndürüyor. Şimdi ise isterseniz esas bileşenimiz olan SearchBox bileşenimizi yazalım.
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Data;
 
namespace SearchBoxComponent
{
    public class SearchBox : ComboBox
    {
        private void showSearchBox()
        {
            frmSearch insFrmSearch = new frmSearch(this,(DataTable)this.DataSource,this.DisplayMember,this.ValueMember);
            insFrmSearch.ShowDialog();
        }
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.KeyData == Keys.F2)
            {
                showSearchBox();
            }
        }
    }
}
          SearchBox kontrolümüz ComboBox'tan türemiştir ve KeyDown event'ı ezilerek F2 tuşuna basıldığı zaman showSearchBox() metodunu sayesinde genel arama ekranımız olan frmSearch formumuzu göstermektedir. Bu formumuz'un şekillenebilmesi için yapıcı metodunda kullanıcının aramalar sonucunda seçtiği değeri ComboBox' a geri atayabilmesi için formu açan kotrolü, formu açan SeachBox kontrolünün DataSource,DisplayMember ve ValueMember propertylerini parametre olarak almaktadır ve daha sonrasında ShowDialog metodu le kullanıcıya gösterilmektedir. Makalenin ikinci kısmında aşağıdaki arama ekranını yazacağız. Ve kontrolümüzün nasıl kullanıldığını inceleyeceğiz.
 

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com
Ornek Kodlar