DataGrid İle Sıralama (Sorting)
Önsöz
DataGrid hakkında şimdiye kadar gördüklerimiz bize, basitçe kullanımı ve görünümünün değiştirilmesi gibi temel konuları öğretti. Ardından bu kompleks kontrolün en can alıcı özelliklerinden birisi olan sayfalama desteğini gösterdi.
Ancak DataGrid kontrolü hakkında söylememiz gereken tüm sözler bunlar değildi. Söylediğim gibi, DataGrid çok kompleks bir kontroldür ve kendi bünyesinde çok sayıda özelliği bulundurur, kullanır. Neydi bunlar deyip kısaca yeniden bakarsak: Sayfalama (paging), sıralama (sorting), seçme (selecting), düzenleme (editing) şeklinde sıralayabiliriz. Bu sıralama, konulara değinme sıramı da oluşturmakta. Son makalenin konusu olan sayfalamanın ardından şimdi sıra sıralama konusuna geldi.
Herhangi bir web programlama dilini kullanarak büyük boyutlardaki veriyi veritabanından alıp tabloya dökenlerin, ve bu işi Türkiye gibi internet omurgasının zayıf olduğu bir yerde yapanların sıkıntısını çektikleri bir konudur sayfalama.. Büyük boyutlardaki veri sayfalara bölünüp gösterilir; ki zaten zayıf olan internet omurgasına bir tekme de biz atmayalım.
Giriş
Sıralama da sayfalama kadar kritik bir süreçtir. Ancak sayfalamanın aksine sıralamanın internet omurgası üzerinde olumlu bir etkisi olmaz. Sütun başlıkları (header) link yapılır. Bu linklere tıklandığında sıralama kriteri sayfaya geri gönderilir. Sayfa yeniden yüklenirken veriyi alıp tabloya dolduran rutin kriteri alır ve sql cümlesine yamar. Ortaya çıkan sql cümlesi ile veri daha farklı bir sıralama ile alınır ve tabloya doldurulur.
İşte ASP.NET 'in programcılar için en müjdeli haberlerinden birisi olan DataGrid 'in sıralama yapabilme kabiliyeti bu noktada imdada yetişir. DataGrid kontrolüne sıralama yapması gerektiği söylenir. Yaklaşık olarak 3-4 satırdan oluşan bir sub-rutin yazılır ve sayfaya dökülen tablonun sütun başlıklarına tıklanarak olayın zevki çıkarılır. DataGrid hiçbir şikayet etmeksizin sıralama işini başarıyla yapar.
Bu kadar lafdan sonra artık icraata geçelim. Kısa bir ön bilgi verip, örnek kodlarımızı incelemeye başlayalım. Sıralama işlemi yapması için DataGrid kontrolümüzün AllowSorting özelliğine True değeri verilir (AllowSorting = "True"). Herhangi bir sütun başlığına tıklanıldığında çalıştırılması istenen, biraz önce bahsettiğim 3-4 satırlık sub-rutinin ismi ise OnSortCommand özelliği ile belirtilir (OnSortCommand = "doSorting").
Sub doSorting(s As Object, e As DataGridSortCommandEventArgs)
bindDataGrid(e.sortExpression)
End Sub
Yukarda görülen sub, OnSortCommand özelliğinin değeri olarak verildiğinde, sıralama kriterini, veritabanına bağlantı gerçekleştirip veriyi alan ve DataGrid kontrolüne dolduran sub-rutine gönderir. Burada kullanacağımız doSorting isimli sub-rutin DataGridSortCommandEventArgs örneği olarak aldığı e 'nin SortExpression özelliği ile sıralama kriterini öğrenir ve bindDataGrid isimli sub-rutine gönderir.
Sub Page_Load(Source As Object, E As EventArgs)
If Not IsPostBack Then
bindDataGrid
End If
End Sub
Sub bindDataGrid(Optional kriter As String = "id")
Dim connstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("kisiler.mdb") + ""
Dim sql As String = "SELECT * FROM kisiler ORDER BY " + kriter + " ASC"
Dim conn As New OleDbConnection(connstr)
conn.Open()
Dim adapter As New OleDbDataAdapter(sql,conn)
Dim ds As New Dataset()
adapter.Fill(ds,"kisiler")
dataGrid1.DataSource = ds.Tables("kisiler")
dataGrid1.DataBind()
conn.Close()
End Sub
Sub doSorting(s As Object, e As DataGridSortCommandEventArgs)
bindDataGrid(e.sortExpression)
End Sub
AutoGenerateColumns="true"
AllowSorting="true"
OnSortCommand="doSorting"
Width="50%"
BorderWidth="1px" BorderStyle="Solid"
CellPadding="2" CellSpacing="0"
BorderColor="#C7C7C7"
Font-Name="Verdana" Font-Size="8pt">
Bu kısa ön bilgiden sonra sıralama işlemini yapacak olan sayfamızın tüm kodunu vermeyi uygun gördüm. Bu sayfada veritabanına bağlanıp veriyi sıralı bir şekilde alan, ve DataGrid kontrolüne dolduran sub-rutinimizde bir farklılık var. Bu işi yapacak olan bindDataGrid isimli sub-rutin opsiyonel bir parametre alıyor. Parametrenin opsiyonel olduğunu başına Optional anahtar kelimesini ekleyerek belirtiyoruz. Optional anahtar kelimesinden sonra bildiğimiz şekilde parametre olan değişkenin ismini ve türünü yazıyor ve ardından eşittir (=) işareti koyup varsayılan değerini veriyoruz. Böylece sayfa ilk yüklendiğinde varsayılan değer ile sıralama yapılıyor.
Sql cümlesindeki değişiklik ise, basitçe ORDER BY deyimi ile sınırlı kalıyor. ORDER BY " + kriter + " ASC ifadesiyle birlikte sıralama (ASC - Ascending - Artarak) gerçekleştiriliyor.
Sıfırdan sıralama sürecini gözden geçirelim. Sayfa ilk olarak yüklendiğinde Page_Load olayında IsPostBack kontrolünden geçip bindDataGrid sub-rutinini herhangi bir parametre olmaksızın çağırıyoruz. Yürürlüğe giren bindDataGrid sub-rutini parametre bulamayınca varsayılan değer olarak kriter değişkenine "id" değerini atıyor. Veritabanına bağlantıyı gerçekleştirip, veriyi sıralı bir şekilde alıyor ve dataGrid1 isimli kontrolümüze dolduruyor.
Sütun başlıklarından birisine tıklandığında ise OnSortCommand özelliği ile ismini belirttiğimiz doSorting sub-rutini çalıştırılıyor. Bu sub-rutin, BindDataGrid sub-rutinine sıralama kriterini parametre olarak gönderiyor. bindDataGrid sub-rutini parametre geldiğini görüp kriter değişkenine varsayılan değeri değil doSorting sub-rutininden gelen parametrenin değerini atıyor. Ve sıralama buna göre gerçekleştiriliyor.
ASC mi ? DESC mi?
DataGrid 'in sıralama özelliğini öğrendiğimize göre şimdi bunu biraz geliştirelim. Yukarıdaki koda göre sıralama "Ascending" yapılıyor. Yani A 'dan Z 'ye sıralanıyor. Şimdi yapacağımız değişiklikler ile kullanıcıya bunu tersine çevirebilme imkanı vereceğiz. Bunun için grup adı SortStyle olan iki adet RadioButton kontrolü kullanacağız. RadioButtonlardan "ASC" olanının Checked özelliğini True olarak belirleyeceğiz. Böylece varsayılan olarak sıralama "ASC" olacak.
Şimdi bindDataGrid sub-rutinine ekleyeceğimiz satırlara geldi. Öncelikle SortStyle isimli bir String değişken tanımlıyoruz. rbAsc isimli "Ascending" sıralama yapılması anlamına gelen RadioButton 'ın Checked değerini kontrol edip True ise "ASC" değerini, değilse "DESC" değerini SortStyle değişkenine atıyoruz. Sql cümlesindeki değişiklikten anladığınız gibi bu değişkeni sql cümlesinde kullanarak ASC veya DESC sıralamayı seçiyoruz.
Sub Page_Load(Source As Object, E As EventArgs)
If Not IsPostBack Then
bindDataGrid
End If
End Sub
Sub bindDataGrid(Optional kriter As String = "id")
Dim connstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("kisiler.mdb") + ""
Dim SortStyle As String
if rbAsc.Checked then
SortStyle = "ASC"
else
SortStyle = "DESC"
end if
Dim sql As String = "SELECT * FROM kisiler ORDER BY " + kriter + " " + SortStyle
Dim conn As New OleDbConnection(connstr)
conn.Open()
Dim adapter As New OleDbDataAdapter(sql,conn)
Dim ds As New Dataset()
adapter.Fill(ds,"kisiler")
dataGrid1.DataSource = ds.Tables("kisiler")
dataGrid1.DataBind()
conn.Close()
End Sub
Sub doSorting(s As Object, e As DataGridSortCommandEventArgs)
bindDataGrid(e.sortExpression)
End Sub
AutoGenerateColumns="true"
AllowSorting="true"
OnSortCommand="doSorting"
Width="50%"
BorderWidth="1px" BorderStyle="Solid"
CellPadding="2" CellSpacing="0"
BorderColor="#C7C7C7"
Font-Name="Verdana" Font-Size="8pt">
GroupName="rbSortStyle" Text="ASC" Checked="True"
Font-Name="Verdana" Font-Size="8pt"/>
GroupName="rbSortStyle" Text="DESC"
Font-Name="Verdana" Font-Size="8pt"/>
Netice
DataGrid 'in sıralama özelliğini daha farklı şekillerde kullanıp, uygulamalarınızı geliştirmek ve daha değişik özellikler kazandırmak size kalmış. İsterseniz Sıralama yönü seçimi için RadioButton yerine DropDownList veya daha başka bir kontrol kullanabilirsiniz. Ayrıca deneyenler görecektir; son örnek kod çalıştırıldığında ortaya çıkan tabloda, DESC seçeneğini seçtikten sonra "no" isimli sütun başlığına tıklarsanız sıralama değişmiyor. ASC iken yapılan sıralamanın aynısı DESC iken de oluşuyor. Basit bir örnek için bu konuyu araştırmaya gerek görmedim. Ama siz önemli işlerinizde kontrolün sağlam bir şekilde çalışıp çalışmadığını unutmayın. Görüşmek üzere..
