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

C#, VB.NET, ASP.NET Add comments

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 “<asp:…” önekle baÅŸlayan temel kontroller bu sınıftan türemiÅŸlerdir.
  • 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.

5 Responses to “Özel Web Kontrol GeliÅŸtirme (Custom Control) – I [GiriÅŸ]”

  1. çağrı akkaya Says:

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

  2. Ahmet Kaymaz Says:

    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.

  3. Murat MerdoÄŸab Says:

    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

  4. Ahmet Kaymaz Says:

    Murat,

    Custom Control geliştirirken Smart Tag eklemen gerekiyor. Konuyla ilgili olarak aşağıdaki linkler yardımcı olabilir.

    http://msdn.microsoft.com/en-us/library/ms171829.aspx

    http://amrelsehemy.net/post/2008/02/Custom-Controls-Design-Time-Support-Part-12-Adding-SmartTag.aspx

  5. Murat MerdoÄŸab Says:

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

Leave a Reply


× 2 = 18

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS GiriÅŸ