İlginizi Çekebilir
  1. Ana Sayfa
  2. C Sharp

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
+ - 6

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. :D

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. :D 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. :D 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. ?

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)

Yorumlar (6)

Popüler Yorumlar
  1. Class’a using System.Windows.Forms; namespace i eklememiş olabilirsiniz.
    https://github.com/MustafaBKLZ/NumberOnly_TextBox_Override
    bu linkten proje dosyasına ulaşabilirsiniz.

  2. class TextBoxNumbersOnly : TextBox

    ikinokta koyup “TextBox” ibaresini kabul etmiyor.
    Daha sonrasındaysa alt satırlardaki
    Browsable
    Category
    Description
    DisplayName
    satırlarını da kabul etmediği için rebuild kısmında hata veriyor.

    Çözümü ne olabilir?

  3. Rica ederim. Faydalı olmasına sevindim. :)

  4. ilginiz için çok teşekürler Hocam..

  5. Merhaba, Güzel yorumunuz için teşekkürler.
    Sadece yazmış olmak için yazmak bana göre değil açıkçası. Deneyip çalıştırmadığım bir konu hakkında yazıyı yazmıyorum.
    Ancak talebiniz üzerinde listeme bu tarz konuları da ekledim. Biraz araştırıp yeni dersler yazmaya çalışacağım.

  6. vallah hocam Cok Tesekur ederım cok guzel olmus emeginize saglık…
    Keşke bu konularda Daha fazla Birseyler paylaşsanız çok sevinirim..

Yapılan Yorumlar
  1. class TextBoxNumbersOnly : TextBox

    ikinokta koyup “TextBox” ibaresini kabul etmiyor.
    Daha sonrasındaysa alt satırlardaki
    Browsable
    Category
    Description
    DisplayName
    satırlarını da kabul etmediği için rebuild kısmında hata veriyor.

    Çözümü ne olabilir?

  2. vallah hocam Cok Tesekur ederım cok guzel olmus emeginize saglık…
    Keşke bu konularda Daha fazla Birseyler paylaşsanız çok sevinirim..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.