Şu sıralar özelleştirilmiş kontroller yaratmakla uğraşıyorum. Bu konu dahilinde bir kaç şey paylaşma gereği duydum. ASP.NET ile özelleştirilmiş kontroller geliştirmek için .NET Framework’ü bize bir çok sınıf ve metod sunuyor. Bundan bahsetmeye gerek yok sanırım. Peki bu sınıfları ve metodları en doğru şekilde nasıl kullanabiliriz?
Özelleştirilmiş bir web kontrolü yaparken, WebControl ve Control sınıflarından türetiyoruz kendi kontrolümüzü. Çünkü default olarak gelen yapılar bunlar. Ancak bazı işlerimizi kolaylaştırmak adına başka sınıflardan da yararlanabiliriz.Bu kısma daha sonra tekrardan değineceğim.
Özelleştirmiş olduğumuz kendi web kontrolümüzü yarattıktan sonra, bu web kontrolümüze,içinde kullanacağımız diğer kontrollerimizi ekleriz; yani genellikle bu şekilde bir yaklaşım olur. Control ağacına, Controls.Add(Control c) şeklinde ekleyeceğimiz kontroller ile kendi özelleştirilmiş kontrolümüze bu diğer kontrolleri eklemiş oluruz. Bu işlemi CreateChildControls() methodunu override ederek yapmak en doğru yaklaşım olacaktır. ASP.NET sayfası çalıştığı zaman belli metodlar belli bir sıra ile çalışır. CreateChildControls()’da bu sırada yer almaktadır ve çalışması gerektiği zaman çalışır. Bu zamanı .NET Framework’ü bildiği için bu görevi tamamen onun üzerine yıkmak, controllerin durumları ve ViewState için en doğru yaklaşım olacaktır.

protected override void CreateChildControls(){
                     Controls.Clear(); //Öncesinde control ağacımızı temizlemekte fayda var.
                     ……… //Diğer kontrolleri yaratabiliriz…
}

Bu methodu .NET Framework, ASP.NET Page Lifecycle kapsamında çağırması gerektiği yerlerde çağırarak kontrollerin yaratılmasını sağlar.Dikkat edilmesi gereken nokta ASP.NET Page Lifecycle kapsamında bu işlemin gerçekleşecek olması. Yani .NET, bizim için nerede bu kontrollerin yaratılması gerektiğini hallediyor. Ancak bazı durumlarda bizim bundan emin olmamız gerekmekte. Dinamik olarak yaratacağımız ve PageLifecycle’dan bağımsız yaratacağımız kontroller yada ulaşacağımız kontrol değerleri için sayfadaki diğer kontrollerin yaratılmasını biz tetikleyebiliriz. Geliştirdiğimiz custom control’de aşağıdaki gibi bir özelliğimiz olsun diyelim.

public string Value{
           get{  return _txtValue.Text; }
}

Web kontrolümüzün bu özelliğine eğer _txtValue TextBox’ını yaratmadan ulaşmaya çalışacak olursak, runtime’da hata bizi bekliyor olacaktır. Bunun için EnsureChildControls() metodunu çağırmak faydalı olacaktır.Aşağıdaki gibi;

public string Value{
 get {
             EnsureChildControls();
             return _txtValue.Text;
       }
}

Bu sayede Value özelliği çağırdığımızda öncelikle Control Tree’de olması gereken kontroller yaratılır._txtValue nesnesi yoksa sayfada yaratılır ve Text değerine ulaşabiliriz.

Bir diğer önemli noktada INamingContainer arayüzü. Geliştirmiş olduğumuz web kontrolünün bu interface’i içeriyor olması gerekmektedir. Bu arayüz hiç bir metodu implement etmez. Bu arayüz kontrolünüz ve altındaki kontrollerin unique bir control id’sine sahip olmasını sağlar. Geliştirmiş olduğunuz web kontrolü bir sayfada birden fazla kez kullanabilinecekse bu durum çok önemlidir. Bu sayede PostBack datasındaki karmaşıklıklarda giderilmiş olacaktır.

Kendi kontrolümüzü yaratırken mutlaka dikkat etmemiz gerekenlerden en önemlileri bunlar. İlerleyen günlerde biraz daha derinlere dalıyor olacağım sanırım.