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