Özel Web Kontrol Geliştirme (Custom Control) – I [Giriş]

Component kavramı, yazılımın en küçük yapı birimini temsil eder. Bu kavram, 80’lı yılların sonunda uygulama geliştirme sürecinde uygulamayı bileşenlere ayırma ve gerektiğinde bu bileşenleri daha sonra yeniden yazılmaksızın diğer uygulamalarda kullanma ihtiyacından doğmuştur. Bunun sonucunda bileşen tabanlı yazılım geliştirme mimarisi ortaya çıkmıştır. Bu mimariyi desteklemek amacıyla Microsoft tarafında ActiveX, COM, Java tarafında Applet gibi teknolojiler piyasaya sürülmüştür. Bu makalede bileşenlerin nasıl hazırlanacağı ve dağıtılacağını işleyeceğiz.
Yüzeysel bir tanım yapacak olursa, Component, herhangi bir user arabirimi olmayan, tasarım ortamını desteklemeyen ve başka nesnelerle etkileşimli olabilen bileşenlerdir. Control ise tasarım ortamıyla etkileşimli olan bileşenlerdir. .NET terminolojisinde Component, System.ComponentModel.IComponent arabiriminden türemiş olup desing-time nitelikleri olarak tanımlanan özel nitelikleri destekleyen yapılardır. Örneğin Timer bileşeni bir componenttir. Control ise Asp.Net TextBox gibi yine bir component türü olup user-interface yeteneğine sahip bileşenlerdir. Bu tanımlar sonucunda bütün kontroller, birer componenttir ama tersi doğru değildir diyebiliriz.
.NET Framework, client-side Windows Form Control (System.Windows.Forms.Control) ve ASP.NET Server Control (System.Web.UI.Control) olmak üzere iki tür kontrol kümesi sunar. .NET Framework’teki bütün kontroller dolaylı veya dolaysız bu iki kütüphaneden üretilmiştir.
ASP.NET Framework’ün en güçlü özelliklerinden biri de custom kontrol ve component geliştirmeye destek vermesidir. Sunduğu kütüphaneler aracılığıyla programcılar, kalabalık kodlar, detaylar arasında boğulmaktan kurtulmuştur. Kontrol geliştirmeyi kolaylaştırdığı gibi tasarım veya çalışma esnasında onları daha yetenekli kılmak ve toolboxa taşıyarak uygulamalarında bu kontrolleri kullanacak programcıların işlerini kolaylaştırmak için çeşitli ek bileşenler sunmaktadır. Bu bölümde ASP.NET Framework ortamında kendimize ait kontrolleri nasıl geliştireceğimizi veya varolan kontrolleri nasıl yönetebileceğimizi işleyeceğiz.
Özel bir web kontrolü geliştirmek için aşağıdaki sınıf türlerinden biri referans alınır;

  • System.Web.UI.Control class
  • System.Web.UI.WebControls.WebControl class
  • System.Web.UI.WebControls.CompositeControl class
  • System.Web.UI.HtmlControls.HtmlControl class
  • Var olan Asp.NET veya HTML server control

Asp.NET platformunda bütün kontroller, doğrudan veya dolaylı olarak System.Web.UI.Control sınıfını taban alır.

Bir custom server kontrol geliştirirken ya var olan bir kontrolden ya da Control, WebControl, CompositeControl veya HtmlControl sınıflarından inherit edilir.

  • Control sınıfı, tüm web kontrollerinin taban sınıfıdır. Kontrollerdeki standart üyeleri içerir. System.ComponentModel.IComponent arayüzünden inherit edilmiştir. Her iki kontrol türünün de, “sürükle bırak” özelliğini desteklemesi veya VS.NET içindeki properties penceresiyle etkileşimli çalışması Control sınıfından gelen bir özelliktir.
  • WebControl sınıfı ise web controllerinin stil, renk ve font ayarları gibi görsel niteliklerini içerir. Aspx sayfalarında kullandığımız ve “
  • CompositeControl sınıfı, .NET 2.0 ile birlikte gelmiş yeni bir sınıf olup, birden fazla kontrol(child control) içeren bileşik kontrol geliştirmek için kullanılır.
  • HtmlControl sınıfı, HTML server kontrolleri için ortak olan metod, property ve eventleri kapsar.
  • TemplateControl sınıfı, data-bound(GridView,DataList . . .), page control(Asp.NET sayfaları) ve templated kontrol gibi zengin kontrollerin taban sınıfıdır. Ayrınca Microsoft’un user control olarak isimlendirdiği ve bir çok .aspx sayfası tarafından ortak kullanılan kontroller de bu classtan türemiştir(.ascx dosyaları). Bu kontrolleri ASP’deki include dosyaları gibi düşünebiliriz.

Daha önceden var olan bir kontrolü taban alarak gerçekleştirilen kontrollere Inherited Control denilir. Doğrudan Control veya WebControl sınıflarından türemiş kontrollere Custom Rendered Control denilir. CompositeControl sınıfından türetilmiş kontrollere Composite Control denilir. TemplateControl sınıfından türemiş kontrollere de Templated Control denilir.
Eğer bir user interface(UI) veya başka görsel bir element geliştirilecekse bunun için WebControl veya bundan türetilmiş sınıfların kullanılması tavsiye edilir. Eğer HTML hidden veya meta tag gibi görsel olmayan(non-visual elements) basit bir element geliştirilecekse Control sınıfının taban alınması daha doğru olur.
Web tabanlı özel kontrol geliştirirken request-response sürecindeki yol haritasını, Asp.NET yaşam döngüsünü bilmek gerekir. Asp.NET’in sayfa yaşam döngüsünde her request işleminde page nesnesi ve içindeki kontroller yeniden oluşturulur ve işlem sonucunda yok edilir. Bilindiği gibi bu oluşma-yok olma sürecinde bazı evre ve olaylar gerçekleşir. Bu evre ve olaylar, kontrollerin de yaşam döngüsüyle ilintili olduğu için konunun detaylarına girmeden önce Asp.NET yaşam döngüsünü hatırlayacak kadar burada özetlememiz faydalı olacaktır. Aşağıdaki tabloda sayfa ve kontrol bazlı yaşanan evreler gösterilmiştir.

Aşama Açıklama
Page request Page life cycle başlamadan önce bu aşama çalışır. Sayfa bir kullanıcı tarafından istendiği zaman Asp.NET, bu sayfanın parse ve compile edilip edilmeyeceğine veya sayfayı çalıştırmadan varsa cachedeki versiyonunu gönderip göndermeyeceğine karar verir.
Start Yaşam döngüsünün ilk adımını temsil eden bu süreçte page nesnesinin Request ve Response gibi property’leri set edilir. Ayrıca page nesnesi, gönderilen requestin bir Postback sonucu mu yoksa yeni bir request olarak gelip gelmediğini belirler ve ona göre IsPostBack property’sini set eder. IsPostBack, sayfanın Postback modunu bildirir. Bu aşamada ek olarak sayfanın UICulture propertysi de set edilir.
Page initialization Sayfanın oluşturulma aşamasında sayfa üzerindeki kontroller, erişilebilir duruma gelir ve her kontrolün UniqueID propertysi set edilir. Eğer o anki request, bir Postback sonucu gerçekleşmişse bu aşamada Postback data henüz yüklenmemiş ve kontrollerin değeri Viewstate’e göre yenilenmemiştir.
Load Load aşamasında eğer geçerli request bir postback ise kontrollerin değeri ve durumu Viewstate içeriğine göre şekillenir.
Validation Varsa sayfa üzerindeki validator kontrollerin Validate() metodu çağrılır. Validate() metodu, page nesnesi ve içindeki kontrollerin her birinin IsValid property’sini set eder. Hatırlanacağı gibi IsValid property’si, kontrolün doğrulama işleminin başarılı olup olmadığını bildirir.
Postback event handling Eğer request bir Postback sonucu gerçekleşmişse, Postback’i gerçekleştirmiş veya durumu değişmiş kontrollerin ilgili eventleri tetiklenir.
Rendering Render işleminden önce page ve kontroller için Viewstate nesnesi kaydedilir. Render aşamasında page nesnesi, her kontrolün Render() metodunu çalıştırır. Render() metodu, text writer nesnesini kullanarak kontrolün outputunu page’in Response propertysine ait OutputStream‘e (HTTP ile gidecek olan binary içerik) yazar.
Unload Unload evresi, sayfa tümüyle render edildikten ve istemciye gönderildikten sonra çağrılır. Bu durumda sayfa, artık hafızan kaldırılmaya (discard) hazırdır. Unload aşamasında, Request ve Response nesneleri temizlenmiş olur.

Döngünün bu evrelerinde zamanı geldikçe ilgili event ve metodlar otomatik olarak tetiklenir. Bunları da şu şekilde özetleyebiliriz;
1.Page_PreInit
IsPostBack property’si okunup sayfanın ilk defa process edilip edilmediği öğrenilebilir. Dinamik kontrollerin oluşturulması, master page‘in programatik olarak uygulanması, theme propertysinin dinamik olarak set edilmesi bu metod içinde yapılır. Ayrıca bu metod içinde profile property’si okunabilir veya set edilebilir.
2.Page.Init + Control.Init
Döngünün ilk aşaması olan Initialization evresinde sayfaya ait control tree, tanımlı kontrollerle şekillenir ve önce page nesnesine ait Init eventi daha sonra her kontrolün ayrı Init eventi tetiklenir. Viewstate bilgisi henüz yüklenmemiştir.
3.Page.LoadViewState
Initialization aşamasından sonra ASP.NET, sayfanın Viewstate’ini yükler. Viewstate, sayfanın sunucuda en son process edilmiş durumunu içerir.
4.Page.ProcessPostData
Request ile birlikte gelmiş Postback data okunur ve ilgili kontrollere yüklenir
5.Page.Load + Control.Load
Sayfa üzerindeki kontroller, tümüyle yüklendikten sonra Load eventleri tetiklenir. Bu metoda, genellikle sayfa ilk defa çağrıldığı(Postback edilmediği) zaman yapılacak data binding işlemleri yazılır.
6.”Change” Events
Kontrollerin yeni değerleri(Postback) ile orijinal değerleri(Viewstate) karşılaştırılır ve durumu değişmiş kontrollerin ilgili eventleri tetiklenir.(TextChanged, SelectedIndexChanged .)
7.Validate
Sayfa üzerindeki validatorlerin server side eventleri tetiklenir. Böylece doğrulama işlemi sadece istemci tarafına bırakılmamış olur.
8.”Postback” Events
Postback işlemine neden olmuş kontrollerin eventleri çalışır. Örneğin bir buton tıklandığı zaman yapılacak işlemleri bu aşamada Button.Click, Button.Command gibi metodlarda bildiririz.
9.Page.PreRender + Control.PreRender
Sayfa render edilmeden ve Viewstate kayıt edilmeden önce yapılacak işlemler bu metodlarda yazılabilir. Özellikle kontroller üzerinde yapılacak son değişiklikler bu aşamada yapılır.
10.Page.SaveViewState
Kontrollerin yeni değerleri ve sayfanın durumu sunucuya yapılacak bir sonraki dönüşte hatırlansın diye Viewstate nesnesine kayıt edilir.
11.Page.Render
12.Page_Unload
Temizlik işlemlerinin yapıldığı bu evrede sayfa istemciye gönderilmiştir. Bu metodu açık kalmış dosya ve database bağlantıları kapatmak veya request-response ile ilgili loglama yapmak gibi işlemler için kullanılabilir.

Özel Web Kontrol Geliştirme (Custom Control) – I [Giriş]” üzerine 6 düşünce

  1. çağrı akkaya

    meraba hocam.web control custom seçeneği vs studio 2008 de bulamadım.Bana yardımcı olabilirimisin

    Cevapla
  2. Ahmet Kaymaz Yazar

    Merhaba Çağrı,”web control custom seçeneği” derken neyi kastettiğini anlamadım. Custom control oluşturmak için verdiğim sınıfları kullanman gerekiyor. Bunlar da VS.NET 2008 daha doğrusu .NET Framework 3.5 içerisinde bulunmaktadır.

    Cevapla
  3. Murat Merdoğab

    Hocam size hiçbir fikirde olmadığım bir soru sormak istiyorum.Kendi oluşturduğum kontrollere nasıl bir ayar penceresi yapabiliriz.Örneğin Windows formda Datagridde yanındakı küçük ok tusuna basınca tasarım anında elimizle kolonları ekleyebiliyoruz.Bu gibi pencereleri bizim kendi kontrollerimizde yapmamız mümkün mü?Teşekkürler
    Kolay Gelsin

    Cevapla
  4. Murat Merdoğab

    Hocam Çok teşekkür ediyorum.Böyle ince noktalarda cevap verebilmeniz çok iyi bence.
    Saygılarımı Sunuyorum
    Kolay Gelsin

    Cevapla
  5. Bayeam UNAL

    Merhaba ustadim,
    Using system.ComponentModel kutuphanesi ne ise yaramaktadir kullansak ne olur kullanmasak ne olur bilgi verir misiniz?
    iyi gunler iy calismalar.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.