Repeater ile çalışmak

Repeater asp.net aleminin bana göre en delikanlı kontrolüdür. Kafasından hiç bir şey yapmaz, biz ne dersek onu yapar. Bu sebepten dolayı veriyle ilgili kontrollerin en az özelliklisidir, hatta özelliği yoktur bile :) Madem hiç bir özelliği yok neden var bu kontrol ? Hemen anlatayım.

Repeater’ ın abisi olan DataList bir çok güzel özelliği üzerinde barındıran bir kontroldür. GridView ise bu iki kontrolden farklı bir mantıkta çalışır bu sebepten ötürü kulvarları çok farklıdır.  GridView veriyi satır satır (row) ekrana basar, DataList ve Repeater ise eleman elaman (item) basar. GridView’ da DataList’ de veriyi ekrana basarken kendi html şablonunu kullanır, Repeater ise hiç bir şablonu kullanmaz, etiketsiz, biçimsiz bir veri ekrana basar. Şöyleki, sanki bir döngü yazdınız ve veritabanından gelen saf veriyi ekrana bastınız. Bunun neresi güzel diye sorabilirsiniz. İstediğiniz gibi şekillendirebilirsiniz, kendiniz şekillendireceğiniz için w3 kurallarına uygun ve arama motorlarının sevdiği cinsten bir tasarım yapabilirsiniz. Burada şöyle bir durum da var, DataList ile 5 dakikada yapacağınız bir işi Repeater’ la 25 dakikada yaparsınız. Arada ki fark ise birinde kurallara uygun bir tasarım ve tamamen kontrolü sizde olan bir tasarım, diğerinde ise kuralsız ve zaman zaman kontrolün sizde olmadığı bir tasarım. Bu sebepten dolayı, sitelerin kullanıcı arayüzünde Repeater, yönetici kısmında ise DataList kullanmak gerekiyor diye düşünüyorum. Okumaya devam et Repeater ile çalışmak

Datalist içinde RadioButton Gruplamak !

İlkten çok basit gibi görünen bir durum, fakat uğraşmaya başlayınca durumun böyle olmadığını görüyorsunuz. Senaryomuz şu şekilde;
verileri listelediğimiz bir DataList nesnemiz var, her satırın başında
bir RadioButton bulunuyor, biz kullanıcının sadece bir tane seçim
yapmasını istiyoruz (Şekil 1). Bir nevi RadioButtonList nesnesinin
yaptığı işi DataList içinde yapmak istiyoruz. Yaptığım araştırmalarda

CodePorject
de bir .dll sayesinde yapıldığını gördüm, fakat projeye bu .dll
yi eklemek işime gelmedi. Aklıma bu işin Javascript’ le çözülebileceği geldi ve
aramalarımı bu yönde sürdürdüm, en sonunda aradığım betiği buldum ve çok mutlu
oldum :) Sizlerlede paylaşmak istedim :)

 
Şekil 1

JavaScript Kodumuz

<script type="text/javascript">
function clickit() {
        var doc=document.all;
        var el=event.srcElement;
        if(el.tagName=="INPUT"&&el.type.toLowerCase()=="radio")
        {
                for(i=0;i<doc.length;i++)
                {
                        if(doc[i].tagName=="INPUT"&&doc[i].type.toLowerCase()=="radio")
                        {
                                doc[i].checked=false;
                        }
                }
        }
        el.checked=true;
}
</script>

Kullanımı ise şu şekilde

<asp:RadioButton ID="RadioButton1" runat="server" onclick="clickit();"/>

Datalist ile kayıtları kolay bir şekilde sayfalama.

DataGrid ile sayfalama işlemini 2 satır kodla yapabilirken bu durum DataList için biraz farklı. Birden fazla sayfalama şekli bulunuyor. İnternette en basit şekilde nasıl
yapılabilirin yollarını ararken şunu gördüm, kabaca iki şekil bulunuyor. Birincisi PagedDataSource nesnesini kullanarak sayfalama yapmak, diğeride benim izlediğim yol tarzı yöntemler.
Araştırmalarımda üçüncü bir yola rastlamadım.

Gelelim mekanızmamıza, başlıkta kolay ifadesinin geçmesinin sebebini açıklayayım hemen. Eğer araştırma yaparsanız bu teknikte genelde birden fazla method kullanılıyor,
bir methotda toplam kayıt sayısı bulunuyor, (düşünün datalist içinde sayfalayacığınız bilglerin gösterimi için kullanacağınız sql cümlenizin hem burada hemde verilerin listeleneceği yerde aynı olması gerekirki buda ek külfet demek.) diğerinde sayfalama işlemleri yapılıyor vb..
Ben burda tek method altında tüm sayfalama işlemlerini toplamaya çalıştım.
Direk kodları burdan kopyala yapıştır yaparak, sadece tablo adını be veritabanınıza bağlantı cümlenizi değiştirerek kullanabilirsiniz. Sayfalamamız göze hoş gelsin diye
birazcık sitil ayarlarını değiştiriyoruz. Kodlarla ilgili açıklamaları karşılarına dilimin döndüğü kadar yazmaya çalıştım. Umarım işinize yarar.
Başka yazıda görüşmek üzere hoşçakalın.

Tasarım kısmımız;

.sayfalama a{
    display:block;
    float:left;
    border:1px solid #ededed;
    padding:5px;
    width:15px;
    text-decoration:none;
    font-weight:bold;
    background-color:#f2f2f2;
    margin:2px;
    text-align:center;
    color:Black;
}
.sayfalama a:hover{
    border:1px solid #c0c0c0
}
.sayfalama .aktif{
    display:block;
    float:left;
    border:1px solid #ededed;
    padding:5px;
    width:15px;
    text-decoration:none;
    font-weight:bold;
    background-color:#da010d;
    margin:2px;
    text-align:center;
    color:white;
}
[/html]
<asp:DataList ID="DataList1" runat="server"></asp:DataList>
<div class="sayfalama">
    <asp:Label runat="server" ID="sayfalar"></asp:Label>
</div>
<asp:Label runat="server" ID="kayitbulunamadi"></asp:Label>

Kod kısmımız;

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBind();
        }
    }
 

    private void DataBind()
    {
        SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["baglanti"].ToString());
        //ben burda web.config içindeki sql bağlantısı cümlesini kullanıyorum.
        SqlDataAdapter objDA = new SqlDataAdapter("Select * From TabloAdi", conn);
        DataSet objDS = new DataSet();

        //Değişkenlerimiz
        int goruntulenecekKayitSayisi=5; //bir sayfadaki kayıt sayısı
        int toplamKayitSayisi=0; //Tablomuzdaki toplam kayıt sayısı
        int toplamSayfaSayisi = 0; //Toplam sayfa sayısı
        int ilkKayit = 0; //Listelemeye başlanılacak kayıt sayısı
        int sayfa; //Sayfamız

        string adresEk = Request.QueryString.ToString(); //Burada QueryStringle tarayıcıdaki adresi alıyoruz.
        												//Amacamız şu diyelimki sayfanızda değişken querystringler var, yani Sayfamiz.aspx?Islem=Deneme&Kat=3
        												//Burdaki değişkenleri aynen alıp sayfa numaramızı replace ediyoruz ve herzaman sabit bir adres elde etmiş oluyoruz.
        												//Sayfamiz.aspx?Islem=Deneme&Kat=3&Sayfa=1 , Sayfamiz.aspx?Islem=Deneme&Kat=3&Sayfa=2
        												//Sayfamiz.aspx?Islem=BaskaBisiy&Kat=1&Sayfa=1, Sayfamiz.aspx?Islem=BaskaBisiy&Kat=1&Sayfa=2 gibi..
        												//Bu sayede kodlarda hiç bir değişiklik yapmadan DataList nesnesinin olduğu yerde bu mekanızmayı kullanabilirsiniz.

        try // bu blokda eğer QueryString deki Sayfa karşısıa sayıdan başka bir değer girilirse, sayfada hata oluşmadan sayfa değişkenimize 1 değerini atıyoruz.
        {
            sayfa = Convert.ToInt32(Request.QueryString["Sayfa"]);
        }
        catch
        {
            sayfa = 1;
        }

        if (sayfa == 0) { sayfa = 1; } 

        objDA.Fill(objDS);
        toplamKayitSayisi = objDS.Tables[0].Rows.Count;
        objDS = null;
        objDS = new DataSet();
        //burdkai dikkat edilecek nokta, önce toplam kayıt sayımızı ilgili değişkene atıyor ve datasesi temizliyor, tekrar yeniden oluşturuyoruz.

        //Toplam sayfa sayısını buluyoruz.
        //Burdaki olayı çok kaba tabirle özetliyeyim, örneğin Tablomuzda 9 kayıt var ve biz bu kayıtları sayfa başına 2 olarak göstermek istiyoruz.
        //Bu durumda 9/2=4,5 çıkıyor yani 4 sayfa ! aşşağıda bu tip durumlarda görüntüleyeceğimiz kayit sayımıza 1 ekleyip 5 sayfa olmasını sağlıyoruz.
        // Buradaki % işareti Mod anlamına geliyor.
        if (toplamKayitSayisi % goruntulenecekKayitSayisi == 0)
        {
            toplamSayfaSayisi = toplamKayitSayisi / goruntulenecekKayitSayisi;
        }
        else
        {
            toplamSayfaSayisi = toplamKayitSayisi / goruntulenecekKayitSayisi + 1;
        }

        //Toplam sayfa sayısı kadar ekrana sayfa numaralarını basıyoruz.
        adresEk = adresEk.Replace("&Sayfa="+sayfa,""); //yukarıda açıklamasını yapmıştık.

        for (int i = 1; i <= toplamSayfaSayisi; i++) //toplamSayfaSayisi kadar döngümüzü kurup, ekrana çıktıyı basıyoruz.
        {
            if (i == sayfa) //Eğer bulunduğumuz sayfadaysak bunu belirtiyoruz. Burda a tagını kaldırıp span kullanıyorumki tıklanamasın.
            {
                sayfalar.Text += "" + i + "";
            }
            else
            {
                sayfalar.Text += "" + i + "";
            }
        }

        ilkKayit = (sayfa * goruntulenecekKayitSayisi) - goruntulenecekKayitSayisi; // ilk kayıt için hesaplamamızı yapıyoruz.

        objDA.Fill(objDS, ilkKayit, goruntulenecekKayitSayisi, "TabloAdi");
        DataList1.DataSource = objDS.Tables[0].DefaultView;
        DataList1.DataBind();
        conn.Close();
        objDA.Dispose();
        objDS.Dispose();

        if (DataList1.Items.Count == 0) // Eğer kayıt yoksa uyarı veriyoruz.
        {
            kayitbulunamadi.Text = "Kayıt bulunamadı";
        }
    }
[/html]