İçeriğe geç

Ay: Haziran 2003

DataGrid Web Kontrolu 4

Serinin 3. bölümünü hatirlarsaniz bir butona tiklama gibi bazi olaylari incelemistik. Mesela örnegimizde kullanici DataGrid’teki satirlardaki “Detay” butonuna tikladiginda o satirla ilgili ayrintili bilgiyi göstermistik.

Bu bölümde DataGrid içerisinde butonlari kullanarak son kullanicinin DataGrid’in içerigini siralamayi nasil yapabilecegini görecegiz.

DataGrid’i Siralama için Hazirlama

DataGrid’e siralama özelliginin katmanin nekadar basit oldugunu ögrendiginizde çok mutlu olacaksiniz. Bu özelligi 3 basamakta ögrenecegiz:

1. DataGrid’in AllowSorting özelligini True olarak ayarlayin. Eger DataGrid’in AutoGenerateColumns özelligi False olarak ayarlanmis ise, kullanicinin siralayabilecegi satirin BoundColumn kontrolünün SortExpression özelligini belirtmeniz gerekmektedir.

2. DataGrid’i siralanmis veri ile yeniden olusturacak bir event handler olusturun, ve DataGrid’in OnSortCommand olayinda bu siralama event handler ismini belirtin.

3. Veri kaynaginizda bulunan siralanmis formattaki veriyi yakalayacak bir fonksiyon olusturun.

Simdi bu adimlarin hepsine birden bakalim. Ilk adim, DataGrid’in AllowSorting özelligini asagidaki gibi belirleyelim:

<asp:DataGrid runat="server" id="dgAuthors"
AllowSorting="True"
… >

< /asp:DataGrid>

Eger AutoGenerateColumns özelligini True (varsayilan) olarak ayarladiysaniz 1. adimin tamamlamis oldunuz. (Hatirlatma; eger DataGrid’inizin AutoGenerateColumns özelligini True olarak ayarladiysaniz DataGrid’in kolonlari veri kaynagindan gelen kolonlar tarafindan belirlenir. Eger AutoGenerateColumns özelligini False olarak ayarladiysaniz, DataGrid içinde hangi kolonlarin gözükecegini BoundColumns özelligi ile belirtmeniz gerekmektedir. Bu konu için 2. bölüme bakiniz.) Eger herseye ragmen AutoGenerateColumns özelligini False olarak ayarladiysaniz, kullanicilara hangi kolon veya kolonlar için siralama izni vereceginizi belirlemeniz gerekir. Siralama izini vereceginiz bütün kolonlar için BoundColumn kontrolünün SortExpression özelligini eklemeniz gerekir. Dikkat etmeniz gereken SortExpression özelligine veritabaninizdaki kolon ismini atamaniz gerekir :

< asp:DataGrid runat="server" id="dgAuthors"
AutoGenerateColumns="False"
AllowSorting="True">
<Columns>
<asp:BoundColumn DataField="dbField" />
<asp:BoundColumn DataField="dbField2"
SortExpression="dbField2" />
</Columns>
< /asp:datagrid>

Yukaridaki örnekte DataGrid iki kolon içerir. Birinci kolon veritabanindaki dbField kolonunu digeri ise dbField2 kolonunu barindirir. Kolonlardan ikincisi siralanabilirken birincisi bunu yapamaz.

Siralama Event Handler’i olusturmak

AllowSorting özelligini true olarak ayarladigimiz DataGrid olusturulurken her bir kolonun baslik kisminda link eklenir. Bu linke tiklandigi zaman bir postback meydana gelir ve siralama olayi harekete geçer. Bu olay harekete geçtiginde gerekli veriyi saklayan, veriyi belirlenen sirayla DataGrid’e geri gönderen bir event handler’i atesleriz. Bu olayi gerçeklestirmek için iki seye ihtiyacimiz var: bir siralama event handler’i olusturmak ve bunu DataGrid’in siralama olayina baglamak.

Ilk olarak, event handler’i olusturdugunuz zaman asagidaki tanimlamayi kullanin:

Sub SortEventHandler(sender as Object, e as DataGridSortCommandEventArgs)

End Sub

(Tabiki sender ve e degiskenlerini istediginiz gibi isimlendirebilirsiniz –önemli olan kismi eventhandler’in iki degiskeni kabul edecegi: bir Object ve bir DataGridSortCommandEventArgs.)

Event handler’in içinde siralayacaginiz kolonun ismini e.SortExpression degiskeni ile alacaksiniz. Eger SortExpression özelligini BoundColumn özelliginde belirttiyseniz, e.SortExpression’un degeri SortExpression özelliginin degeridir. Eger SortExpression özelligini belirtmemisseniz (çünkü AutoGenerateColumns özelligini True olarak ayarlamissinizdir), e.SortExpression degeri kolon tiklandiginda gelen veritabani kolonu ismidir.

Birkere siralama event handler’i olusturdugunuzda bunu DataGrid’in siralama olayina baglamaniz gerekir, böylelikle ne zaman bu olay harekete geçerse buna bagli event handlerda ateslenir. Bunu yapabilmek için DataGrid’in OnSortCommand event handler’ina olusturdugunuz siralama event handler’inin ismini atamaniz gerekir:

< asp:DataGrid runat="server" id="id"
AllowSorting="True"
OnSortCommand="NameOfSortEventHandler">

< /asp:DataGrid>

Bu noktada bir kaç küçük örnek size yardimci olabilir. Ben bunlardan iki tanesini olusturdum, bir tanesi AutoGenerateColumns özelligi True olarak ayarlanmis olanini kullaniyor, digeri ise AutoGenerateColumns özelligi False olarak ayarlanmis olani kullaniyor. Her iki örnekte de AllowSorting özelligi True olarak ayarlanmis ve sadece bir label Web kontrolünün Text özelliginin degerini e.SortExpression’nin degerini atamaktan baska hiçbir sey yapmayan basit bir siralama event handler’ina sahip.

DataGrid’in bir server-side form içerisinde olduguna dikkat edin (<form runat="server"> … </form>)- bu postback yapilmasi için gerekli.

Geriye sadece, veriyi belirli bir siralanmis düzende geri alacak bir fonksiyon olusturmak kaliyor. Sadece yapmamiz gereken bu fonksiyonu çagirmak, SortExpression degiskenini bu fonksiyona göndermek ve sonucunu DataGrid’in DataSource’ na atayarak DataGrid’i yeniden yapilandirmak. Simdi bunlari yapalim.

Veriyi istenilen siralamada alan bir fonksiyon olusturalim

Gerçekte yapmaya çalistigimiz sey, siralama kosulunu gönderdigimiz zaman, geriye siralanmis düzende veri getiren ve bu veriyi direk olarak DataGrid içine aktaran veya DataReader nesnesini kullanarak DataGrid’in içine atan bazi fonksiyonlar olusturmak.
Bir dakikaligina BindData ile çagirabildiginiz ve siralama kosulunuda degisken olarak alan böyle bir fonksiyonumuzun oldugunu düsünün. Bu fonksiyon veriyi istediginiz sirada geri çeviriyor ve bunu DataGrid’in içine yerlestiriyor. Siralama kosulunu alan ve bu islemleri yapan fonksiyonu tek bir satirda asagidaki gibi oldugunu düsünün:

Sub SortData(sender as Object, e as DataGridSortCommandEventArgs)
BindData(e.SortExpression)
End Sub

Simdi tek sorunumuz böyle bir fonksiyonu olusturmak! Bu fonksiyonun ana kismi kullandiginiz veri kaynagina ve bunu nasil siralayicaginiza dayanir. Burada yapmamiz gereken SQL komutunu kullanmak ayni asagidaki gibi :

Sub BindData(sortExpr as String)
Dim dr As SQLDataReader
Dim conn As SqlConnection
Dim cmdAuthors As SqlCommand
'Pubs veritabanina bir baglanti kuruyoruz
conn = New SqlConnection("server=localhost;uid=sa;pwd=password;database=pubs")
conn.Open()
'Authors tablosundaki verileri içeren bir datareader olusturuyoruz’
cmdAuthors = New SqlCommand("SELECT au_lname, au_fname, phone, address, city, state, zip, contract FROM authors ORDER BY " & sortExpr,conn)

dr = cmdAuthors.ExecuteReader

'bind the first datagrid to dataset'
dgAuthors.DataSource = dr
dgAuthors.DataBind()
conn.Close()
End Sub

Dikkat ettiyseniz sortExp degiskenlerini SQL sorgusuna dinamik olarak ORDER BY ekinden sonra ekliyorum ve bunun siralamasinida yine gelen degisken ile belirliyecegiz. Mesela: au_id DESC gibi:

< asp:DataGrid runat="server" id="dgAuthors"
BackColor="#eeeeee" Width="85%"
HorizontalAlign="Center"
Font-Name="Verdana" CellPadding="4"
Font-Size="10pt" AutoGenerateColumns="False"
AllowSorting="True"
OnSortCommand="SortResults">
<HeaderStyle BackColor="Black" ForeColor="White" Font-Bold="True" HorizontalAlign="Center" />
<AlternatingItemStyle BackColor="White" />

<Columns>

<asp:BoundColumn DataField="au_fname" HeaderText="Isim" SortExpression="au_fname DESC"/>
<asp:BoundColumn DataField="au_lname" HeaderText="Soyad" />
<asp:BoundColumn DataField="address" HeaderText="Adres" />
<asp:BoundColumn DataField="zip" DataFormatString="{0:#,###}" HeaderText="Posta Kodu" ItemStyle-HorizontalAlign="Center" />
<asp:BoundColumn DataField="city" HeaderText="Sehir" SortExpression="city DESC"/>
<asp:BoundColumn DataField="contract" HeaderText="Contract" />
<asp:BoundColumn DataField="phone" HeaderText="Telefon" />

</Columns>
< /asp:datagrid>

Son olarak, DataGrid üzerindeki verileri sayfa ilk yüklendiginde varsayilan degerler üzerine siralanmasini istiyoruz. Ben bu siralamayi au_id azalan sekilde seçtim. Bunun için Page_Load event handler’inda BindData(“au_id DESC”)’i çagirmaliyiz, fakat bunu sadece ilk sayfa yüklendiginde yapmaliyiz.