Anasayfa / Yazılım / ASP.NET / ListBox Kontrolü, Diziler ve PostBack

ListBox Kontrolü, Diziler ve PostBack

Bu yazımda ListBox kontrolünün kullanımı ve diziler ile birlikte döngülerin kullanımına değinmek istiyorum. Anlatmak istediklerimi uygulama bazında gerçekleştireceğim. Adım adım da açıklamamı yapacağım. Öncelikle boş bir WEB projesi açalım ve içine bir adet WEB form ekleyelim. öncelikle tasarımımızı oluşturalım. Formumun design alanına geçiyorum ve formuma 3 satır 2 sütundan oluşan bir table ekliyorum. Daha sonra Formuma iki adet ListBox ekliyorum. Ve iki adette buton ekliyorum. Tasarım olarak şekil aşağıdaki gibi :

Aşağıdaki koduda web formumuzun design alanına yapıştırsanız aynı tasarımı elde ederiz zaten.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>





    
    


    
Öğrenci Listesi Sınıftaki Öğrenciler

Tasarım aşamamız bitti. Şimdi ilk yapmak istediğim solda yer alan ListBox içine sayfam yüklendiğinde isimleri yükletmek. Yani bu listbox içinde aslında bir string türünden liste oluşturmak. Listbox içinde yer alan öğeler aslında birer dizi oluşturular, bunu da buradan anlayabiliriz. Bunun için sayfanın page_load olayında aşağıdaki kodu yazıyorum :

protected void Page_Load(object sender, EventArgs e)
    {
        //isimler isminde string tipinde 10 elemanlı bir dizi oluşturuyorum, ve kod ile isimleri dizime yani listboxa indeks
        //numaraları ile yüklüyorum
        string[] isimler = new string[10];
        isimler[0] = "İsmail";
        isimler[1] = "Ayşe";
        isimler[2] = "Ali";
        isimler[3] = "Fatma";
        isimler[4] = "Veli";
        isimler[5] = "Mehmet";
        isimler[6] = "Zeynep";
        isimler[7] = "Yusuf";
        isimler[8] = "Erkan";
        isimler[9] = "Eyüp";

        //Dizimi oluşturdum, şimdi bu dizi içinde for döngüsü ile dönerek her bir elemanı lbogrncilere alıyorum
        for (int i = 0; i < isimler.Length; i++)
        {
            lbOgrenciler.Items.Add(isimler[i]);
        }
    }

Böylelikle sayfa yüklendiğinde sol tarafta yer alan listbox’a isimler yüklenir. Burada listboxa direkt olarak da elemanlar girilebilir ama bizim amacımız kodla bunların da yapılabilirliğini göstermek.

Aşağıdaki gibi bir görüntü elde ettik yani.

Şimdi amacım ekle butonuna basınca sol tarafta yer alan isimleri sağda yer alan listboxa eklemek. Yani sınıf listesine eklemek. Bunu gerçekleştirelim. Bunun için ekle butonuna çift tıklayalım ve bu butonun click eventinde aşağıdaki kodları yazalım :

 protected void btnEkle_Click(object sender, EventArgs e)
    {
        //Bu işlemi yapabilmek için lbogrenciler içinde for döngüsü ile döneceğim, sonra buradaki her elemanı lbsinifa alacağım
        for (int i = 0; i < lbOgrenciler.Items.Count; i++)
        {
            lbSinif.Items.Add(lbOgrenciler.Items[i].Text);
        }
    }

Şimdi tekrar çalıştıralım, ilk anda karşıma gelen görüntü:

Her şey güzel, adım adım gidiyorum çünkü dikkat çekmek istediğim bir nokta olacak 🙂

Ekle butonuna basalım elde edeceğimiz görüntü :

Görüldüğü gibi isimler sağ tarafa eklendi ancak soldaki isim listesi iki kere tekrarlı sağdaki de iki kere tekrarlı, tekrar ekleye basınca soldaki 4 oluyor, sağdaki de 4, tekrar basınca 8’e 8 oluyor. Peki iyi de neden diye soruyoruz kendi kendimize?

İşte burada cevap PostBack olayı oluyor. PostBack şudur, bir sayfadaki form verilerinin herhangi bir servera gönderilten sonra tekrar geri yüklenmesi. Yani biz burada sayfamız ilk anda yüklendikten sonra Page_Load eventi altında dizimizi oluşturduğumuz ve listboxa verileri yüklediğimiz için daha sonra butona da bastıktan sonra sayfa tekrar yüklendiği için hem buton click eventinde hemde sayfanın load eventindeki kodlar tekrardan çalışıyor. Sayfanın postback olup olmama durumunu ilk anda kontrol etmediğimiz içinde her seferinde işlemi kendi içinde bir kontrol tetiklendikten sonra tekrarlıyor.

Daha terminolojik anlatırsam, ASP.NET’te oluşturulan bir sayfa ilk yüklendiği anda sunucuya gönderilmemiştir. Yani POST edilmemiştir. Kullanıcı tarafından sayfa üzerindeki herhangi bir kontrol mekanizması tetiklendikten sonra, bu bir buton olabilir, bir comboboxdan veya bir listboxdan veri seçme olabilir, bir imagelink olabilir, bir link olabilir, herhangi bir kontrol yani, bu kontrol mekanizması tetiklendikten sonra ASP.NET web sayfası tekrar değerlendirilmek üzere sunucuya gönderilir, daha sonra sunucudan dönen sayfa yeni verilerle ile yüklenip tekrar geriye döner. İşte bu işlem POST edilip daha sonra tekrar geriye dönmesi yani BACK olmasıdır.

İşte uygulamalarımızda özellikle dropDownList, ListBox gibi içeriği veri dolu olan kontrolleri kullanıyorsak ve bir başka kontrol mekanizmalarının tetiklenmesi sonucu bu veriler yeniden işlenecekse sayfamızın daha önceden postback edilip edilmediğini kontrol etmemiz gerekir. Bunun için kullanılacak metot Page.IsPostBack özelliğidir. Bunu da bir if karar yapısı ile kullanabilmekteyiz. Dolayısı ile kodlarımı tamamen aşağıdaki gibi düzenledikten sonra artık herhangi bir sorunla karşılaşmayacağım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //isimler isminde string tipinde 10 elemanlı bir dizi oluşturuyorum, ve kod ile isimleri dizime yani listboxa indeks
        //numaraları ile yüklüyorum
        string[] isimler = new string[10];
        isimler[0] = "İsmail";
        isimler[1] = "Ayşe";
        isimler[2] = "Ali";
        isimler[3] = "Fatma";
        isimler[4] = "Veli";
        isimler[5] = "Mehmet";
        isimler[6] = "Zeynep";
        isimler[7] = "Yusuf";
        isimler[8] = "Erkan";
        isimler[9] = "Eyüp";

        //Dizimi oluşturdum, şimdi bu dizi içinde for döngüsü ile dönerek her bir elemanı lbogrncilere alıyorum
        //Ancak öncelikle sayfamın PostBack durumunu kontrol ediyorum

        if (!Page.IsPostBack)  //Sayfam PostBack edilmemişse for döngüsü çalışcak, edilmişse tekrar çalışmayacak
        {
            for (int i = 0; i < isimler.Length; i++)
            {
                lbOgrenciler.Items.Add(isimler[i]);
            }
        }
    }
    protected void btnEkle_Click(object sender, EventArgs e)
    {
        //Bu işlemi yapabilmek için lbogrenciler içinde for döngüsü ile döneceğim, sonra buradaki her elemanı lbsinifa alacağım
        for (int i = 0; i < lbOgrenciler.Items.Count; i++)
        {
            lbSinif.Items.Add(lbOgrenciler.Items[i].Text);
        }
    }
}

Elde edeceğim görüntü :

Bu sefer doğru sonucu elde ederiz. Tabi kullanıcı tekrar ekle butonuna basarsa sağ taraftaki listboxa aynı isimler tekrar eklenir ama bu durum PostBack ile alakalı değil tamamen butonun click eventinin tekrar çalışması ile alakalıdır, zaten soldaki listboxa eklenmemesinden rahatlıkla anlaşılabilir.

Bu yazı devam edecek. Uygulamanın şu ana kadarki kısmını indirmek için aşağıdaki linki kullanabilirsiniz.

Bir cevap yazın

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