Murat Tüfekçi

Asp.Net Dinamik Kontrol YaratmaSubscribe Subscribe

  • Murat Tüfekçi
  • November 10th, 2006

Web Projelerinde bazen ole durumlar olur ki, arayuzun tasarım aşamasında yerleştiremediğiniz kontrollerin kullanıcıya sunulması gerekir. Ama sorun kontrolü yaratmak değildir. Bu kontrolü yaratıp bu kontorlü ismi ile kod tarafında kullanmamız işlerimizi cok kolaylaştıracaktır. Hatta daha da öteye giderek bu yaratılan kontrolün durumu viewstate sayesinde devamlı olaraktan saklamak isteyebiliriz. Buna örnek olarakta multiview kullanırken herhangi bir view kontrolünün içinde dinamik yaratılmış olan kontrolun değerine, o view kontrolunun visible ozelligi false degerini almis olmasina rağmen erişmek isteyebilirsiniz. Örneğin 3 adımlı bir kayıt sisteminiz. Birinci adım kişisel bilgilerini girdiği ikinci adım öğrenim bilgilerini girdiği üçüncü adımda kayıdın tamamladığı ve iyi gunler mesajı verildiği bir yapı düşünelim. Bu üç adımın her birinin bir view kontrolu olduğunu ve button kontrolleri sayesinde bu view kontrollerini açıp kapattığımızı düşünelim. Mantık olarak butun database işlemleri son adıma geçişte yapıldığından ve o anda zaten kapatılmış olan view kontrolleri ve içerisinde bulundurduğu dinamik yaratılmış kontrollerin değerlerini buraya kadar taşımamız gerekmektedir. İşte burda kullanıcıya gösterilmeyen ama degerlerini koruyan bir textbox vs gibi dinamik yaratılmış kontrollerin değerini alıp veritabanına kaydedilmesi gerekmektedir.

Bilmemiz gereken esas bilgi burda Asp.Net Page Life Cycle dediğimiz Asp.Net sayfa yaşam döngüsünün çalışma mekanizması…


Bu döngüde kontroller her zaman Page initialization dediğimiz bölümde yaratılır ve bu bolum OnInit event inde gerçekleştirilir. Burda kontrollere eşsiz kimlikleri atanır. Bundan sonra bu bu kimlikler ile viewstate deki veriler eşlenir. Eğer viewstate de oluşturulmuş bu eşsiz kimliğe uygun veri varsa bu veri ilişkili kontrole aktarılır. Burdan şunu çıkarabiliriz, eğer biz bir kontrolu bu Page initialization zamanında yaratırsanız( OnInit Event i yani) sanki tasarım zamanında yaratmışcasina davranir yani zaten uygulanan standart rutine sizin dışardan eklemeler yapmanız gibi düşünebiliriz. Ama burda şöle bir sorun açığa çıkabilir. Diyelim sizin bir combobox kontrolunuzden gelen ve kactane dinamik textbox kontrol yaratıcağımızı belirleyen bir veri geliyor ve biz burdan gelen sayıya göre textboxları yaratıyoruz. Ve bu değeri mycombo1.selectedValue gibi alabileceğimizi umuyorsak yanılıyoruz. Çünkü Page initialization kontroller yeni yaratılmaktadır. Yani henüz viewstate değerleri kontrollere yüklenmemiştir. Bu yüzden kontroller her hangi bir değer içermezler. Bu değeri almanın yolu Request.Form["mycombo1"] den geçer… Bu değere göre kontrollerinizi yaratırsaniz istediğiniz sonucu elde elmeniz mümkün olacaktır.


Kod Örneği (C#, .Net v2.0) :

protected override void OnInit(EventArgs e) {
base.OnInit(e);
int Deger=0;
for (int i = 0; i < Request.Form.Count; i++)
{
if (Request.Form.Keys[i].IndexOf(“ddlKonaklama”) > -1)
{
Deger = Convert.ToInt32(Request.Form[i]);
break;
}
}
//KisiselBilgi.ascx icinde sadece 3 tane textbox ve 1 Label kontrol iceren bir user kontrol
string UserControlPath=“kisiselbilgi.ascx”;
for (int i = 0; i < YetiskinSayisi; i++)
{
//PLHKisiselBilgier kontrolleri içerecek olan PlaceHolder Asp.Net Web kontrolü
PLHKisiselBilgier.Controls.Add(CreateCustomControl(UserControlPath, “Y”,“Yetişkin”, i));
}
}
private Control CreateCustomControl(string ControlPath, string IdSpec,string Tip,int iD)
{
Control crtl = LoadControl(ControlPath);
crtl.ID = “crtl” + IdSpec+ “_” + iD;
//User kontrolun icindeki lblTip id li label in Text özelliğini bu şekilde ayarlıyoruz.
((Label)crtl.FindControl(“lblTip”)).Text = Tip;
return crtl;
}




Article Comments2 Comments

  • Özgür

    Posted on December 24th, 2006 at 9:26 am

    Hocam Çok Çok Minnettarım size Sitenizi Googledan buldum
    bende Bir anket yazıyorum seçenek Textboxlarını Dinamık olarak ekledim ancak erişmeye gelince denemediğim şey kalmamıştı ….
    Çok Çok Sağolun blogunuzu Takip edicem.

  • Murat Tüfekçi » Blog Archive » Dinamik olarak UserControl leri kullanmak

    Posted on November 29th, 2007 at 6:26 pm

    [...] Asp.Net Dinamik Kontrol Yaratma başlıklı yazımda kontrollerin dinamik olarak nasıl ekleneceğinden yeteri kadar bahsetmiştim. Hatta örnek olarak verdiğim örnekte temel asp.net kontrolu yerine yaratmış olduğumuz bir usercontrol u kullanmıştık. Bu usercontrol u icerisinde birden fazla asp.net temel kontrolunu iceren bir küme bulunmaktaydı. Biz bu usercontrol u temel kontroller iceren bir şablon kontrol olarak düşünebiliriz. Ve biz bu usercontrol u Page nesnesinin LoadControl(string Path) methodunu kullanarak yüklemiştik. Buraya kadar herşey çok güzeldi. Fakat biz bu yüklediğimiz kontrolun içinde ki bir kontrolun değerini değiştirmek istersek napacağız? İşte burda bu konuya açıklık getireceğiz. [...]

Leave a Comment

Required
Required (Won't be published)
Optional
Avatar
Add your picture!
Join Gravatar and upload your avatar. It's free!