1. Ana Sayfa
  2. C Sharp
  3. C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak

C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak

Merhaba, bu C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak yazımda, bir ara çok aradığım ama bulamadığım bir konu hakkında bir ders yazmak istiyorum. Artık sizler de kendinize özel TextBox yapabilecek ve böylece her lazım olduğunda sadece sayı girişi için kodlar yazmak zorunda kalmayacaksınız.

C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak kapak

Merhaba, bu C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak yazımda, bir ara çok aradığım ama bulamadığım bir konu hakkında bir ders yazmak istiyorum. Zamanında aradığım konu kendi özel nesnelerimi hazırlayabilmekti. Bu dersin asıl konusu özel bir nesne üretmektir. Bu dersin sonunda sizde sadece sayı ve istediğimiz bir ayracın izin verildiği özel bir TextBox yapacağız. Bu özel TextBox, toolbox’ta görünecek ve sürükleyip forma bırakabileceksiniz.

C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak

Giriş kısmında dediğim gibi daha önce kendi özel nesnelerimi üretebilmeyi istemiştim ama konu hakkında çok bilgim olmadığından aradığımı bulamamıştım. Belki de bulmuşumdur ama o olduğunu bile anlamamışımdır. Ama sorun değil artık nasıl yapılacağını biliyorum. 😀

Burada yapacağımız nesne TextBox sınıfından miras alan sadece sayı girişi ve belirlediğimiz bir ayracın sadece bir kere yazılmasına yani sadece 1 nokta veya sadece 1 virgül yazılabilmesine izin verilen özelleştirilmiş textbox yapacağız.

Şimdi Solution Explorer’e gelelim ve sağ tık yapıp Add > Class… diyerek projemize bir class ekleyelim. Ben bu Class dosyasına TextBoxNumbersOnly diyeceğim. Burada Class’a vereceğiniz isim nesnenin toolbox’ta görünen adı olacaktır. Bu Class, TextBox sınıfından miras alacaktır. Sonuçta sıfırdan bir nesne yapmayacağız. Sadece bir özelleştirilmiş textbox yapacağız.

class TextBoxNumbersOnly: TextBox
    {
    
    }

Burada yapacağımız özelleştirilmiş texbox, orjinal textbox ‘tan miras alanıcağı için, mevcut tüm özelliklerini destekleyecektir. Biz burada textbox’a yani bir Propery (Özellik) ekleyeceğiz. O özellik True ise sadece sayı girişlerine izin verilecek. False ise normal textbox olacak.

NumbersOnly özelliğini ekleyelim.

class TextBoxNumbersOnly : TextBox
    {
        bool numbersOnly;
 
        [Browsable(true)]
        [Category("Özel Davranış")]
        [Description("NumbersOnly özelliği True olarak ayarlanırsa TextBox içinde sadece sayılara izin verir. Multiline özelliği etkin değildir. ")]
        [DisplayName("NumbersOnly")]     
        public bool NumbersOnly
        {
            get { return this.numbersOnly; }
            set { this.numbersOnly = value; }
        }
    }

Şimdi Solution Explorer üzerinde sağ tık yapalım ve ReBuild diyelim. ReBuild tamamlandıktan sonra yeni nesnemiz artık toolbox’ta görünecektir.

C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak

Class dosyamıza constructor (yapıcı) metodumuzu oluşturduğumuzda, Property (özellikler) kısmında yeni NumbersOnly özelliğimizi görebileceğiz.

public TextBoxNumbersOnly()
        {
            NumbersOnly = true;
        }

Özelleştirilmiş TextBox Yapmak

Özelliği ekledik ama henüz kendisinden istenileni yapamıyor. O yüzden sadece rakam ve sadece bir noktalama işareti girilebilmesine izin verilen kodları yazalım. Burada sadece sayı girişi yapılabilecek nesnemiz için KeyPress eventi hazırlıyoruz.

        protected virtual void TextBoxNumersOnly_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ayrac = ',';// buraya istediğiniz bir ayracı yazabilirsiniz.
            if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != ayrac)) 
            {
                e.Handled = true;
            }
            if ((e.KeyChar == ayrac) && ((sender as TextBox).Text.IndexOf(ayrac) > -1))//İlk karakterin '.' olup olmadığını kontrol ediyoruzuz
            {
                e.Handled = true;//Değilse görmezden geliyoruz.
            }
        }

Şimdi bu hazırladığımız eventi, NumbersOnly özelliğine bağlayacağız. NumbersOnly özelliği True olduğunda aktif olacak.

public bool NumbersOnly
        {
            get { return this.numbersOnly; }
            set
            {
                this.numbersOnly = value;
                if (value)
                {
                    this.KeyPress += new KeyPressEventHandler(TextBoxNumersOnly_KeyPress);
                }
                else
                {
                    this.KeyPress -= new KeyPressEventHandler(TextBoxNumersOnly_KeyPress);
                }
            }
        }

Burada, NumbeNumbersOnly rsOnly özelliği True ise, sadece sayı girişi yapılabilecek textbox’umuza hazırladığımız eventin ataması yapıyoruz. Eğer False ise hazırladığımız eventi ayırıyoruz.

Şimdi düşünürsek, sadece sayı girişi yapılmasını istediğimiz textbox’un MultiLine olabilmesi mantıksız olurdu değil mi? O halde MultiLine özelliğini devre dışı bırakalım.

public override bool Multiline
        {
            get { return base.Multiline; }
            set
            {
                if (!this.numbersOnly) base.Multiline = value;
            }
        }

Bu metodu ekledikten sonra,  yukarıda NumbersOnly özelliği için event ataması yaptığımız satırın hemen altına, aşağıdaki kodu ekliyoruz.

base.Multiline = false;

Burada önemli bir nokta karşımıza çıkıyor. NumbersOnly özelliği False durumunda iken yazılan yazılar, NumbersOnly özelliği True durumuna getirildiğinde, yazılar orada kalacaktır. O halde bu olası hatanın önüne geçebilmek için NumbersOnly özelliğ True yapıldığında Text özelliğini temizleyelim.

public override string Text
        {
            get { return base.Text; }
            set
            {
                if (!this.numbersOnly) base.Text = value;
                else
                {
                    Decimal temp = 0;
                    if (!Decimal.TryParse(value, out temp)) base.Text = "";
                    else base.Text = value;
                }
            }
        }

Eğer özelleştirilmiş textbox içerisinde sayı ve belirlediğimiz özel karakter dışında herhangi başka ifade varken NumbersOnly özelliği aktif edilirse, onlar silinip yerin 0 yazılacaktır.

Yeni bir event daha üretiyoruz. Bu eventimizde özel bir eventtir.

public event EventHandler<NumberKeyPressEventArgs> NumberPressed;
        protected virtual void OnNumberPressed(NumberKeyPressEventArgs e)
        {
            EventHandler<NumberKeyPressEventArgs> handler = NumberPressed;
            if (handler != null)
            {
                handler(this, e);
            }
        }

Buradaki NumberKeyPressEventArgs normalde C# ‘ta varsayılan olarak olmayan bir eventtir. Burada KeyEventArgs sınıfından miras alarak kendi NumberKeyPressEventArgs eventimizi oluşturuyoruz. Aşağıdaki gibi…

public class NumberKeyPressEventArgs: KeyEventArgs 
    { 
        private Keys myKeys; 
        public Keys MyKeys 
        { 
            get {return myKeys; } 
        } 
        public NumberKeyPressEventArgs (Anahtarlar keyData): base (keyData) 
        { 
            this.myKeys = keyData; 
        } 
    }

Bunu hazırladıktan sonra sadece sayı girişi textbox’umuzun eventler kısmına geldiğimizde NumberPressed adında yeni bir event göreceğiz.

C# Sadece Sayı Girişi

Bu projeyi olduğu gibi Github’a yükleyeceğim. Bir form üzerinde iki tane özelleştirilmiş textbox nesnemizden ekledim ve NumbersOnly ve MultiLine özelliklerinin değişimini test edebilirsiniz. 😀 Artık elinizde c# textbox’a sadece sayı ve virgül / nokta girişi yapılabilecek özel bir nesneniz var. Böylece sizler de kendinize özel TextBox yapabilecek ve böylece her lazım olduğunda sadece sayı girişi için kodlar yazmak zorunda kalmayacaksınız.


C# Sadece Sayı Girişi İçin Özelleştirilmiş TextBox Yapmak yazımızda bu kadardı arkadaşlar. Diğer yazılarımda görüşmek üzere…

Ayrıca söylemeliyim ki, bu konu da bana gelen sorulardan birinden yola çıkarak bulduğum bir konu oldu. 😀 Sizin sorularınız sayesinde bende yeni şeyler öğrenmeye devam ediyorum.

C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz… Bu projede Github’da yerini almıştır. Bağlantıya tıklayarak projeye erişebilir ve indirebilirsiniz.

Sağlıcakla ve takipte kalın. 😉

Yorum Yap

Yazar Hakkında

Liseden, Ağ Sistemleri ve Yönetimi bölümünden mezun oldum. Üniversiteden (2 yıllık), Bilgisayar Programcılığı bölümünden mezun oldum. Şuanda da AÖF, Yönetim Bilişim Sistemleri bölümünde okumaktayım. Uzmanlık alanlarım; Windows Sistemleri, HTML, CSS, C# ve SQL’dir. Hobi olarak uğraştığım genel konular, Photoshop, After Affects, Corel Draw’dır.Film, YABANCI dizi, Anime izlemeyi ve Manga okumayı severim. Arkadaşlarımla yürüyüş yapmayı ve grup olarak aktivitelere gitmeyi severim. Geri kalan zamanlarımın tümü bilgisayar karşısında geçer.

Yorum Yap