C#nedir?com
 
YAZAR HAKKINDA
Oğuz Yağmur
Oğuz Yağmur
http://www.oguzyagmur.com
İletişme geçmek için tıklayın.
26 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: girisini hazirladigimiz hazirlamis istedigimiz karekteri kontrol kullanarak kullanicidan masktextbox properties public seklinde string tasarim zamaninda C# / VC#/.NET Oğuz Yağmur
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 17.2.2007
Okunma Sayısı : 20921
Yorum Sayısı : 1     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 11.4.2021
Turhal Temizer
Mac OS/X Removing CUDA 11.4.2021
Burak Selim Şenyurt
Tie Fighter Değil, Project Tye! 11.4.2021
Burak Selim Şenyurt
Stackoverflow Sevgi Anketinde Yıllardır Bir Numara Çıkan Programlama Dili Rust Kimdir? 11.4.2021
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Bileşen Tasarımı ve Kullanıcı Kontrolü Geliştirme - 2
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bir önceki makalemizde özelleştirilmiş kontrolleri hazırlayabilemek için temel olarak bilmemiz gereken konuları incelemiş örnek bir kontrol geliştirerek, bu kontrolü projelerimizde nasıl kulanabileceğimize ilişkin bir uygulama geliştirmiştik.(okumak için tıklayınız) Bu yazımızda ise hazırladığımız kontrollere tasarım zamanında (design time) extra özellikler kazandırarak kontrollerimizi daha fonksiyonel hale nasıl getirebileceğimizi inceleyeceğiz.

Konularımız için örnek uygulama olarak MaskTestbox kontrolü geliştirmeye çalışacağız. Bu kontrol ile kullanıcıdan sadece bizim belirlediğimizi formata uygun giriş yapmasını sağlayacağız. Örneğin, bir uygulamada kullanıcıdan telefon numarsını girmesini istediğimizde (XXX) XXX XX XX şeklinde bir format ile girilmesini sağlamak için hazırlayacağımız kontrolü kullanabiliriz. Kontrolümüzde string türünden Mask adlı bir özellik ile maskeleme formatını belirleyeceğiz. Maske özelliğinin değerine ’#’ karekteri girildiğinde, kontrolümüz sadece sayı girişine izin verecek ’?’ karekteri girildiğinde ise sadece harf değeri girilmesine izin verecektir. Örneğin cep telefonu girişini maskelemek istersek kontrolümüzün Mask özelliğinin değerini (###) ### ## ## şelkinde veya IP girişini masleşemek istersek ###.###.###.### şeklinde verebiliriz. 



Aşağıdaki kod ile geçen yazımızda incelediğimiz yöntemleri kullanarak kontrolümüzü hazırlayabilirsiniz. (File->New->Project->Class Library)

//Dosya adı : MaskTextbox.cs
using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace CSharpNedirCom.Bilesenler
{
    [Description("C#Nedir? MaskTextbox Kontrol Bileşeni")] 
    public class MaskTextbox : System.Windows.Forms.TextBox //Konrolümüzü TextBox tan türetiyoruz
    {
        private string maske; 
        //Makse özelliğinin Toolbox penceresindeki ayarlarını yapıyoruz
        [Description("Kontrolünüz için maske belirler. Örneğin; (###)### ## ## "), 
        Category("Maske"), DefaultValue(null)]
        public string Maske
        {
            get {return maske;}
            set { maske = value; this.Text = ""; }
        }
        public MaskTextbox() { }
        private void InitializeComponent() { }
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (Char.IsControl(e.KeyChar)) //Basılan tuş kontrol tuşu ise (BackSpace için) kabul ediyoruz
                return;
            if (Maske != null) //Maske özelliğine bir değer girilmişse maskele işlemine başlıyoruz
            {
                e.Handled = true; //Basılan tuşun OnKeyPress olayı tarafından işlenmesini engelliyoruz
                string yazi = this.Text;
                bool bittimi = false; 
                for (int i = this.Text.Length; i < maske.Length ; ++i)
                {
                    switch(maske[i].ToString())
                    {
                        case "#": //Maskemiz sayı olarak belirtilmiş ise sayı ise
                        {
                            if (Char.IsDigit(e.KeyChar)) //Basılan karekter sayı ise
                            {
                                yazi += e.KeyChar.ToString();
                                bittimi = true; break;
                            } 
                            else 
                            { 
                                return;
                            }
                        }
                        case "?":
                        {
                             if (Char.IsLetter(e.KeyChar))
                             {
                                  yazi += e.KeyChar.ToString();
                                  bittimi = true;
                                  break;
                             }
                             else
                             {
                                 return; 
                             } 
                        }
                        default: yazi += maske[i]; break; //Hiçbiri değilse maskedeki karekteri alıyoruz
                    }
                    if (bittimi)
                        break;
               }
               this.Text = yazi;
               this.SelectionStart = this.Text.Length; //İmleci kontrolümüzdeki yazının sonuna alıyoruz
            } 
        }
    }
}


Kontrollere Ikon Ekleme
Hazırladığımız kontrolleri ToolBox penceresine yerleştirdiğimizde kontrolümüz varsayılan bir ikon ile sembolize edilir. Ama bir çoğumuz hazırladığımız kontrolümüzün kendi zevkimize göre sembolize edilmesini isteriz. Bu işlemi gerçekleştirebilmek için 16x16 boyutlarında ve 16 renkli bir ikona ihtiyacımız var(dosya uzantısı .bmp yada .ico olmalıdır). Bu ikonu hazırladıktan sonra projemize dahil edelim. Ikon dosyamıza sağ tıklayıp Properties menüsünü seçelim. Burdan "Build Action" özelliğini "Embedded Resource" olarak değiştirelim ve kodumuzda aşağıdaki değişikliği yapalım.

[Description("C#Nedir? MaskTextbox Kontrol Bileşeni")]
[ToolboxBitmap(typeof(MaskTextbox),"maskIcon.bmp")]
public class MaskTextbox : System.Windows.Forms.TextBox {
//......
//......

İkinci satırda ToolboxBitmap niteleyicisini kullanarak, derleyiciye kontrolümüz ile "maskIcon.bmp" dosyasını ilişkilendirmesini söylüyoruz. Artık kontrolümüzü Toolbox penceresine eklediğimizde hazırladığımız ikon ile sembolize edilmiş olduğunu göreceksiniz.

Tasarım Zamanı Özellikleri
Bir kontrol oluştururken, genellikle bir Windows kontrolünü taban sınıf olarak kullanırız. Bazen taban sınıf olarak kullandığımız kontrolün bazı özellikleri işimize yaramaz yada bazı özelliklerini kullanıcıdan gizlemek isteyebiliriz. Örneğin, hazırlamış olduğumuz MaskTextbox kontrolümüzün, taban sınıftan aldığı (TextBox) "CharacterCasing" özelliğinin tasarım zamanında değiştirilmesini istemiyor olalım. Bu durumda yapmamız gereken bu özelliği Properties penceresinde kaldırmak olacaktır. Hatta bi adım daha ileri  gidip kullanıcıdan "Text" özelliğini de gizleyerek tasarım zamanında MaskTextbox kontrolümüze karekter girişini önlemek isteyelim. Bu işlemleri gerçekleştirmek için VS.NET’in Froms Designer özelliğinden yararlanacağız. .NET tasarım zamanında kontroller üzerinde uyarlamalar ve özellik ekleme gibi işlemler için bizlere "ControlDesigner" sınıfını sunar. Bu sınıfı kullanarak kontrolümüz üzerindeki değişiklikleri adım adım uygulayalım.

Tasarım zamanında istediğimiz özelliklerin kaldırılması için System.Windows.Forms.Design.ControlDesigner sınıfında yararlanacağız. Bu sınıf zaten taban sınıf olarak System.ComponentModel.Design.ControlDesigner sınıfını kullanır. Bu sınıfları kullanabilmemiz için projemize System.Design refaransını eklemeliyiz. İlk işlem olarak kontrolümüzün "CharacterCasing" ve "Text" özelliklerini gizleyelim. Bu işlem için projemize sağ tıklayıp "Add"->"Add Class" menüsünü seçelim. Dosya ismini "MaskTextboxDesigner.cs" olarak değiştirelim. Bu işemlerdeki amacımız kontrolümüz için Designer sınıfı oluşturarak kontrolümüz üzerinde tasarım zamanında istediğimiz değişiklikleri yapmak. Oluşturacağımız sınıfı System.Windows.Forms.Design.ControlDesigner sınıfında türetiyoruz.  MaskTextboxDesigner sınıfımızan kaynak kodu aşağıdaki gibidir.

using System;

namespace CSharpNedirCom.Bilesenler
{
    public class MaskTextboxDesigner : System.Windows.Forms.Design.ControlDesigner
    {
        protected override void PostFilterProperties(System.Collections.IDictionary properties) 
        {
            properties.Remove("CharacterCasing");
            properties.Remove("Text");
        }
        public MaskTextboxDesigner() { }
    }
}

Gördüğümüz gibi IDesignerFilter arayüzünün PostFilterProperties metodunu kullanarak kontrolümüzün "CharacterCasing" ve "Text" özelliklerini Properties penceresinden silecek sınıfımızı oluşturduk.IDesignerFilter arayüzünün diğer metodlarını kullanarak sadece kontrole ait özelliği silme dışında birçok işlemi daha gerçekleştirebiliriz. :

Metod Açıklama
PostFilterAttributes  Niteliklerin silinmesini yada değiştirilmesini sağlar
PostFilterEvents

Olayların silinmesini ya dadeğiştirilmesini sağlar
PostFilterProperties Özelliklerin silinmesini ya da değiştirilmesini sağlar
PreFilterAtrributes Niteliklerin eklenmesini sağlar
PrefilterEvents Olayların eklenmesini sağlar
PreFilterProperties Özelliklerin eklenmesini sağlar

Bu metodları kullanarak kontrolümüze tasarım zamanında birçok özellik ekleyip, düzenleyebilir ve silebiliriz. Hazırlamış olduğumuz MaskTextboxDesigner sınıfımızı kontrolümüz üzerinde geçerli kılmak için yine kontrol sınıfımıza bir nitelik ekleyeceğiz. Bunun için kaynak kodumuzda şu değişikliği yapalım :

[Description("C#Nedir? MaskTextbox Kontrol Bileşeni")]
[ToolboxBitmap(typeof(MaskTextbox),"maskIcon.bmp")]
[Designer(typeof(MaskTextboxDesigner))] //Tasarım özelliklerin etkin olabilmesi için kullanadık
public class MaskTextbox : System.Windows.Forms.TextBox
{
//.....
//......

Designer niteleyicisi hazırlamış olduğumuz MaskTextboxDesigner sınıfını kullanarak derleyiciye belirlediğimiz özelliklerin gizlenmesini söyler. Bu sayede kontrolümüz istediğimiz biçimde hazırlanmış olur.Şimdi kontrolümüzü bir form üzerine taşıdığımızda Properties penceresine bakarsak "CharacterCasing" ve "Text özelliklerinin kullanıcıdan tasarım zamanında gizlenmiş olduğunu göreceksiniz.



Designer Verbs
Tasarım zamanında iken herhangi bir kontrole sağ tıkladığımızda bir menünün açıldığını görürüz. Bazı kontrollerde ise bu daha farklıdır. Kontrole ek özellik kazandırmak ve kontrolü daha kullanışlı kılmak için bazı ek menüler eklenmiştir. Örneğin "DataGrid" kontrolünde "Auto Format", "mainManu" kontrolüne "Edit Menu" gibi ek menu elemanları eklenmiştir. Böylece kontrolümüze tasarım zamanında istediğimiz metotları kullanarak işlemler yaptırabiliriz.Bizde kendi kontrollerimize nasıl ek menu elemanları ekleyebileceğimizi inceleyeceğiz.

Bu işlemleri yapmak için yine MaskTextboxDesigner sınıfımıza gerekli eklemeleri yapacağız. Ekleyeceğimiz menu elemanları kolleksiyon şeklinde tutulur ve bu sınıf System.ComponentModel.Design.DesignerVerbCollection sınıfıdır. Herbir menü elemanını temsil edecek  sınıf ise MenuCommand sınıfında türetilmiş System.ComponentModel.Design.DesignerVerb sınıfıdır. Menüye eleman eklemek için ilk yapacağımız işlem ControlDesigner sınıfının Verbs özelliğini devre dışı bırakarak (override) kendimiz yazmalıyız. Bu özellik içinde bir kolleksiyon oluşturup bu kollaeksiyona DesignerVerb türünden nesneler eklemeliyiz. DesignerVerb nesnesi oluştururken ilk parametre menüde görünecek isim ve ikinci parametre de bu menü elemanı seçildiğinde çağrılmasını istediğimiz metod olmalıdır. Şimdi MaskTextboxDesigner sınıfımız aşağıdaki şekilde düzenleyelim :

//..........
DesignerVerbCollection verbs;
public override DesignerVerbCollection Verbs
{
    get
    {
        if (verbs == null)
        {
            verbs = new DesignerVerbCollection();
            verbs.Add(new DesignerVerb("IP Maskesi", new EventHandler(ip))); //Menüdeki elemanın ismini ve metodunu belirliyoruz
            verbs.Add(new DesignerVerb("Telefon Maskesi", new EventHandler(telefon)));
        } 
        return verbs; 
    }
}
private void ip(object sender, EventArgs arg)
{
    ((MaskTextbox)(this.Control)).Maske = "###.###.###.###"; 
    verbs[0].Checked = !(verbs[1].Checked = false); //verbs nesnesinin Checked özelliğini ile menüde elemanı seçili duruma getiriyoruz
}
private void telefon(object sender, EventArgs arg)
{
    ((MaskTextbox)(this.Control)).Maske = "(####)### ## ##";
    verbs[1].Checked = !(verbs[0].Checked = false);
}


Bir kontrol geliştirirken beklenen işlemleri yapmasının yanında, kulanıcının kontrolümüzü kullanım kolaylağını da dikkate almalıyız. Böylece hazırlamış olduğumuz kontrol daha da işlevsellik kazanacak  ve kullanım kolaylığından dolayı daha da sevilecektir.

Yazıda geçen kontrolün kaynak kodunu ve demo uygulamasını buradan indirebilirsiniz.


Makale:
Bileşen Tasarımı ve Kullanıcı Kontrolü Geliştirme - 2 C#, Visual C# ve .NET Oğuz Yağmur
  • Yazılan Yorumlar
  • Yorum Yaz
TEM
12
2004
Bu açıklayıcı ve güzel makale için teşekür ederim.Eline sağlık çok güzel olmuş.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor