Makale Özeti

ASP.NET 1.0 ve 1.1 ile geliştirdiğimiz web uygulamalarında sıkça kullandığımız bir kontrol olan "DataGrid", yerini daha geliştirilmiş olan "GridView" kontrolüne bıraktı. Aslına bakarsanız ASP.NET 2.0 "DataGrid" kontrolüne hala sahip ve ASP.NET 1.1 projelerinizde kullandığınız DataGrid kontrolüne de hala destek vermekte. ASP.NET 2.0'ın sahip olduğu DataGrid kontrolünde de bir takım gelişmeler var. Örneğin tema yapısına ve "AccessDataSource", "XmlDataSource" gibi yeni Data Source kontrollerine destek veriyor. AccessDataSource kullanarak veritabanınızdaki bilgilerinizi GridView, DataGrid, DetailsView, FormView, Repeater gibi kontroller üzerine göstermek, düzenlemek, silmek gibi işlemler için hemen hemen hiç kod yazmanıza gerek yok. Hatta az sonra örneğimizde de göreceğiniz üzere; hiç kod yazmanızı gerektirmeyecek senaryolar bile olabilir.

Makale


ASP.NET 2.0 - GridView ve AccessDataSource


Makalenin kapsadığı konular:
  1. GridView kontrolü
  2. AccessDataSource kontrolü
  3. İki kontrolün ortaklaşa kullanımı ile ilgili örnek




ASP.NET 1.0 ve 1.1 ile geliştirdiğimiz web uygulamalarında sıkça kullandığımız bir kontrol olan "DataGrid", yerini daha geliştirilmiş olan "GridView" kontrolüne bıraktı. Aslına bakarsanız ASP.NET 2.0 "DataGrid" kontrolüne hala sahip ve ASP.NET 1.1 projelerinizde kullandığınız DataGrid kontrolüne de hala destek vermekte. ASP.NET 2.0'ın sahip olduğu DataGrid kontrolünde de bir takım gelişmeler var. Örneğin tema yapısına ve "AccessDataSource", "XmlDataSource" gibi yeni Data Source kontrollerine destek veriyor.

Peki "GridView" kontrolünün "DataGrid" kontrolüne göre avantajları neler:

  • GridView kontrolü, DataGrid kontrolünün aksine, mobil tarayıcılar tarafından da gayet sağlıklı biçimde görüntülenebiliyor.
     
  • GridView kontrolüne, "Seç", "Düzenle", "Sil" gibi butonlar otomatik olarak ekletilebiliyor.
     
  • GridView kontrolü üzerinde, bir satırı güncellemek ve ya silmek için "hiç" kod yazmanız gerekmiyor.
     
  • GridView kontrolü üzerinde sıralama işlemi yapmak için "hiç" kod yazmanız gerekmiyor.
     

Bizi OLEDB ile bağlantı oluşturmak, SQL cümlelerini kodun içine yazmak gibi birçok dertten kurtaran bir kontrol: AccessDataSource.

AccessDataSource kullanarak veritabanınızdaki bilgilerinizi GridView, DataGrid, DetailsView, FormView, Repeater gibi kontroller üzerine göstermek, düzenlemek, silmek gibi işlemler için hemen hemen hiç kod yazmanıza gerek yok. Hatta az sonra örneğimizde de göreceğiniz üzere; hiç kod yazmanızı gerektirmeyecek senaryolar bile olabilir.

Peki teknik olarak AccessDataSource kontrolünü nasıl tanımlayabiliriz? Sanırım en uygun tanım "Access veritabanı (Access kullanılarak geliştirilmiş veritabanı katmanı diyerek genelleyebiliriz) ile iş katmanımız arasındaki iletişimi sağlayan .NET Framework 2.0 ile birlikte gelen yeni data kontrolüdür" olacaktır.



Şimdi bir örnek yapalım ve bu örneğimiz az sonra oluşturacağımız Access veritabanında bulunan "Kullanicilar" tablomuzdaki kayıtları düzenlememizi ve silmemizi sağlasın.


Öncelikle Access uygulamamızı açarak veritabanımızı, tablomuzu ve kolonlarını oluşturalım:



Oluşturmuş olduğumuz tabloyu "Kullanicilar" ismi ile kaydettim. Dikkat ettiyseniz "AutoNumber" alanının etrafını çizdim; çünkü kayıt düzenleme ve silme işlemlerimizde kullanacağımız "AccessDataSource" kontrolü (SqlDataSource kontrolü de aynı şekilde) düzenleme ve silme işlemleri için "Key" özelliğinde bir sütun istiyor.



Oluşturduğumuz veritabanını "Add Existing Item" seçeneği ile "App_Data" klasörümüze ekleyelim:





Sırasıyla GridView ve AccessDataSource kontrollerini ekleyip, ilgili özelliklerini verelim:



GridView kontrolünü sayfamıza sürüklediğimizde, "Smart Tag" ekranı otomatik olarak açılacaktır:



"Smart Tag" ekranında, "Choose Data Source" bölümünde, "New Data Source..." seçeneğini seçip, gerekli adımları izleyerek yeni bir AccessDataSource oluşturalım:


İlk ekranda bizden istenen "Data Source Type" olarak "Access Database" seçeneğini seçtim. Bu seçim, bizim için yeni bir "AccessDataSource" kontrolü oluşturacak. Ayrıca DataSource ID'si olarak da "dataSourceKullanicilar" yazdım:



İşlemimi onayladığımda, karşıma MDB dosyamın nerede olduğunu soran yeni bir ekran çıktı:



"Browse" butonuna tıkladığımda da, projemin içeriğini gösteren yeni bir ekran ile karşılaştım ve bu ekranda da projeme "db1.mdb" olarak eklediğim dosyayı seçtim:



İşlemi onayladığımda, yine MDB dosyamın nerede olduğunu soran ekrana geri döndüm ve dosya yolunun yazılı olduğunu gördüm:

Not: Dosya yolunda bulunan " ~ " işareti .NET Framework için projenin yolu ile eş anlamlıdır.



Şimdi bu ekrandaki işlemimizi de onaylayalım ve bir sonraki ekranımız olan "Select" cümlemizin seçileceği ekrana geçelim. "Select" cümlemizi yazacağımız ekran aşağıdaki gibi olacaktır:



Görmüş olduğunuz gibi Access veritabanımızdaki tablomuz, tablomuzun sahip olduğu alanlar gibi bilgiler otomatik olarak alındı. Şimdi tüm bilgileri çekecek olan "Select" cümlemizi oluşturalım:



Artık "Select" cümlemize sahibiz.

Not: Ekranda görünmekte olan " Return only unique rows " seçeneğini seçmeniz durumunda, Select cümlenizin içerisine "DISTINCT" kelimesi eklenir. Ayrıca "Order By..." butonuna tıklanarak sıralama işlemi ile ilgili bilgiler "Select" cümlesine eklenebilir ve "Where..." butonuna tıklanarak da "Select" cümlesi içerisinde yer alan "Where" ifadesi oluşturulabilir.

Şimdi yapmamız gereken "Düzenle" ve "Sil" cümlelerini oluşturmak. Bunun için ekranda görünen "Advanced" butonuna tıklayacağız ve karşımıza yeni bir ekran çıkacak:



Karşımıza 2 seçenek çıktı. Bunlardan ilki ekle, düzenle ve sil SQL cümlelerimizin oluşturulup oluşturulmayacağı. İkinci seçenek ilk seçeneği seçmediğiniz sürece aktif olmayan bir seçenektir. İkinci seçeneğin seçilmesi durumunda, AccessDataSource kontrolü düzenlemek istediğimiz satırın en son "Select" işleminden sonra başka birisi tarafından güncellenip güncellenmediğini kontrol eder ve güncelleme varsa kullanıcıyı uyarır. Makalede bu konuya ayrıntılı olarak girmeyeceğim.

Şimdi yalnızca ilk seçeneği işaretleyip "OK" butonuna basıyorum:



"Select" cümlemizi oluşturduğumuz ekrana geri döndük. Şimdi "Next" butonuna basıp bir sonraki ekranımız olan "Test" ekranına geçelim:



"Select" cümlemizi test etmek için "Test Query" butonuna basalım:



Sorgumuz hiçbir hata almadan çalıştı. Hiç kayıt olmadığı için hiç kayıt getirmemesi tabi ki normal.

"Finish" butonuna basarak işlemi sonlandıralım ve sayfamızı görelim:



Görmüş olduğunuz gibi, GridView kontrolümüz tablomuzdaki alanlara göre kolonlarına otomatik olarak sahip oldu, AccessDataSource kontrolümüz otomatik olarak oluşturuldu ve "Smart Tag" ekranına da yeni seçenekler geldi.

Şimdi sayfalama, sıralama, düzenleme ve silme işlemlerini, "Smart Tag" ekranındaki seçenekleri aşağıdaki gibi seçerek aktif hale getirelim:



GridView kontrolümüze yeniden baktığımızda; Sayfalama satırının eklendiğini, "Edit", "Delete" butonlarının otomatik olarak eklendiğini ve sütun başlıklarının otomatik olarak sıralama işlemlerini gerçekleştirecek linkler halini aldıklarını görürüz:



Sıra geldi İngilizce olarak oluşturulan butonlarımızı Türkçe olarak değiştirmeye. Bunun için "Smart Tag" ekranındaki "Edit Columns" seçeneğine tıklamamız gerekmekte:



Açılan ekranda "CommandField" sütununu seçelim:



Gerekli özellikleri değiştirelim:

Not: (Ben bu ekranda ButtonType özelliğini de "Link" değil, "Button" olarak değiştirdim. Bu nedenle GridView kontrolümüzdeki butonlar artık link şeklinde değil, buton şeklinde gözükecektir)

Not: Özelliklerin bulunduğu ekranda, aşağıda görmüş olduğunuz ekran görüntüsünde görünende daha fazla Türkçeleştirme seçeneği vardır. (NewText, InsertText, SelectText, vs.)



GridView kontrolümüze tekrar bakalım:



Artık butonlarımız Türkçe yazılara sahipler. Veritabanına birkaç kayıt atıp, sayfamızı çalıştırmamızın zamanı geldi. Öncelikle kayıtlarımızı ekleyelim:



Şimdi de sayfamızı açalım:



"Coskun" kullanıcısı üzerine düzenle işlemi yapmak için "Düzenle" butonuna tıklayalım:



Görmüş olduğunuz gibi ilgili satır "Düzenle" moduna geçti, sol tarafındaki butonlar "Kaydet" ve "İptal" olarak değişti, ayrıca "Key" olarak tanımladığımız "KullaniciID" harici alanlarda TextBox kontrolüne dönüştü.

Şimdi kayıt üzerinde birkaç değişiklik yapalım:



Kaydet butonuna basalım:

Not: Kaydetme işlemi sırasında "Operation must use an updatable query." şeklinde bir hata alırsanız, MDB dosyanıza "MakinaIsmi\ASPNET" kullanıcısının yazma hakkı olup olmadığını kontrol etmeli ve eğer hakkı yok ise bu hakkı tanımlamalısınız.



Kayıt işlemi başarıyla tamamlandı. Şimdi bir tane kayıt silelim. Ben 3 numaralı kaydı sileceğim. Sil butonuna bastım:



Ve artık 3 numaralı kaydımız yok. Bir de veritabanından bakalım:



Görmüş olduğunuz üzere kayıt veritabanında da görünmemekte.

Sıra geldi sıralama işlemlerine. Kayıtlarımız şu anda veritabanındaki sıralarında. Kayıtlarımızı "AdSoyad" alanına göre sıralamak için yapmamız gereken tek şey başlığına tıklamak:



Hiç kod yazmadan, sıralama işlemini gerçekleştirdik. Eğer tersten sıralama yapmak istersek de, "AdSoyad" alanının başlığına tekrar yazmamız yeterli:



Peki nasıl oldu da bu kadar işlemi hiç kod yazmadan yapabildik? SQL cümlelerimiz nerede saklanıyor? Parametreler nasıl gönderiliyor? Bu bilgilerin tamamı "AccessDataSource" kontrolü üzerine tutuldu. Visual Studio 2005 tarafından oluşturulan kodlar ise şu şekilde:

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
    AutoGenerateColumns="False" DataKeyNames="KullaniciID" DataSourceID="dataSourceKullanicilar">
    <Columns>
        <asp:CommandField ButtonType="Button" CancelText="İptal" DeleteText="Sil" EditText="Düzenle"
            InsertText="Kaydet" NewText="Yeni kayıt" ShowDeleteButton="True" ShowEditButton="True"
            UpdateText="Kaydet" />
        <asp:BoundField DataField="KullaniciID" HeaderText="KullaniciID" InsertVisible="False"
            ReadOnly="True" SortExpression="KullaniciID" />
        <asp:BoundField DataField="Kullanici" HeaderText="Kullanici" SortExpression="Kullanici" />
        <asp:BoundField DataField="Sifre" HeaderText="Sifre" SortExpression="Sifre" />
        <asp:BoundField DataField="AdSoyad" HeaderText="AdSoyad" SortExpression="AdSoyad" />
    </Columns>
    </asp:GridView>

    <asp:AccessDataSource ID="dataSourceKullanicilar" runat="server" DataFile="~/App_Data/db1.mdb"
        DeleteCommand="DELETE FROM [Kullanicilar] WHERE [KullaniciID] = ?"
        InsertCommand="INSERT INTO [Kullanicilar] ([KullaniciID], [Kullanici], [Sifre], [AdSoyad]) VALUES (?, ?, ?, ?)"
        SelectCommand="SELECT [KullaniciID], [Kullanici], [Sifre], [AdSoyad] FROM [Kullanicilar]"
        UpdateCommand="UPDATE [Kullanicilar] SET [Kullanici] = ?, [Sifre] = ?, [AdSoyad] = ? WHERE [KullaniciID] = ?">
        <DeleteParameters>
            <asp:Parameter Name="original_KullaniciID" Type="Int32" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:Parameter Name="Kullanici" Type="String" />
            <asp:Parameter Name="Sifre" Type="String" />
            <asp:Parameter Name="AdSoyad" Type="String" />
            <asp:Parameter Name="original_KullaniciID" Type="Int32" />
        </UpdateParameters>
        <InsertParameters>
            <asp:Parameter Name="KullaniciID" Type="Int32" />
            <asp:Parameter Name="Kullanici" Type="String" />
            <asp:Parameter Name="Sifre" Type="String" />
            <asp:Parameter Name="AdSoyad" Type="String" />
        </InsertParameters>
    </asp:AccessDataSource>



Düzenleme işlemini elimizle yazacağımızı varsayarak örnekleri "Update" işlemi üzerinden götüreceğim.

Öncelikli olarak "AccessDataSource" kontrolünün sahip olduğu "UpdateCommand" özelliğine gerekli SQL cümlesi yazılması gerekmektedir. Sonrasında parametrik olarak değişebilecek noktalara "?" (soru işareti) konulur. Örneğin:

UpdateCommand="UPDATE [Kullanicilar] SET [Kullanici] = ?, [Sifre] = ?, [AdSoyad] = ? WHERE [KullaniciID] = ?"

Bu UpdateCommand özelliğinde "Kullanici", "Sifre", "AdSoyad" ve "KullaniciID" değerleri parametriktir. Peki sadece "?" kullanılarak parametre belirtmek nasıl çalışır? İşte bu noktada çok dikkatli olmalısınız. Çünkü "?" kullanarak tanımladığınız parametreler, "UpdateParameters" içerisinde tanımlanan parametrelerin sırası ile aynı olmalı.

Mesela "Updatecommand" içerisindeki "?" ile tanımlanmış parametreler sırası ile: Kulanici, Sifre, AdSoyad ve KullaniciID'dir.
UpdateParameters içerisinde tanımlanan parametrelere bakarsak; onlar da sırası ile: Kullanici, Sifre, AdSoyad ve original_KullaniciID'dir.

Yani sıralar birbirini tutuyor. Peki neden "KullaniciID" değil de "original_KullaniciID"? Çünkü GridView kontrolünün sahip olduğu özelliklerden birisi olan "DataKeyNames" özelliğinde tanımlanan her alanın, "original_AlanIsmi" şeklinde ulaşılabilecek ve veritabanından yapılan "Select" işlemi sonrasında sahip olduğu orjinal değerini tutan bir parametresi var. Ne işe yarar? "KullaniciID" alanı bizim için "Key" özelliğindedir ve ziyaretçi tarafından değiştirilmemesini isteriz. İşte bu nedenle orjinal değerine hep sahip olmalıyız.

"original_" ön ekini değiştirmek isterseniz, AccessDataSource kontrolünün sahip olduğu "OldValuesParameterFormatString" özelliğini değiştirebilirsiniz.


Sonuç olarak;

ASP.NET 2.0 ile gelen GridView kontrolü, DataGrid kontrolünü hiç aratmayacak şekilde tasarlanmış. Hiç kod yazmadan sıralama, düzenleme ve silme işlemlerini yapabilmesi son derece mükemmel bir özellik. Bu noktada AccessDataSource ve örneklerde kullanılmamış olan SqlDataSource ve kendi yazabileceğiniz herhangi bir ObjectDataSource ile birlikte çalışma performansı ve uyumluluğu en üst seviyede.


Makale ile ilgili tüm soru ve sorunlarınızı http://sunali.com/blog/archive/2005/06/29/30.aspx adresinde yorum olarak sorabilirsiniz.

Coskun SUNALI
http://sunali.com