|
Bileşen Tasarımı ve Kullanıcı Kontrolü Geliştirme - 2 |
|
Gönderiliyor lütfen bekleyin... |
|
|
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
|
|
|
-
-
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
|
|