Bu yazımızda ASPNET ile dinamik kontrollerin nasıl yaratılarak,kullanıldığına değineceğiz. öncelikle dinamik kontrollerle neden bahsettiğimizi açıklayalım. Web Forms’un server taraflı çalışan üyelerinden bahsediyorum. Yani bir Label,TextBox yada herhangi bir server kontrol olabilir. Makalemizde Web uygulamamıza çalışma zamanında label dizisi ve textbox dizisini ekleyerek bu textbox içine girilen stringleri alıp ListBoxItems’a ekleyerek konuyu pekiştirmeye çalışacağız.
öncelikle Server taraflı çalışacak kontrolü(mesala Label) sayfaya eklememiz için bir nesne olarak onu belirtmemiz gerekir. Belirtmiş olduğumuz bu nesneyi Page özelliğinin Controls özelliğinin add methodu ile içine eklemeliyizki sayfanın çalışma anında kontrol eklendiğinden haberi olsun ve tekrar tetiklensin.
| Label label1=new Label();
Page.Controls.Add(label1);
|
öncelikle sayfamıza bir button ekleyerek bu butona 10 elemanlı bir label dizisini panel(Labelpanel) kontrolümüze ekleyen fonksiyonu inceleyelim:
private void labelekle()
{
int uste_uzaklik=30;
Label [] labelarray=new Label[10];
for(int i=0;i<labelarray.Length;i++)
{
labelarray[i]=new Label();
labelarray[i].Style["Position"]="Absolute";
labelarray[i].Style["Top"]=uste_uzaklik.ToString()+"px";
labelarray[i].Style["Left"]="100px";
labelarray[i].Font.Bold=true;
labelarray[i].Font.Name="Verdana";
labelarray[i].ID=i.ToString();
labelarray[i].Text=labelarray[i].ID+".Label:";
Labelpanel.Controls.Add(labelarray[i]);
uste_uzaklik+=30;
}
} |
Yukarıdaki kodu incelediğimiz zaman labelarray adında 10 elemanlı bir Label dizisi oluşturmaktayız. Fakat bu diziyi oluşturmamız her dizi elemanı için bir nesne tanımladığımız anlamına gelmez. Bunun için döngü başlangıcında dizinin her elemanı için bir nesne tanımlamamız gerekmektedir. Daha sonra ise yaratılan nesneye çeşitli özellikleri verilerek Panele(Labelpanel) yerleştiriliyor. uste_uzaklik degiskeni ise her labelin üste olan uzaklığını ölçüm için kullandığımız bir değişkendir. Ve son olarakta bu yarattığımız kontrolü Labelpanel’in Controllerine ekliyoruz. Label ekle buttonun olayı sonucu meydana gelen sonuç aşadaki resimde gözükmektedir.

şekil 1:Labellerin dinamik olarak eklenmesi
Şimdide senaryomuzun ikinci kısmına geçelim. Bu kısımda TextBox ekleme buttonuna tıklayarak labellerin karşılarına bir TextBox ekleyerek en sona da dinamik bir button ekliyoruz. Kodumuzu incelersek Label eklemeye(labelekle()) çok benzediğiniz görüceksiniz:
private void textboxekle()
{
int uste_uzaklik=30;
TextBox [] textboxarray=new TextBox[10];
for(int i=0;i<textboxarray.Length;i++)
{
textboxarray[i]=new TextBox();
textboxarray[i].Style["Position"]="Absolute";
textboxarray[i].Style["Top"]=uste_uzaklik.ToString()+"px";
textboxarray[i].Style["Left"]="100px";
textboxarray[i].Font.Bold=true;
textboxarray[i].Font.Name="Verdana";
textboxarray[i].ID=i.ToString()+"txt";
TextBoxpanel.Controls.Add(textboxarray[i]);
uste_uzaklik+=30;
}
Button bt=new Button();
bt.Style["Position"]="Absolute";
bt.Style["Top"]=uste_uzaklik.ToString()+"px";
bt.Style["Left"]="100px";
bt.Text="Bitti";
bt.Click+=new EventHandler(this.bt_click);
TextBoxpanel.Controls.Add(bt);
}
private void bt_click(object o,EventArgs args)
{
} |

şekil 2:Textboxların eklenmiş hali.
Şu ana kadar herşey yolunda gidiyor değil mi. Ama birde Bitti buttonuna veya başka bir buttona bastığımızı düşünelim. çalışma zamanında yaratmış olduğumuz bütün dinamik kontrollerin yok olduğunu görüceksiniz. Bunun nedeni; istemcinin sunucudan bir istekde bulunması ve sayfanın buna cevap verirken tekrardan yüklenmesidir. Bunu önlemek için labelekle() ve textboxekle() fonksiyonlarımızı Oninit olayında çağırmak ve sayfa yüklenirken kontrollerinde yüklenmesini sağlamak.
override protected void OnInit(EventArgs e)
{
labelekle();
textboxekle();
InitializeComponent();
base.OnInit(e);
} |
Projemizi bu şekliyle derlediğimiz zaman Textboxları ekle ve Labelleri ekle buttonlarına basmadan eklemiş olacağız. Birde dinamik olarak eklediğimiz bt buttonunun olayını incelersek:
private void bt_click(object o,EventArgs args)
{
TextBox txt = null;
for (int i=0;i<TextBoxpanel.Controls.Count;i++)
{
string panelid=TextBoxpanel.Controls[i].ID;
for(int j=0;j<10;j++)
{
string idkey="txt";
idkey+=j.ToString();
if(panelid==idkey)
{
txt=(TextBox)TextBoxpanel.Controls[i];
ListBox1.Items.Add(txt.Text);
txt.Enabled=false;
txt.BackColor=Color.Red;
}
}
}
} |
Burdaki mantıkta ise panellere eklediğimiz kontrolleri id’lerine göre karşılaştırdıktan sonra kendi türünden kontrole dönüştürerek özelliklerinden yararlanılmıştır.

şekil:3 sayfanın Oninit olayını çağırdıktan sonraki hali

şekil:4 sayfadaki Bitti buttonuna basınca aldığı hal.
örnek uygulama kodları için
İyi çalışmalar.
Kaynak : csharpnedir.com
|