Makale Özeti

Bu makalede ASP.NET 2.0 ile birlikte gelen DetailsView kontrolünü ve bu kontrolün GridView kontrolü ile ortak kullanımı üzerine birtakım bilgiler edineceğiz. - Bölüm 3 -

Makale


ASP.NET 2.0 - DetailsView ve GridView - 3


Makalenin kapsadığı konular:
  1. DetailsView kontrolü
  2. DetailsView kontrolünün GridView kontrolüyle paralel şekilde kullanımı ile ilgili örnek

    Not: Bu makaledeki örnekler sırasında, ASP.NET 2.0 ile birlikte gelen yeni kontroller olan "GridView" ve "AccessDataSource" kontrolleri kullanılacaktır. Bu kontroller ile ilgili ayrıntılı bilgiyi, nasıl oluşturuldukları gibi konuları daha önce yazmış olduğum ASP.NET 2.0 - GridView ve AccessDataSource konulu makalede bulabilirsiniz. Bu makalede yeni birer GridView ve AccessDataSource kontrolleri oluşturulması aşaması takip edilecek fakat detaylarına girilmeyecektir.



Artık istemiş olduğumuz seçeneklere sahibiz. Bu seçenekleri aktif hale getirelim:



DetailsView kontrolümüze bir kez daha göz atalım:



DetailsView kontrolümüz "Edit", "Delete" ve "New" isminde yeni butonlara sahip oldu.

Şimdi bu butonlarımızı "Fields" ekranının yardımı ile Türkçe hale getirelim:



"Fields" ekranında bulunan "CommandField" alanının özellikleri arasında Türkçe hale getirebileceğiniz başka alanlar da bulunmaktadır ancak ekran görüntüsünün çok büyük olmaması amacıyla bunların tamamını gösteremiyorum:



Şimdi "OK" butonuna tıklayıp DetailsView kontrolümüze bakalım:



Artık tüm butonlarımız Türkçe.

Geriye sadece taslaklarımızı ayarlamak kaldı. Bizim için en önemli taslaklardan birisi "EmptyDataTemplate". Çünkü hiçbir kaydınız olmadığında görünecek olan tek kısım bu taslak. Malesef ki hiç kayıt döndürmeyen bir SQL cümlesi sonucu "Yeni" ismindeki butonumuz bile görünmez durumda olacak. Bizim yapmamız gereken ise, "CommandName" özelliği "New" olan bir butonu "EmptyDataTemplate" taslağına eklemek:







Yukarıdaki taslak için otomatik olarak hazırlanmış kod tam olarak şu şekildedir:

    <EmptyDataTemplate>
        Bu kişi için adres tanımı yapılmamıştır.<br />
        <asp:LinkButton ID="LinkButton1" runat="server" CommandName="New">Yeni adres tanımla</asp:LinkButton>
    </EmptyDataTemplate>

Şimdi işin kod kısmına girelim. Bilmemiz gereken ilk durum şudur: DetailsView kontrolümüz, GridView kontrolümüz üzerinde bir seçim yapılmış da olsa, yapılmamış da olsa gözükecektir. İlk önce bunu engelleyelim:

Bunun için ne yapabiliriz? Sayfamızın "ilk yüklenmesi" sırasında DetailsView kontrolümüzün "Visible" özelliğini "false" yapıp, kontrolümüzü görünmez yaparız.

Sayfamızda boş bir noktaya mouse ile çift tıklayarak sayfamızın "Load" event'ini oluşturalım:



Şimdi bu event içerisinde aşağıdaki kodu yazalım:



Peki DetailsView kontrolümüz ne zaman görünecek? Tabi ki sadece GridView kontrolümüz üzerinden yeni bir kişi seçilmesi durumunda.

Bunun için GridView kontrolünün "SelectedIndexChanged" event'inden faydalanacağız. Öncelikle "Events" ekranında, "SelectedIndexChanged" olayına mouse ile çift tıklayarak event'imizi oluşturalım:



Event'e çift tıklamamız sonucunda otomatik olarak aşağıdaki ekrana düşeceğiz:



Event'imizi oluşturduk. Peki bu event içerisinde ne yapacağız? Yapmamız gereken 2 işlem var. Öncelikle DetailsView kontrolünün daha önce hiç açılmamış olacağını düşünerek, yani GridView kontrolü üzerinde ilk kez seçme işlemi gerçekleştirildiğini düşünerek, DetailsView kontrolümüzün "Visible" özelliğini "true" yapmalıyız.

2. işlemimiz ise, DetailsView kontrolünün düzenleme ve ya yeni kayıt ekleme modunda olabileceği için bulunduğu modu DetailsView kontrolünün bulunduğu durumu değiştirmeye yarayan "ChangeMode" methodu yardımı ile "ReadOnly" durumuna çekmek.

Bunun için aşağıdaki kodu yazmamız gerekmekte:



Bu noktada belirtmek istediğim bir durum var. AccessDataSource kontrolünün oluşturulması aşamasında otomatik olarak oluşturulan "InsertCommand" özelliği "anahtar" olarak belirlediğimiz "AdresID" alanını da veritabanına göndermeye çalışacaktır. Bu durumda veritabanı tarafından gönderilen bir hata almanız mümkündür. Çünkü birçok veritabanı sisteminde "insert" işlemlerinin yapılacağı SQL cümlelerinde "key" olarak belirtilen alan gönderilmeden ekleme işlemi gerçekleştirilebilir.

Biz oluşturmuş olduğumuz kontrollerimizin çalışabilmesi için aşağıdaki 2 değişikliği yapmamız gerekmektedir:

  1. "adsAdresler" olarak tanımlamış olduğumuz AccessDataSource kontrolümüzün "InsertCommand" özelliği aşağıdaki gibidir:

    INSERT INTO [Adresler] ([AdresID], [KisiID], [Adres], [PostaKodu], [Sehir], [Ulke]) VALUES (?, ?, ?, ?, ?, ?)

    Bu özelliğin aşağıdaki gibi değiştirilip, "AdresID" özelliğinin gönderilmemesi sağlanmalıdır:

    INSERT INTO [Adresler] ([KisiID], [Adres], [PostaKodu], [Sehir], [Ulke]) VALUES (?, ?, ?, ?, ?)
     
  2. "adsAdresler" olarak tanımlamış olduğumuz AccessDataSource kontrolümüzün "InsertParameters" tanımlamaları aşağıdaki gibidir:

        <InsertParameters>
            <asp:Parameter Name="AdresID" Type="Int32" />
            <asp:Parameter Name="KisiID" Type="Int32" />
            <asp:Parameter Name="Adres" Type="String" />
            <asp:Parameter Name="PostaKodu" Type="Int32" />
            <asp:Parameter Name="Sehir" Type="String" />
            <asp:Parameter Name="Ulke" Type="String" />
        </InsertParameters>

    Bu tanımlamaların aşağıdaki gibi değiştirilip, "AdresID" isimli olan parametre gönderilmemelidir:

        <InsertParameters>
            <asp:Parameter Name="KisiID" Type="Int32" />
            <asp:Parameter Name="Adres" Type="String" />
            <asp:Parameter Name="PostaKodu" Type="Int32" />
            <asp:Parameter Name="Sehir" Type="String" />
            <asp:Parameter Name="Ulke" Type="String" />
        </InsertParameters>

    Ayrıca AccessDataSource oluşturma ekranlarında, ekleme işlemleri için kullanılacak parametrelerin değerlerini nereden alacağına dair bir seçim yapılamadığı için, bu kodun elle yazılması gerekmektedir. Bu işlem için "SelectParameters" tanımlarında tanımlanmış olan tanım kullanılarak "InsertParameters" ve "UpdateParameters" tanımları aşağıdaki gibi değiştirilmelidir:

        <InsertParameters>
            <asp:ControlParameter ControlID="gvKisiler" Name="KisiID" PropertyName="SelectedValue" Type="Int32" />
            <asp:Parameter Name="Adres" Type="String" />
            <asp:Parameter Name="PostaKodu" Type="Int32" />
            <asp:Parameter Name="Sehir" Type="String" />
            <asp:Parameter Name="Ulke" Type="String" />
        </InsertParameters>

        <UpdateParameters>
            <asp:ControlParameter ControlID="gvKisiler" Name="KisiID" PropertyName="SelectedValue" Type="Int32 />
            <asp:Parameter Name="Adres" Type="String" />
            <asp:Parameter Name="PostaKodu" Type="Int32" />
            <asp:Parameter Name="Sehir" Type="String" />
            <asp:Parameter Name="Ulke" Type="String" />
            <asp:Parameter Name="original_AdresID" Type="Int32" />
        </UpdateParameters>

     
Ben hazırlamış olduğumuz örnekte bu değişiklikleri yaptım. Şimdi geriye kalan tek şey yapmış olduğumuz örneği denemek.

İlk önce örneğimizi tarayıcıda çağırmak ile başlayalım:



"Coşkun SUNALI" isimli kayıdı seçelim:



"Yeni adres tanımla" butonuna tıklayalım:



Adresle ilgili bilgileri girip "Kaydet" butonuna tıklayalı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.



Şimdi "Coşkun SUNALI" isimli kayıt için, adres bilgilerinin altında bulunan "Yeni" butonuna tıklayarak yeni bir adres daha ekleyelim:





Dikkatinizi çektiyse, artık sayfalamaya ait rakamlar gözükmekte ve adresler bölümümüzde de ilk adresimiz gözüktü. 2. sayfaya geçelim:



Şimdi de 2. tanımladığımız adresi gördük. Bu sefer de "Rıdvan AKDEMİR" isimli kişiyi seçelim:



Bu kişiye yeni bir adres ekleyelim:





"Emrehan SEVER" isimli kişiyi seçelim:



Bu kişiye yeni bir adres ekleyelim:





Şimdi "Emrehan SEVER" isimli kişi için eklediğimiz adresi düzenleyelim. Bunun için adres bilgisi altında gözüken "Düzenle" butonuna tıklamamız yeterli:







En son düzenlediğimiz kaydı tekrar düzenlemek için "Düzenle" butonuna tekrar tıklayalım ve birkaç bilgiyi değiştirelim:



Şimdi ise "İptal" butonuna tıklayalım:



Adresimiz görmüş olduğunuz gibi değiştirilmedi ve işlem iptal edildi.

"Yasin UZUN" isimli kişiyi seçelim:



Bu kişiye yeni bir adres ekleyelim:





Şimdi "Yasin UZUN" isimli kişi için eklediğimiz adresi silelim. Bunun için adres bilgisi altında gözüken "Sil" butonuna tıklamamız yeterli:





"Yasin UZUN" isimli kişi için eklediğimiz adres başarıyla silindi.


Sonuç olarak;

ASP.NET 2.0 ile gelen DetailsView kontrolü sayesinde "Master-Detail" ilişkili, yani asıl kaydın alt kayıtları gibi düşünülebilecek ilişkilere sahip kayıtların düzenlenmesi, silinmesi, görüntülenmesi, eğer istenirse yeni kayıt ekleme işlemleri gibi işlemleri yapmak sadece birkaç satır kod yazarak mümkün.


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

Coskun SUNALI
http://sunali.com