Makale Özeti

  Önceki bölümde sadece rakam girilebilecek bir TextBox oluşturmuştuk, bu bölümde ise bu TextBox ımızı biraz daha geliştirip farklı projelerinizde nasıl kullanabileceğinizi inceleyeceğiz.

Makale

C# ile Numeric TextBox Bileşeni 2

 

Önceki makalede sadece rakam girilebilecek bir TextBox oluşturmuştuk, varolan TextBox classını türeterek kendi istediğimiz ekstra yetenekleri yazmıştık, bir property, bir event ve birde metot ezerek bu işlerimizi gerçekleştirdik, şimdi ise bir olay yaratacağız ve bu olayın çalışmasını sağlayacağız, daha sonra Attribute leri kullanarak bu TextBox ile ilgili bazı genel tanımlamalar yapacağız ve projemize nasıl ekleyebileceğimizi inceleyeceğiz.

 

Bu TextBox a yapacağımız ilk işlem yeni bir olay (event) oluşturmak, bu olay kullanıcı Entere bastığında tetiklenecek ve TextBox ı kullan kullanıcı bu olaya bir kod yazabilecek, bizim istediğimiz kullanıcının TextBox dayken Entere basması durumu olduğu için ben kullanıcının Entere basıp basmadığını takip etmeliyim

Daha önceki kodu aşağıdaki gibi düzenleyin

 

protected override void OnKeyPress(KeyPressEventArgs e)

{

      if ((int)e.KeyChar >= 47 && (int)e.KeyChar <= 58)

      {

            e.Handled = false;

      }

      else if ((int)e.KeyChar == 8)

      {

            e.Handled = false;

      }

      else if ((int)e.KeyChar == 13)

      {

            EntereBasti(new object(), e);

      }

      else

      {

            e.Handled = true;

      }

      //throw new NotImplementedException();

}

 

Bu kod aslında sadece bir Event in tetiklenmesini sağlıyor, eğer kullanıcının bastığı tuş ASCII kodu 13 olan tuş ise yani Enter Tuşu ise EntereBasti olayını tetikliyor, EntereBasti olayı ise bütün event lar gibi iki parametre alıyor, bunlardan bir tanesi Sender olan parametre ben bu parametre için yeni bir object oluşturuyorum, ancak e için bir KeyPressEventArgs türünden değişken vermem gerekiyor, onuda sınıftan oluşturabilirdim ancak gelen bir e değişkenim var ben o e değişkenimi kullanarak işlemlerin bu e ile yürümesini sağladım. Peki bu olay nerede ? bu olayı aynı Class ın içinde aşağıdaki şekilde tanımlayabilirsiniz

 

public event KeyPressEventHandler EntereBasti;

 

 

event Keywordu bir olay tanımlamanıza yarıyor ve bu Event in türü aslında Klavyenin tuşlarını düzenlediği için KeyPressEventHandler türünde, burada standart olarak EventHandler veri türünüde kullanabilirsiniz. Böylece artık benim numericTextBox ımın kendisine ağit bir olayıda olmuş oldu ve kullanıcı bu olayı istediği gibi kullanabilir. Biraz sonra bir Windows Forma bu kontrolü nasıl ekleyeceğimizi göreceğiz, orada çok daha anlam kazanacak yaptığımız bu iş.

 

Şimdi bu bileşenimiz için bazı özel tanımlamalar yapalım, bu tanımlamalara Attribute deniliyor, Attribute derleyiciye işlemlerini yaparken klavuzluk etmesi için tasarlanmış bir yapıdır. Böylece derleyiciye bazı işlerin özelliklerini belirtebiliriz. İlk iş olarak demin tanımladığımız event i bu bileşen için default event yapalım, .Net ile programcılığa başlayanların özellikle sorduğu bir soru vardır, örneğin Button için “neden dizayn zamanında bir buttona iki kere kliklediğimizde hem Button_Click olayı oluşuyor” bunun nedeni button için varsayılan olay olarak Click olayı seçilmiştir, TextBox lar için ise varsayılan olay olarak genellikle TextChange olayı seçilmiştir ancak ben şimdi kendi yazdığım bileşenimde varsayılan olayı EntereBasti olarak tanımlayacağım, bu yapacağım işlemin mantığını şöyle kurabilirsiniz, bu varsayılan olay bu bileşenin varsayılan olayı o yüzden bileşende tanımlamak gerekiyor, bundan dolayı Classınızın en başına gidip Classınızın tanımlanması aşağıdaki gibi düzenleyin.

 

[System.ComponentModel.DefaultEvent("EntereBasti")]

public class NumericTB : TextBox

 

Böylece varsayılan olay benim demin tanımladığım EntereBasti olayı olarak atandı, şimdide varsayılan property i ayarlayalım, deminki mantığı buradada düşünebilirsiniz, yine aynı mantıkla bu bileşenimin varsayılan olayı olduğu için Classımda tanımlayacağım. Bunun için demin tanımladığımız class değişkenini aşağıdaki şekilde tekrar düzenleyin. Her seferinde System.ComponentModel yazmamak için en yukarıya using System.ComponentModel yazın.

 

[System.ComponentModel.DefaultEvent("EntereBasti"), DefaultProperty("Text")]

public class NumericTB : TextBox

 

böylece siz nesneyi seçip Properties penceresine baktığınızda seçili olarak gelecek olan Property i de tanımlamış oluyoruz, şimdi bu Text Property sine bazı özel işlemler daha yapalım, örneğin bu Text propertysinin tanımlamasını ve kategorisini değiştirelim. Property tanımlamasını aşağıdaki şekilde düzenleyin.

 

[Description("Lütfen Rakam Giriniz."),Category("Numeric Text Box")]

public override string Text

 

 

Böylece nesneyi formun üstüne ekledikten sonra Properties ekranında aşağıda yazan tanımlamayı ve Text in kategorisini değiştirmiş oldum.

 

Şimdi insanların çok dikkatini çeken bir iş daha yapalım, bu bileşenimizin ToolBox da daha gösterilmesi için bileşenimize bir simge oluşturalım. Aslında çok kolay bir işlem ancak bunun için bir tane simge dosyasına ihtiyacımız var. Class Librarymizin proje dosyasına sağ tuş tıklayın ve Add – New Item a basın, açılacak olan seçeneklerden ise Icon File ı seçin ve adına NumericTB yazın, NumericTB.ico dosyanız oluşacak, Icon lar farklı farklı boyutlarda olabilirler ancak Visual Studio 16X16 lık simgeleri kullanıyor bu yüzden sizin 16X16 lık bir simge dosyası hazırlamanız gerekiyor. Siz bir simge dosyası oluşturduğunuzda Visual Studio iki tipte getirir 16X16 ve 32X32 şeklinde bize 16X16 lık gerektiği için simgenin 16X16 lık haline geçmemiz gerekiyor bunun için ise Image menüsünden Current Icon Image Type a basın ve yanda açılan menüden 16X16 lık bölümü seçin (farklı renk çözünürlüklerinide ekleyebilirsiniz bunun için yine Image menüsünden New Image Type a basın ve eklemek istediğiniz büyüklüğü ve renk paletini seçin.) simge dosyanızı istediğiniz bir biçimde oluşturun ve kaydedin.

 

 

Şimdi bu simge dosyasının bu bileşenin simge dosyası olduğunu anlatmamız gerekiyor, Simge dosyamız projenin dosyalarının içindedir, ancak projenin oluşturduğu DLL dosyası bu dosyalara göre iki klasör içeridedir, bu yüzden simge dosyasını çağırırken ../../ deyimini kullanmanız gerekiyor bu sizi iki klasör aşağı indirecektir. Class ın tanımlanmasını aşağıdaki şekilde düzenleyin.

 

[System.ComponentModel.DefaultEvent("EntereBasti"), DefaultProperty("Text"), System.Drawing.ToolboxBitmap(@"../../NumericTB.ico")]

public class NumericTB : TextBox

 

 

Böylece artık ToolBox da bileşeniniz sizin oluşturduğunuz şekilde görüntülenecek. Şimdi gelelim bu bileşenimizi istediğimiz bir projede naısl kullanacağımıza. Aslında yapmanız gereken iş çok basit bu solutiona yeni bir Windows Application ekleyin Visual Studio 2005 de bu işlem File Add bölümünden yapılıyor, Visual Studio .Net 2003 de ise bu işlem Solution Explorer daki Solutiona sağ tuş Add – New Project adımıyla yapılıyor. Ben bu Windows Application ın ismine NumericTBWindows dedim. Eğer Visual Studio 2005 kullanıyorsanız aynı Solution da olan Class Library eğer bir bileşen ise (yani temelinde Component class ı varsa) otomatik olarak ToolBox da gösteriyor, ancak Visual Studio .Net 2003 de bu işlemi sizin kendinizin yapması gerekiyor bunun için ToolBox a sağ tuş Add / Remove Item ı seçmeniz gerekiyor ve bu projenizin DLL dosyasını göstermeniz gerekiyor.

Visual Studio 2005 de ise bu işlem için ToolBox a sağ tuş Choose Items ile yapılıyor, projenizin DLL ini göstermeniz yine yeterli.

 

 

 

 

Şimdi normal bir bileşenmiş gibi istediğiniz projenizde istediğiniz gibi uygulayabilirsiniz bu kontrolü. Hatta bu bileşeninize iki kere kliklediğinizde varsayılan olarak EntereBasti olayına gidecek ve sizden bu olay için bir kod yazmanızı isteyecek, ben aşağıdaki kodu yazdım.

 

private void numericTB1_EntereBasti(object sender, KeyPressEventArgs e)

{

      MessageBox.Show("Entere Basmayin");

}

 

 

“Ben yazamam şimdi bu kadar kodu, keşke yazılmışı olsa...” diyenler için ise buradan kodun yazılmış halini indirebilirsiniz.

 

Bu makale ile ilgili herhangi bir sorunuzda aşağıdaki mail adresimi kullanabilirsiniz.

 

Levent Cenk Çağlar

cenkc@yazgelistir.com