Web Kontrol Geliştirme – III [Rendered Control]

Özel şekillendirilmiş kontrol olarak tanımlayacağımız bu kontroller, Control veya WebControl sınıflarından doğrudan türetilmiş olup, programcı tarafından belirlenmiş HTML içeriği render eder. WebControl sınıfı, Control sınıfından inherit edilmiş olup Control sınıfının özellikleriyle beraber kontrollerin renk, font gibi görsel yönlerinin yönetilmesini sağlayan özellikler sunar. Bu yöntemle geliştirilmiş kontrolün tag yapısını ve içeriğini genellikle programcı HTML ifadeler yazarak oluşturur. Bunu da daha önce kendisinden bahsettiğimiz HtmlTextWriter nesnesi aracılığıyla yapar. Bu bölümde daha detaylı göreceğimiz HtmlTextWriter sınıfı, kontrolleri render edip HTML çıktısını oluşturma, elementlere ait attribute tanımlamaları yapma, style attribute oluşturma gibi servisleri sağlar. HtmlTextWriter sınıfının bu amaçla kullanılan önemli metodları şunlardır;
AddAttribute(): RenderBeginTag() metodu tarafından açılmış HTML tagına attribute ekler.
AddStyleAttribute(): RenderBeginTag() metodu tarafından açılmış HTML tagına CSS attribute ekler.
RenderBeginTag(): Bir başlangıç HTML tagını render eder.
RenderEndTag(): Bir bitiş HTML tagını render eder.
Write(): Browserda görünmek üzere düz metin yazdırır.
WriteBreak():
HTML tagını yazdırır.
AddAttribute() veya AddStyleAttribute() methodlarını ihtiyacımız kadar birden fazla kullanabiliriz. Bu tür metodları, RenderBeginTag() metodundan önce çağırmaya dikkat etmeliyiz. RenderBeginTag() metodu çalıştığı zaman bütün attributeler açılış tagına eklenmiş olur.
HtmlTextWriter sınıfına ait bu metodlar parametre olarak string veya aşağıdaki enumeration türündeki değerleri alır;
HtmlTextWriterTag: En çok kullanılan HTML taglarının listesini içerir.
HtmlTextWriterAttribute: En çok kullanılan HTML attributelerinin listesini içerir.
HtmlTextWriterStyle: En çok kullanılan CSS attributelerinin listesini içerir.
Özel kontrol geliştirirken işlemlerin doğru zamanda gerçekleşmesi açısından taban aldığımızın sınıfın(Control veya WebControl) hangi metodlarını override edeceğimiz önem arzetmektedir. Control ve WebControl sınıfların ortak ve ayrık metodları bulunur. Yeri geldikçe bu metodlardan bahsedeceğiz. Şimdilik WebControl’ün başlangıç için bilmemiz gereken metodlarından bahsedelim;
RenderBeginTag(): Açılmış HTML tagını açılma aşamasında özel bir içerikle render etmek için kullanılır. Parametre olarak HtmlTextWriter türünde değer alır.
RenderEndTag(): Açılmış HTML tagını kapatılma aşamasında özel bir içerikle render etmek için kullanılır. Parametre olarak HtmlTextWriter türünde değer alır.
ApplyStyle(): Web kontrolüne style uygulamak için kullanılır. Parametre olarak System.Web.UI.WebControls.Style türünde değer alır.
CopyBaseAttributes() : Bir web server kontrolünün Style sınıfından türememiş olan property’lerini bu metodu çağıran kontrole kopyalamak için kullanılır. CopyBaseAttributes() metodu, WebControl türünde parametre alıp kaynak kontrolün AccessKey, Enabled, ToolTip, TabIndex ve Attributes property’lerini kopyalar.
Render(): HtmlTextWriter türünde değer alarak kontrolün istemci tarafındaki HTML element içeriğini oluşturur.
Bir ASP.NET sayfası çalıştırıldığı zaman, sayfa içerisindeki web kontrollerinin RenderControl() metodlarına HtmlTextWriter nesnesi gönderilerek çağrılır. RenderControl() metodu, kontrole ait protected modundaki Render() metoduna elçilik eder. Render() metodu, RenderBeginTag(), RenderContents() ve RenderEndTag() metodlarını uygular. Bu üç metod da daha önce parametre olarak RenderControl() metoduna gönderilmiş aynı HtmlTextWriter nesnesini kullanılır. Her metod, görevleri doğrultusunda oluşturduğukları HTML çıktıyı, HtmlTextWriter nesnesine ekler. Bu metodların tamamlanmasından sonra ASP.NET engine, kontrolden geri dönen HtmlTextWriter nesnesini handle eder ve ona göre browsera gönderilecek HTML çıktıya ekler. Custom kontrol geliştiriken bu metodların hepsi kullanılmak zorunda değildir. Sadece Render() veya RenderContents() metodlarıyla ilgili HTML çıktı oluşturulabilir.
Doğrudan Control sınıfından inherit edilmiş custom kontrollerde genellikle Render() metodu kullanılır. Aşağıdaki örnekte basit bir custom kontrol kodu gösterilmiştir. Bu kontrol, büyüklüğü ve rengi bizim tarafımızdan belirlenen bir başlık oluşturur.
[Baslik.vb]

Imports System.Web.UI 'Control,HtmlTextWriter

Namespace OrnekWebKontrol
    Public Class Baslik : Inherits Control
        Private _boyut As Integer
        Private _metin As String

        'Başlığın font büyüklüğü
        Public Property Boyut() As Integer
            Get
                Return _boyut
            End Get
            Set(ByVal value As Integer)
                _boyut = Value
            End Set
        End Property 'Boyut

        'Başlığın içeriği
        Public Property Metin() As String
            Get
                Return _metin
            End Get
            Set(ByVal value As String)
                _metin = Value
            End Set
        End Property 'Metin

        Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
            writer.Write("
<b>[Baslik.cs]</b>
using System.Web.UI; //Control,HtmlTextWriter

namespace OrnekWebKontrol
{
    public class Baslik : Control
    {
        private int _boyut;
        private string _metin;

        //Başlığın font büyüklüğü
        public int Boyut
        {
            get
            {
                return _boyut;
            }
            set
            {
                _boyut = value;
            }
        }//Boyut

        //Başlığın içeriği
        public string Metin
        {
            get
            {
                return _metin;
            }
            set
            {
                _metin = value;
            }
        }//Metin

        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("
< %@ Register Assembly="OrnekWebKontrol"
	Namespace="OrnekWebKontrol" TagPrefix="cc1" %>
. . . . .

<img src="http://www.ahmetkaymaz.com/wp-content/uploads/Web_Custom_Control_3.jpg"/>
Örneğimizi, konunun başında bahsettiğimiz metodları kullanarak ta oluşturabiliriz. Baslik dosyasına ZeminRenk isimli bir property ekleyip Render metodunu aşağıdaki gibi düzenleyelim.
<b>[Baslik.vb]</b>
Public Class Baslik : Inherits Control
        . . .
        Private _zeminRenk As String

        'Fontun zemin rengi
        Public Property ZeminRenk() As String
            Get
                Return _zeminRenk
            End Get
            Set(ByVal value As String)
                _zeminRenk = Value
            End Set
        End Property 'ZeminRenk

        Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
            writer.AddAttribute("size", _boyut.ToString())
            writer.AddStyleAttribute("background-color", ZeminRenk)
            writer.RenderBeginTag("font")
            writer.Write(_metin)
            writer.RenderEndTag()
        End Sub 'Render
    End Class 'Baslik

[Baslik.cs]

public class Baslik : Control
{
    . . .
    string _zeminRenk;

    //Fontun zemin rengi
    public string ZeminRenk
    {
        get
        {
            return _zeminRenk;
        }
        set
        {
            _zeminRenk = value;
        }
    }//ZeminRenk

    protected override void Render(HtmlTextWriter writer)
    {
        writer.AddAttribute("size", _boyut.ToString());
        writer.AddStyleAttribute("background-color", ZeminRenk);
        writer.RenderBeginTag("font");
        writer.Write(_metin);
        writer.RenderEndTag();
    }//Render
}//Baslik

Kontrolü, bu haliyle tasarım anında sayfanın üzerine eklediğimizde küçük bir nokta olarak görülecektir. Property’lerini set etmeden mouse ile onu seçmek pek kolay olmayacaktır. Bunu aşmak için _metin değişkenine default bir değer verilebilir.
Private _metin As String = “Başlık giriniz!”
private string _metin=”Başlık giriniz!”;
Böylece kontrol, sayfanın üzerine taşındığında Metin property’si “Başlık giriniz!” olarak set edilmiş olur.
PÜF
TextBox gibi bazı kontrolleri, form elementi içerisinde kullakmak zorundayız. Eğer bu kontrolleri, form elementi dışında tanımlarsak “.must be placed inside a form tag with runat=server” hata mesajıyla karşılaşırız. Bu şekilde geliştirdiğimiz kontrollerin, “runat=server” özellikteki form elementinin içerisinde render edilmesini zorunlu kılmak için Page.VerifyRenderingInServerForm() metodu kullanılır. Custom kontrol, bu metoda parametre olarak geçilir. Bu işlemin, AddAttributesToRender() veya Render()/RenderContent() metodlarında yapılması tavsiye edilir.

Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
    Dim page As Page = Me.Page
    If (Not page Is Nothing) Then
        page.VerifyRenderingInServerForm(Me)
    End If
    . . .
End Sub
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    Page page = this.Page;
    if (page != null)
    {
        page.VerifyRenderingInServerForm(this);
    }
    . . .
}

Web Kontrol Geliştirme – III [Rendered Control]” üzerine 4 düşünce

  1. mahmut gundogdu

    merhaba harika bir makale henüz eşine rastlamadım ancak benim bir sorunum var. textboxa bir property ekliyorum cep isminde ancak bu property e atadığım değer saklanmıyor post back oluyor değer bana null dönüyor geri neyi atlıyorum ne yapmam gerekli?
    istiyorum ki bir cep yapayım misal kayıtın ID değerini atayım ama olmuyor

    Cevapla
  2. Ahmet Kaymaz Yazar

    Merhaba Engin Bey,custom control geliştirirken viewstate alanına ne kayıt edileceğini SaveViewState() yordamını override ederek belirtebilirsiniz. Ardından sayfa yüklenirken LoadViewState() yordamını kullanarak viewstate içerisindeki ilgili değeri ilgili property’e set ederek kontrolü oluşturabilirsiniz. Konuyla ilgili aşağıdaki linkleri tavsiye ederim.http://www.eggheadcafe.com/articles/extendtextboxviewstate.asphttp://www.informit.com/articles/article.aspx?p=101748&seqNum=4http://www.15seconds.com/issue/020102.htm

    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.