Bu makalemizde, Whidbey ile gelen yeni kontrollerden birisi olan DetailsView bileşeni ile, satır ekleme, silme ve güncelleme gibi işlemlerin nasıl yapıldığını incelemeye çalışacağız. Bununla birlikte öncesinde, DetailsView kontrolünü genel hatları ile kısaca araştıracağız. DetailsView kontrolü, ASP.NET 2.0’a eklenen yeni data-bound kontrollerinden birisidir. Bu kontrolün en büyük özelliği, çalışma zamanında sadece bir satır verinin gösterilmesini sağlamasıdır. Bu noktada GridView kontrolünden ayrılmasına rağmen, bir veri kümesi üzerinde navigasyon linkleri yardımıyla hareket edilmesine de izin verir. Konuyu daha iyi anlayabilmek için, bir önceki makalemizde yer alan Access veritabanımızı kullanacağımız bir örnek geliştireceğiz. Bu örneğimizde de, Access veri kaynağımıza bağlanmak ve Select, Insert, Update, Delete işlemlerini gerçekleştirebilmek amacıyla bir AccessDataSource bileşeni kullanacağız. Bu bileşenimizi aşağıdaki aspx kodları ile oluşturalım.

<asp:AccessDataSource ID="AccessDataSource1" Runat="server" DataFile="Data/veriler.mdb" SelectCommand="Select * From MailListesi" InsertCommand="Insert Into MailListesi (Ad,Soyad,Mail) Values (@Ad,@Soyad,@Mail)" UpdateCommand="Update MailListesi Set Ad=@Ad,Soyad=@Soyad,Mail=@Mail Where ID=@ID" DeleteCommand="Delete From MailListesi Where ID=@ID">
    <InsertParameters>
        <asp:Parameter Name="Ad"></asp:Parameter>
        <asp:Parameter Name="Soyad"></asp:Parameter>
        <asp:Parameter Name="Mail"></asp:Parameter>
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="Ad"></asp:Parameter>
        <asp:Parameter Name="Soyad"></asp:Parameter>
        <asp:Parameter Name="Mail"></asp:Parameter>
        <asp:Parameter Name="ID"></asp:Parameter>
    </UpdateParameters>
    <DeleteParameters>
        <asp:Parameter Name="ID"></asp:Parameter>
    </DeleteParameters>
</asp:AccessDataSource>

AccessDataSource kontrolümüz, bağlanacağı veri bileşeni üzerinde, Select, Update, Insert ve Delete işlemlerinin gerçekleştirilebilmesini sağlamak amacıyla, SelectCommand, InsertCommand, DeleteCommand ve UpdateCommand özelliklerini kullanmaktadır. Özellikle veri girişi, güncelleme ve silme işlemleri için kullanılan sorgular, parametreler içermektedir.

Bu parametreleri, hangi komut için kullanacak isek, o komuta ait parametre koleksiyonuna birer Parameter nesnesi olarak eklemeliyiz. Bu nedenle, InsertParameters, UpdateParameters ve DeleteParameters koleksiyonları kullanılmıştır. Bunun dışında, AccessDataSource kontrolümüzün, hangi access veritabanına bağlanacağını, DataFile özelliğine atadığımız dosya yol bilgisi ile belirliyoruz. Gelelim, DetailsView kontrolümüze. İlk aşamada bu kontrolümüzü aşağıdaki aspx kodları ile oluşturalım.

<asp:DetailsView ID="DetailsView1" Runat="server" DataSourceID="AccessDataSource1"
AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast" AutoGenerateInsertButton="True" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" Font-Names="Verdana" Font-Size="X-Small" DataKeyNames="ID">
</asp:DetailsView>

DetailsView kontrolümüzün, DataSourceID özelliğine atadığımız bileşen adı ile, hangi veri kaynağını ve SQL sorgularını kullanacağını belirliyoruz. AllowPaging özelliği, her ne kadar GridView’daki sayfalama özelliğini çağrıştırsa da burada sayfa numarası yerine, satır numaralarını temsil etmektedir. Yani n sayıda kaydı olan bir veri kümesi için, n adet sayfa numarası yer alacaktır. Çünkü DetailsView bileşeni, bir anda yalnız bir satırı ekranda göstermektedir. Bununla birlikte, sayfalama gösteriminin ne şekilde olacağını belirtmek amacıyla, PagerSettings-Mode özelliği kullanılmıştır. Burada verdiğimiz değer haricinde atayabileceğimiz diğer değerler de şunlardır.

mk90_1.gif

Şekil 1. PagerSettings-Mode değerleri.

AutoGenerateInsertButton özelliği bileşende satır ekleme için gerekli linklerin gösterilmesini sağlar. Benzer şekilde, AutoGenerateEditButton özelliği de düzenleme linklerinin gösterilmesini sağlar. Son olarak AutoGenerateDeleteButton özelliği de Delete linkinin gösterilmesini sağlamaktadır. Elbette bileşenimiz için kilit noktalardan birisi de, DataKeyNames özelliğine atanan field değeridir. Bu değer, önceki makalelerimizden de hatırlayacağınız gibi, Update ve Delete sorguları (hatta bazı durumlarda Select sorgusu) içinde kullanılacak primary key alanını ifade etmektedir. Nitekim, tek bir satır üzerinde yapılacak güncelleme ve silme işlemleri, o satırın benzersiz bir numara ile ifade edilebilmesi hâlinde başarıya ulaşacaktır. İşte bu noktada primary key alanları büyük önem kazanır. Sayfamızı bu hâliyle çalıştırdığımız takdirde aşağıdaki ekran görüntüsünü elde ederiz.

mk90_2.gif

Şekil 2. Uygulamanın çalışması sonucu.

Görüldüğü gibi, bir anda sayfada sadece tek bir satıra ait veriler görülmektedir. Veri kümesinin Select sorgusu ile elde edilen satırlar arasında gezebilmek için navigasyon linkleri kullanılır. Burada standart olarak bileşenimiz, Select sorgusuna göre tüm field’ları getirmiştir. Ancak dilersek sadece belirli field’ların kontrolümüzde görünmesini sağlayabiliriz. Nasıl ki, GridView kontrolünde bu iş için kullandığımız Columns koleksiyonu varsa, DetailsView bileşeninde de aynı işi yapan Fields koleksiyonu vardır. Elbette koleksiyon isminin Fields olması tesadüfi değildir. Nitekim, DetailsView bileşeni, satırlarını field bazında gösterir. Oysa GridView küme bazında ve sütunları esas alarak göstermektedir. Dolayısıyla bileşenimizin aspx kodlarını aşağıdaki gibi düzenleyerek sadece belirli field’ların görünmesini sağlayabiliriz.

<asp:DetailsView ID="DetailsView1" Runat="server" DataSourceID="AccessDataSource1"
AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast" AutoGenerateInsertButton="True" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" Font-Names="Verdana" Font-Size="X-Small" DataKeyNames="ID" AutoGenerateRows="false">
    <Fields> 
        <asp:BoundField DataField="Ad" HeaderText="Adı"></asp:BoundField>
        <asp:BoundField DataField="Soyad" HeaderText="Soyadı"></asp:BoundField>
        <asp:BoundField DataField="Mail" HeaderText="Mail Adresi"></asp:BoundField>
    </Fields>
</asp:DetailsView>

Bu haliyle sayfamızı açtığımızda, aşağıdaki ekran görüntüsünü elde ederiz. Dikkat edecek olursanız sadece Ad,Soyad ve Mail alanları görünmektedir.

mk90_3.gif

Şekil 3. Kendi belirlediğimiz alanların gösterilmesi.

Burada, AutoGenerateRows özelliğine dikkat etmenizi istiyorum. Bu özelliğe false değerini vermeseydik eğer, Select sorgusundan alınan tüm alanlar gösterilecek ve sonrada bizim belirlediğimiz alanlar ekrana gelecekti. Aşağıdaki şekilde görüldüğü gibi.

mk90_4.gif

Şekil 4. AutoGenerateRows özelliğine false değeri vermeseydik.

Artık bileşenimiz yardımıyla, satır ekleme, silme ve güncelleme işlemlerini kolayca gerçekleştirebiliriz. Son olarak, sayfamızın kodlarını aşağıdaki hâle getirerek sayfamızı ve en önemlisi DetailsView bileşenimizi biraz makyajlayalım.

<%@ Page Language="C#" CompileWith="Default.aspx.cs" ClassName="Default_aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:AccessDataSource ID="AccessDataSource1" Runat="server" DataFile="Data/veriler.mdb" SelectCommand="Select * From MailListesi" InsertCommand="Insert Into MailListesi (Ad,Soyad,Mail) Values (@Ad,@Soyad,@Mail)" UpdateCommand="Update MailListesi Set Ad=@Ad,Soyad=@Soyad,Mail=@Mail Where ID=@ID" DeleteCommand="Delete From MailListesi Where ID=@ID">
            <InsertParameters>
                <asp:Parameter Name="Ad"></asp:Parameter>
                <asp:Parameter Name="Soyad"></asp:Parameter>
                <asp:Parameter Name="Mail"></asp:Parameter>
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="Ad"></asp:Parameter>
                <asp:Parameter Name="Soyad"></asp:Parameter>
                <asp:Parameter Name="Mail"></asp:Parameter>
                <asp:Parameter Name="ID"></asp:Parameter>
            </UpdateParameters>
            <DeleteParameters>
                <asp:Parameter Name="ID"></asp:Parameter>
            </DeleteParameters>
        </asp:AccessDataSource><br />
        <span style="font-size: 24pt; color: #663333; font-family: Agency FB"><b>Mail Listesi<br />
        </b></span>
        <asp:DetailsView ID="DetailsView1" Runat="server" DataSourceID="AccessDataSource1"
AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast" AutoGenerateInsertButton="True" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" Font-Names="Verdana" Font-Size="X-Small" DataKeyNames="ID" CellPadding="4" BorderColor="#DEDFDE" GridLines="Vertical" BorderWidth="1px" ForeColor="Black" BackColor="White" AutoGenerateRows="False" BorderStyle="None"> 
            <FooterStyle BackColor="#CCCC99"></FooterStyle>
            <RowStyle BackColor="#F7F7DE"></RowStyle>
            <PagerStyle ForeColor="Black" HorizontalAlign="Right" BackColor="#F7F7DE"></PagerStyle>
            <Fields> 
                <asp:BoundField DataField="Ad" HeaderText="Adı"></asp:BoundField>
                <asp:BoundField DataField="Soyad" HeaderText="Soyadı"></asp:BoundField>
                <asp:BoundField DataField="Mail" HeaderText="Mail Adresi"></asp:BoundField>
            </Fields>
            <HeaderStyle ForeColor="White" Font-Bold="True" BackColor="#6B696B"></HeaderStyle>
            <EditRowStyle ForeColor="White" Font-Bold="True" BackColor="#CE5D5A"></EditRowStyle>
            <AlternatingRowStyle BackColor="White"></AlternatingRowStyle>
        </asp:DetailsView>
    </div>
    </form>
</body>
</html>

mk90_5.gif

mk90_6.gif

Şekil 5. DetailsView bileşenin makyajlanmış hali ve New linkine tıklandığında.

Örnek olarak, yeni bir satır girdiğimizde, bu satırın başarılı bir şekilde veri kaynağına eklendiğini görürüz. Örneğin, aşağıdaki kayıt bilgisini Insert linki ile eklediğimizi düşünelim.

mk90_7.gif

Şekil 6. Yeni satır verisi.

Insert linkine bastıktan sonra, tekrar son satıra gidersek, yeni satırımızın başarılı bir şekilde eklendiğini ve en önemlisi de, Access tablosundaki otomatik olarak artan ID değerinin başarılı bir şekilde oluşturulduğunu görürüz. Tekrar hatırlatmakta fayda var, burada yaptığımız veri girişi doğrudan tabloya da yansıtılacaktır.

mk90_8.gif

Şekil 7. Eklenen satır.

Böylece geldik bir makalemizin daha sonuna. Bir sonraki makalemizde görüşmek dileğiyle hepinize mutlu günler dilerim.