Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış (C#)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide, ObjectDataSource'un Insert(), Update() ve Delete() yöntemlerini BLL sınıflarının yöntemleriyle eşlemenin yanı sıra veri değiştirme özellikleri sağlamak için GridView, DetailsView ve FormView denetimlerini yapılandırmayı öğreneceksiniz.

Giriş

Son birkaç öğreticide GridView, DetailsView ve FormView denetimlerini kullanarak bir ASP.NET sayfasında verilerin nasıl görüntüleneceğini inceledik. Bu denetimler yalnızca kendilerine sağlanan verilerle çalışır. Bu denetimler genellikle ObjectDataSource gibi bir veri kaynağı denetimi kullanarak verilere erişmektedir. ObjectDataSource'un ASP.NET sayfası ile temel alınan veriler arasında nasıl bir proxy işlevi gördüğünü gördük. GridView'un Select() verileri görüntülemesi gerektiğinde, ObjectDataSource yöntemini çağırır ve bu yöntem de uygun Veri Erişim Katmanı'nın (DAL) TableAdapter'ında bir yöntemi çağıran İş Mantığı Katmanımızdan (BLL) bir yöntem çağırır ve bu yöntem de Northwind veritabanına bir SELECT sorgu gönderir.

İlk öğreticimizde DAL'de TableAdapters'ı oluşturduğumuzda Visual Studio'nın temel alınan veritabanı tablosundan veri ekleme, güncelleştirme ve silme yöntemlerini otomatik olarak eklediğini hatırlayın. Ayrıca, İş Mantığı Katmanı Oluşturma bölümünde BLL'de bu veri değişikliği DAL yöntemlerini çağıran yöntemler tasarladık.

ObjectDataSource, yöntemine Select() ek olarak , Update()ve Delete() yöntemlerine de sahiptirInsert(). Select() yöntemi gibi bu üç yöntem de temel alınan nesnedeki yöntemlerle eşlenebilir. Veri eklemek, güncelleştirmek veya silmek için yapılandırıldığında GridView, DetailsView ve FormView denetimleri, temel alınan verileri değiştirmek için bir kullanıcı arabirimi sağlar. Bu kullanıcı arabirimi, ObjectDataSource'un , Update()ve Delete() yöntemlerini çağırır Insert()ve ardından temel alınan nesnenin ilişkili yöntemlerini çağırır (bkz. Şekil 1).

ObjectDataSource'un Insert(), Update() ve Delete() Yöntemleri BLL'ye Ara Sunucu işlevi görür

Şekil 1: ObjectDataSource'un , Update()ve Delete() Yöntemleri BLL'ye Insert()Ara Sunucu Görevi Görür (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu öğreticide, ObjectDataSource'un Insert(), Update()ve Delete() yöntemlerini BLL'deki sınıf yöntemleriyle eşlemenin yanı sıra veri değiştirme özellikleri sağlamak için GridView, DetailsView ve FormView denetimlerini yapılandırmayı öğreneceksiniz.

1. Adım: Ekleme, Güncelleştirme ve Silme Öğreticileri Web Sayfalarını Oluşturma

Verilerin nasıl eklendiğini, güncelleştirildiğini ve silindiğini keşfetmeye başlamadan önce, bu öğreticide ve sonraki birkaç projede ihtiyacımız olacak web sitesi projemizde ASP.NET sayfalarını oluşturmak için biraz zaman ayıralım. adlı EditInsertDeleteyeni bir klasör ekleyerek başlayın. Ardından, aşağıdaki ASP.NET sayfaları bu klasöre ekleyerek her sayfayı ana sayfayla ilişkilendirdiğinizden Site.master emin olun:

  • Default.aspx
  • Basics.aspx
  • DataModificationEvents.aspx
  • ErrorHandling.aspx
  • UIValidation.aspx
  • CustomizedUI.aspx
  • OptimisticConcurrency.aspx
  • ConfirmationOnDelete.aspx
  • UserLevelAccess.aspx

Veri Modification-Related Öğreticileri için ASP.NET Sayfaları Ekleme

Şekil 2: Veri Modification-Related Öğreticileri için ASP.NET Sayfaları Ekleme

Diğer klasörlerde olduğu gibi klasöründe Default.aspx de EditInsertDelete kendi bölümündeki öğreticiler listelenecektir. Kullanıcı Denetimi'nin SectionLevelTutorialListing.ascx bu işlevi sağladığını hatırlayın. Bu nedenle, bu Kullanıcı Denetimini Default.aspx Çözüm Gezgini sayfanın Tasarım görünümüne sürükleyerek öğesine ekleyin.

SectionLevelTutorialListing.ascx Kullanıcı Denetimini Default.aspx ekleme

Şekil 3: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascxDefault.aspx (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, sayfaları dosyaya Web.sitemap girdi olarak ekleyin. Özel olarak, Özelleştirilmiş Biçimlendirme'nin <siteMapNode>ardından aşağıdaki işaretlemeyi ekleyin:

<siteMapNode title="Editing, Inserting, and Deleting"
    url="~/EditInsertDelete/Default.aspx"
    description="Samples of Reports that Provide Editing, Inserting,
                  and Deleting Capabilities">
    <siteMapNode url="~/EditInsertDelete/Basics.aspx"
        title="Basics"
        description="Examines the basics of data modification with the
                      GridView, DetailsView, and FormView controls." />
    <siteMapNode url="~/EditInsertDelete/DataModificationEvents.aspx"
        title="Data Modification Events"
        description="Explores the events raised by the ObjectDataSource
                      pertinent to data modification." />
    <siteMapNode url="~/EditInsertDelete/ErrorHandling.aspx"
        title="Error Handling"
        description="Learn how to gracefully handle exceptions raised
                      during the data modification workflow." />
    <siteMapNode url="~/EditInsertDelete/UIValidation.aspx"
        title="Adding Data Entry Validation"
        description="Help prevent data entry errors by providing validation." />
    <siteMapNode url="~/EditInsertDelete/CustomizedUI.aspx"
        title="Customize the User Interface"
        description="Customize the editing and inserting user interfaces." />
    <siteMapNode url="~/EditInsertDelete/OptimisticConcurrency.aspx"
        title="Optimistic Concurrency"
        description="Learn how to help prevent simultaneous users from
                      overwritting one another s changes." />
    <siteMapNode url="~/EditInsertDelete/ConfirmationOnDelete.aspx"
        title="Confirm On Delete"
        description="Prompt a user for confirmation when deleting a record." />
    <siteMapNode url="~/EditInsertDelete/UserLevelAccess.aspx"
        title="Limit Capabilities Based on User"
        description="Learn how to limit the data modification functionality
                      based on the user role or permissions." />
</siteMapNode>

güncelleştirdikten Web.sitemapsonra, öğreticiler web sitesini bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın. Sol taraftaki menüde artık düzenleme, ekleme ve silme öğreticileri için öğeler bulunur.

Site Haritası Artık Düzenleme, Ekleme ve Silme Öğreticileri için Girdiler Içeriyor

Şekil 4: Site Haritası Artık Düzenleme, Ekleme ve Silme Öğreticileri için Girdiler Içeriyor

2. Adım: ObjectDataSource Denetimini Ekleme ve Yapılandırma

GridView, DetailsView ve FormView veri değiştirme özelliklerinde ve düzenlerinde farklılık gösterdiğinden, her birini tek tek inceleyelim. Ancak her denetimin kendi ObjectDataSource'unu kullanmasındansa, üç denetim örneğinin de paylaşabileceği tek bir ObjectDataSource oluşturalım.

Sayfayı Basics.aspx açın, Araç Kutusundan bir ObjectDataSource öğesini Tasarım Aracı sürükleyin ve akıllı etiketinden Veri Kaynağını Yapılandır bağlantısına tıklayın. ProductsBLL düzenleme, ekleme ve silme yöntemleri sağlayan tek BLL sınıfı olduğundan, ObjectDataSource'ı bu sınıfı kullanacak şekilde yapılandırın.

ObjectDataSource'ı ProductsBLL Sınıfını Kullanacak Şekilde Yapılandırma

Şekil 5: ObjectDataSource'ı Sınıfı Kullanacak ProductsBLL Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekranda, uygun sekmeyi seçip açılan listeden ProductsBLL yöntemini seçerek sınıfın hangi yöntemlerinin ObjectDataSource'un Select(), Insert(), Update()ve Delete() öğesine eşleneceğini belirtebiliriz. Şimdiye kadar tanıdık gelen Şekil 6, ObjectDataSource'un Select() yöntemini sınıfın GetProducts() yöntemiyle ProductsBLL eşler. Insert(), Update()ve Delete() yöntemleri, en üstteki listeden uygun sekme seçilerek yapılandırılabilir.

ObjectDataSource'un Tüm Ürünleri Döndürmesini

Şekil 6: ObjectDataSource'un Tüm Ürünleri Döndürmesini Sağlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 7, 8 ve 9'da ObjectDataSource'un UPDATE, INSERT ve DELETE sekmeleri gösterilir. , ve Update()yöntemlerinin sırasıyla sınıfın Insert()UpdateProductProductsBLL , AddProductve DeleteProduct yöntemlerini çağırması için bu sekmeleri yapılandırın.Delete()

ObjectDataSource'un Update() Yöntemini ProductBLL Sınıfının UpdateProduct Yöntemiyle Eşleme

Şekil 7: ObjectDataSource'un Update() Yöntemini Sınıfın UpdateProduct Yöntemiyle ProductBLL Eşleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource'un Insert() Yöntemini ProductBLL Sınıfının AddProduct Yöntemiyle Eşleme

Şekil 8: ObjectDataSource'un Insert() Yöntemini Sınıfın Ekleme Product Yöntemiyle ProductBLL Eşleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource'un Delete() Yöntemini ProductBLL Sınıfının DeleteProduct Yöntemiyle Eşleme

Şekil 9: ObjectDataSource Delete() Yöntemini Sınıfın DeleteProduct Yöntemiyle ProductBLL Eşleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

UPDATE, INSERT ve DELETE sekmelerindeki açılan listelerde bu yöntemlerin zaten seçili olduğunu fark etmiş olabilirsiniz. Bu, yöntemlerini süsleyen kullanımımız DataObjectMethodAttribute sayesindedir ProductsBLL. Örneğin, DeleteProduct yöntemi aşağıdaki imzaya sahiptir:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Delete, true)]
public bool DeleteProduct(int productID)
{
    ...
}

DataObjectMethodAttribute özniteliği, her yöntemin amacını, seçme, ekleme, güncelleştirme veya silme amaçlı olup olmadığını ve varsayılan değer olup olmadığını gösterir. BLL sınıflarınızı oluştururken bu öznitelikleri atlarsanız, UPDATE, INSERT ve DELETE sekmelerinden yöntemleri el ile seçmeniz gerekir.

Uygun ProductsBLL yöntemlerin ObjectDataSource'un Insert(), Update()ve Delete() yöntemleriyle eşlendiğinden emin olduktan sonra, sihirbazı tamamlamak için Son'a tıklayın.

ObjectDataSource İşaretlemeyi inceleme

ObjectDataSource'ı sihirbazı aracılığıyla yapılandırdıktan sonra, oluşturulan bildirim temelli işaretlemeyi incelemek için Kaynak görünümüne gidin. etiketi, <asp:ObjectDataSource> temel alınan nesneyi ve çağrılacak yöntemleri belirtir. Ayrıca, DeleteParameterssınıfın AddProduct, UpdateParametersve InsertParameters yöntemlerinin giriş parametreleriyle ProductsBLL eşlenebilen , UpdateProductve DeleteProduct vardır:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    DeleteMethod="DeleteProduct" InsertMethod="AddProduct"
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts"
    TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
    <DeleteParameters>
        <asp:Parameter Name="productID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
    </InsertParameters>
</asp:ObjectDataSource>

ObjectDataSource, ilişkili yöntemleri için giriş parametrelerinin her biri için bir parametre içerir. Örneğin, ObjectDataSource bir giriş parametresi (gibi) bekleyen bir seçme yöntemini çağıracak şekilde yapılandırıldığında s listesinin SelectParameter mevcut olması gibi GetProductsByCategoryID(categoryID). Kısa bir süre sonra göreceğimiz gibi, objectDataSource'un , veya yöntemini çağırmadan önce bu DeleteParameters, UpdateParametersve değerleri GridView, DetailsView ve FormView tarafından otomatik olarak ayarlanır.Delete()Update()InsertParametersInsert() Bu değerler, gelecek bir öğreticide ele alacağımız gibi gerektiğinde program aracılığıyla da ayarlanabilir.

ObjectDataSource'a yapılandırmak için sihirbazı kullanmanın bir yan etkisi, Visual Studio'nun OldValuesParameterFormatString özelliğini olarak original_{0}ayarlamasıdır. Bu özellik değeri, düzenlenmekte olan verilerin özgün değerlerini eklemek için kullanılır ve iki senaryoda yararlıdır:

  • Bir kaydı düzenlerken kullanıcılar birincil anahtar değerini değiştirebilir. Bu durumda, özgün birincil anahtar değerine sahip kaydın bulunabilmesi ve değerinin uygun şekilde güncelleştirilmesi için hem yeni birincil anahtar değeri hem de özgün birincil anahtar değeri sağlanmalıdır.
  • İyimser eşzamanlılık kullanılırken. İyimser eşzamanlılık, aynı anda iki kullanıcının bir diğerinin değişikliklerinin üzerine yazmamasını sağlayan bir tekniktir ve gelecekteki bir öğreticinin konusudur.

özelliği, OldValuesParameterFormatString temel alınan nesnenin güncelleştirme ve silme yöntemlerindeki giriş parametrelerinin adını gösterir. İyimser eşzamanlılığı incelediğimizde bu özelliği ve amacını daha ayrıntılı olarak ele alacağız. Bunu şimdi getiriyorum, ancak BLL'mizin yöntemleri özgün değerleri beklemiyor ve bu nedenle bu özelliği kaldırmamız önemli. Özellik ayarının OldValuesParameterFormatString varsayılan ({0}) dışında bir değere ayarlanması, bir veri Web denetimi ObjectDataSource'un Update() veya Delete() yöntemlerini çağırmaya çalıştığında hataya neden olur çünkü ObjectDataSource hem veya hem de UpdateParametersDeleteParameters belirtilen özgün değer parametrelerini geçirmeye çalışır.

Bu noktada bu çok açık değilse endişelenmeyin, bu özelliği ve yardımcı programını gelecek bir öğreticide inceleyeceğiz. Şimdilik, bu özellik bildirimini bildirim temelli söz diziminden tamamen kaldırdığınızdan veya değeri varsayılan değere ({0}) ayarladığınızdan emin olun.

Not

Özellik değerini Tasarım görünümündeki OldValuesParameterFormatString Özellikler penceresi temizlerseniz, özellik bildirim temelli söz diziminde yine de bulunur, ancak boş bir dizeye ayarlanır. Bu, ne yazık ki yukarıda açıklanan aynı sorunla sonuçlanır. Bu nedenle, özelliği bildirim temelli söz diziminden tamamen kaldırın veya Özellikler penceresi değerini varsayılan {0}değerine ayarlayın.

3. Adım: Veri Web Denetimi Ekleme ve Veri Değişikliği için Yapılandırma

ObjectDataSource sayfaya eklenip yapılandırıldıktan sonra, hem verileri görüntülemek hem de son kullanıcının değiştirmesi için bir araç sağlamak için sayfaya veri Web denetimleri eklemeye hazırız. Bu veri Web denetimleri veri değiştirme özelliklerinde ve yapılandırmasında farklılık gösterdiğinden GridView, DetailsView ve FormView'a ayrı ayrı bakacağız.

Bu makalenin geri kalanında göreceğimiz gibi GridView, DetailsView ve FormView denetimleri aracılığıyla çok temel düzenleme, ekleme ve silme desteği eklemek, birkaç onay kutusunu denetlemek kadar kolaydır. Gerçek dünyada, bu tür işlevlerin sağlanmasını yalnızca işaret ve tıklamaktan daha karmaşık hale getiren birçok incelik ve uç durum vardır. Ancak bu öğretici yalnızca basit veri değiştirme özelliklerini kanıtlamaya odaklanır. Gelecekteki öğreticiler, şüphesiz gerçek bir ortamda ortaya çıkacak endişeleri inceleyecektir.

GridView'dan Veri Silme

İlk olarak Araç Kutusu'ndan bir GridView'ı Tasarım Aracı sürükleyin. Ardından, GridView'un akıllı etiketindeki açılan listeden seçerek ObjectDataSource'ı GridView'a bağlayın. Bu noktada GridView'un bildirim temelli işaretlemesi şöyle olacaktır:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False"
            ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName"
            SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
           SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
           SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit"
           HeaderText="QuantityPerUnit"
           SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
           SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
           HeaderText="UnitsInStock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
           HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel"
           HeaderText="ReorderLevel" SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
        <asp:BoundField DataField="CategoryName"
           HeaderText="CategoryName" ReadOnly="True"
            SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
            HeaderText="SupplierName" ReadOnly="True"
            SortExpression="SupplierName" />
    </Columns>
</asp:GridView>

GridView'ı akıllı etiketi aracılığıyla ObjectDataSource'a bağlamanın iki avantajı vardır:

  • BoundFields ve CheckBoxFields, ObjectDataSource tarafından döndürülen alanların her biri için otomatik olarak oluşturulur. Ayrıca BoundField ve CheckBoxField özellikleri, temel alanın meta verilerine göre ayarlanır. Örneğin, ProductID, CategoryNameve SupplierName alanları içinde ProductsDataTable salt okunur olarak işaretlenir ve bu nedenle düzenleme sırasında güncelleştirilebilir olmamalıdır. Buna uyum sağlamak için, bu BoundFields'ın ReadOnly özellikleri olarak trueayarlanır.
  • DataKeyNames özelliği, temel alınan nesnenin birincil anahtar alanlarına atanır. Bu özellik, her kaydı benzersiz olarak tanımlayan alanı (veya alan kümesini) gösterdiğinden, verileri düzenlemek veya silmek için GridView kullanılırken bu temel öneme sahiptir. özelliği hakkında DataKeyNames daha fazla bilgi için Details DetailView ile Seçilebilir Ana GridView Kullanma Ana/Ayrıntı öğreticisine geri bakın.

GridView, Özellikler penceresi veya bildirim temelli söz dizimi aracılığıyla ObjectDataSource'a bağlanabildiğinden, bunu yapmak için uygun BoundField ve DataKeyNames işaretlemeyi el ile eklemeniz gerekir.

GridView denetimi, satır düzeyi düzenleme ve silme için yerleşik destek sağlar. GridView'ı silmeyi destekleyecek şekilde yapılandırmak, Sil düğmelerinden oluşan bir sütun ekler. Son kullanıcı belirli bir satır için Sil düğmesine tıkladığında bir geri gönderme başlatılır ve GridView aşağıdaki adımları gerçekleştirir:

  1. ObjectDataSource'un DeleteParameters değerleri atanır
  2. ObjectDataSource'un Delete() yöntemi çağrılır ve belirtilen kayıt silinir
  3. GridView, yöntemini çağırarak objectDataSource'a yeniden bağlanır Select()

öğesine DeleteParameters atanan değerler, Sil düğmesine tıklanan satırın alanlarının değerleridir DataKeyNames . Bu nedenle GridView DataKeyNames özelliğinin doğru ayarlanması çok önemlidir. Eksikse, DeleteParameters 1. Adımda değerine bir null değer atanır ve bu da 2. Adımda silinen kayıtlara neden olmaz.

Not

Koleksiyon DataKeys GridView denetim durumunda depolanır; başka bir DataKeys deyişle GridView görünüm durumu devre dışı bırakılmış olsa bile değerler geri göndermede hatırlanır. Ancak, düzenlemeyi veya silmeyi destekleyen GridView'lar için görünüm durumunun etkin kalması çok önemlidir (varsayılan davranış). GridView s EnableViewState özelliğini olarak falseayarlarsanız, düzenleme ve silme davranışı tek bir kullanıcı için düzgün çalışır, ancak verileri silecek eşzamanlı kullanıcılar varsa, bu eşzamanlı kullanıcıların istemedikleri kayıtları yanlışlıkla silme veya düzenleme olasılığı vardır.

Aynı uyarı DetailsViews ve FormViews için de geçerlidir.

GridView'a silme özellikleri eklemek için akıllı etiketine gidip Silmeyi Etkinleştir onay kutusunu işaretlemeniz yeterlidir.

Silmeyi Etkinleştir Onay Kutusunu işaretleyin

Şekil 10: Silmeyi Etkinleştir Onay Kutusunu işaretleyin

Akıllı etiketten Silmeyi Etkinleştir onay kutusunun işaretlenmesi GridView'a bir CommandField ekler. CommandField, GridView'daki bir sütunu şu görevlerden birini veya daha fazlasını gerçekleştirmek için düğmelerle işler: kayıt seçme, kaydı düzenleme ve kaydı silme. Daha önce Master /Detail Using a Selectable Master GridView with a Details DetailView öğreticisindeki kayıtları seçerken CommandField'ı uygulamada görmüştük.

CommandField, CommandField'de hangi düğme serisinin görüntülendiğini gösteren bir dizi ShowXButton özellik içerir. Özelliği GridView'ın Columns koleksiyonuna eklenmiş bir ShowDeleteButtontrue CommandField Silmeyi Etkinleştir onay kutusunu işaretleyerek.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        ... BoundFields removed for brevity ...
    </Columns>
</asp:GridView>

Bu noktada ister inanın ister inanmayın, GridView'a silme desteği ekleme işleminiz bitti! Şekil 11'de gösterildiği gibi, bu sayfayı tarayıcı üzerinden ziyaret ederken Sil düğmelerinin bulunduğu bir sütun bulunur.

CommandField, Sil Düğmelerinden Oluşan Bir Sütun Ekler

Şekil 11: CommandField Silme Düğmeleri Sütunu Ekler (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu öğreticiyi baştan sona kendiniz oluşturuyorsanız, bu sayfayı test ederken Sil düğmesine tıkladığınızda bir özel durum oluşur. Bu özel durumların neden tetiklendiğini ve bunların nasıl düzeltileceğini öğrenmek için okumaya devam edin.

Not

Bu öğreticiye eşlik eden indirmeyi kullanarak takip ediyorsanız, bu sorunlar zaten hesaba eklenmiş demektir. Ancak, ortaya çıkabilecek sorunları ve uygun geçici çözümleri belirlemenize yardımcı olmak için aşağıda listelenen ayrıntıları okumanızı tavsiye ederim.

Bir ürünü silmeye çalışırken, iletisi "ObjectDataSource 'ObjectDataSource1' parametresi olan genel olmayan bir 'DeleteProduct' yöntemini bulamadıysa, productID, original_ProductID" iletisine benzeyen bir özel durum alırsanız, büyük olasılıkla objectDataSource'tan özelliği kaldırmayı OldValuesParameterFormatString unutmuşsunuzdur. OldValuesParameterFormatString özelliği belirtildiğinde, ObjectDataSource yöntemine hem hem original_ProductID de productID giriş parametrelerini geçirmeye DeleteProduct çalışır. DeleteProductancak, yalnızca tek bir giriş parametresi kabul eder, bu nedenle özel durum. özelliği kaldırılarak OldValuesParameterFormatString (veya olarak ayarlanır {0}), ObjectDataSource'a özgün giriş parametresini geçirmeye çalışmamasını ister.

OldValuesParameterFormatString Özelliğinin Temizlendiğinden Emin Olun

Şekil 12: Özelliğin Temizlendiğinden OldValuesParameterFormatString Emin Olun (tam boyutlu görüntüyü görüntülemek için tıklayın)

Özelliğini kaldırmış OldValuesParameterFormatString olsanız bile şu iletiyi içeren bir ürünü silmeye çalışırken bir özel durumla karşılaşırsınız: "DELETE deyimi 'FK_Order_Details_Products' REFERENCE kısıtlamasıyla çakıştı." Northwind veritabanı ve Products tablosu arasında Order Details yabancı anahtar kısıtlaması içerir; başka bir deyişle, tabloda bir veya daha fazla kayıt Order Details varsa ürün sistemden silinemez. Northwind veritabanındaki her üründe Order Detailsen az bir kayıt bulunduğundan, ürünün ilişkili sipariş ayrıntıları kayıtlarını silene kadar hiçbir ürünü silemeziz.

Yabancı Anahtar Kısıtlaması Ürünlerin Silinmesini Yasaklar

Şekil 13: Yabancı Anahtar Kısıtlaması Ürünlerin Silinmesini Yasaklar (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Öğreticimizde, tablodaki tüm kayıtları Order Details silelim. Gerçek bir uygulamada aşağıdakilerden birini yapmamız gerekir:

  • Sipariş ayrıntıları bilgilerini yönetmek için başka bir ekran açın
  • DeleteProduct Belirtilen ürünün sipariş ayrıntılarını silmek için yöntemini mantık içerecek şekilde artırma
  • TableAdapter tarafından kullanılan SQL sorgusunu, belirtilen ürünün sipariş ayrıntılarının silinmesini içerecek şekilde değiştirin

Yabancı anahtar kısıtlamasını aşmak için tablodaki Order Details tüm kayıtları silelim. Visual Studio'da Sunucu Gezgini'ne gidin, düğüme NORTHWND.MDF sağ tıklayın ve Yeni Sorgu'yu seçin. Ardından sorgu penceresinde aşağıdaki SQL deyimini çalıştırın: DELETE FROM [Order Details]

Sipariş Ayrıntıları Tablosundaki Tüm Kayıtları Sil

Şekil 14: Tablodan Order Details Tüm Kayıtları Silme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Tabloyu temizledikten Order Details sonra Sil düğmesine tıkladığınızda ürün hatasız olarak silinir. Sil düğmesine tıklandığında ürün silinmezse GridView DataKeyNames özelliğinin birincil anahtar alanına (ProductID ) ayarlandığından emin olun.

Not

Sil düğmesine tıklandığında bir geri gönderme yapılır ve kayıt silinir. Yanlış satırın Sil düğmesine yanlışlıkla tıklamak kolay olduğundan bu tehlikeli olabilir. Gelecekteki bir öğreticide, kaydı silerken istemci tarafı onayı eklemeyi göreceğiz.

GridView ile Verileri Düzenleme

GridView denetimi, silme işleminin yanı sıra yerleşik satır düzeyi düzenleme desteği de sağlar. GridView'un düzenlemeyi destekleyecek şekilde yapılandırılması, Düzenle düğmelerinin bir sütununu ekler. Son kullanıcının bakış açısından, bir satırın Düzenle düğmesine tıklanması bu satırın düzenlenebilir hale gelmesine neden olur, hücreleri var olan değerleri içeren metin kutularına dönüştürür ve Düzenle düğmesini Güncelleştir ve İptal düğmeleriyle değiştirir. Son kullanıcı, istediği değişiklikleri yaptıktan sonra değişiklikleri kaydetmek için Güncelleştir düğmesine veya iptal etmek için İptal düğmesine tıklayabilir. Her iki durumda da Güncelleştir veya İptal Et'e tıkladıktan sonra GridView, düzenleme öncesi durumuna döner.

Sayfa geliştiricisi olarak bizim bakış açımızdan, son kullanıcı belirli bir satır için Düzenle düğmesine tıkladığında bir geri gönderme başlatılır ve GridView aşağıdaki adımları gerçekleştirir:

  1. GridView'un EditItemIndex özelliği, Düzenle düğmesine tıklanan satırın dizinine atanır
  2. GridView, yöntemini çağırarak objectDataSource'a yeniden bağlanır Select()
  3. ile eşleşen EditItemIndex satır dizini "düzenleme modunda" işlenir. Bu modda, Düzenle düğmesi Güncelleştir ve İptal düğmeleriyle değiştirilir ve özellikleri False (varsayılan) olan ReadOnly BoundField'ler, özellikleri veri alanlarının değerlerine atanan TextBox Web denetimleri Text olarak işlenir.

Bu noktada işaretleme tarayıcıya döndürülür ve son kullanıcının satır verilerinde herhangi bir değişiklik yapmasına olanak tanır. Kullanıcı Güncelleştir düğmesine tıkladığında bir geri gönderme gerçekleşir ve GridView aşağıdaki adımları gerçekleştirir:

  1. ObjectDataSource'un UpdateParameters değerleri, son kullanıcı tarafından GridView'ın düzenleme arabirimine girilen değerlere atanır
  2. Belirtilen kayıt güncelleştirilerek ObjectDataSource'un Update() yöntemi çağrılır
  3. GridView, yöntemini çağırarak objectDataSource'a yeniden bağlanır Select()

1. Adımda öğesine UpdateParameters atanan birincil anahtar değerleri özelliğinde DataKeyNames belirtilen değerlerden, birincil olmayan anahtar değerleri ise düzenlenen satırın TextBox Web denetimlerindeki metinden gelir. Silmede olduğu gibi GridView özelliğinin DataKeyNames doğru ayarlanması çok önemlidir. Eksikse, UpdateParameters birincil anahtar değerine 1. Adımda bir null değer atanır ve bu da 2. Adımda güncelleştirilmiş kayıtlara neden olmaz.

Düzenleme işlevi, GridView'un akıllı etiketindeki Düzenlemeyi Etkinleştir onay kutusu işaretlenerek etkinleştirilebilir.

Düzenlemeyi Etkinleştir Onay Kutusunu işaretleyin

Şekil 15: Düzenlemeyi Etkinleştir Onay Kutusunu işaretleyin

Düzenlemeyi Etkinleştir onay kutusunun işaretlenmesi bir CommandField ekler (gerekirse) ve özelliğini olarak trueayarlarShowEditButton. Daha önce gördüğümüz gibi CommandField, CommandField'de hangi düğme serisinin görüntülendiğini gösteren bir dizi ShowXButton özellik içerir. Düzenlemeyi Etkinleştir onay kutusunun işaretlenmesi özelliği mevcut CommandField'e ekler ShowEditButton :

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" />
        ... BoundFields removed for brevity ...
    </Columns>
</asp:GridView>

Temel düzenleme desteği eklemek için tek gereken bu. Şekil16'da gösterildiği gibi düzenleme arabirimi, özelliği (varsayılan) olarak ayarlanmış false her BoundField'ın ReadOnly textBox olarak işlenmesini sağlar. Bu, diğer tabloların anahtarları olan ve SupplierIDgibi CategoryID alanları içerir.

Chai'nin Düzenle Düğmesine Tıklanması Satırı Düzenleme Modunda Görüntüler

Şekil 16: Chai'nin Düzenle Düğmesine Tıklanması Satırı Düzenleme Modunda Görüntüler (Tam boyutlu resmi görüntülemek için tıklayın)

Kullanıcılardan yabancı anahtar değerlerini doğrudan düzenlemelerini istemenin yanı sıra, düzenleme arabiriminin arabirimi aşağıdaki şekillerde eksiktir:

  • Kullanıcı veritabanında bulunmayan bir CategoryID veya SupplierID girerse, UPDATE yabancı anahtar kısıtlamasını ihlal eder ve bir özel durumun ortaya alınmasına neden olur.
  • Düzenleme arabirimi herhangi bir doğrulama içermez. Gerekli bir değer (gibi ProductName) sağlamazsanız veya sayısal değerin beklendiği bir dize değeri girerseniz (metin kutusuna UnitPrice "Çok fazla!" girmek gibi), bir özel durum oluşturulur. Gelecekteki bir öğreticide, düzenleme kullanıcı arabirimine doğrulama denetimlerinin nasıl ekleneceği incelenecektir.
  • Şu anda salt okunur olmayan tüm ürün alanlarının GridView'a eklenmesi gerekir. GridView'dan bir alanı kaldırırsak, örneğin UnitPrice, verileri güncelleştirirken GridView değeri ayarlamaz UnitPriceUpdateParameters ve bu da veritabanı kaydının UnitPriceNULL değerini değiştirir. Benzer şekilde, gibi ProductNamegerekli bir alan GridView'dan kaldırılırsa, güncelleştirme yukarıda belirtilen "'ProductName' Sütunu null'lara izin vermiyor" özel durumuyla başarısız olur.
  • Düzenleme arabirimi biçimlendirmesi istenen çok şey bırakır. UnitPrice dört ondalık noktayla gösterilir. İdeal olarak CategoryID ve SupplierID değerleri, sistemdeki kategorileri ve sağlayıcıları listeleyen DropDownLists'i içerir.

Bunların hepsi şimdilik birlikte yaşamamız gereken ancak gelecek öğreticilerde ele alacağımız eksiklikler.

DetailsView ile Veri Ekleme, Düzenleme ve Silme

Önceki öğreticilerde gördüğümüz gibi DetailsView denetimi bir kerede tek bir kayıt görüntüler ve GridView gibi o anda görüntülenen kaydın düzenlenmesine ve silinmesine izin verir. Hem son kullanıcının DetailsView'dan öğeleri düzenleme ve silme deneyimi hem de ASP.NET tarafındaki iş akışı GridView ile aynıdır. DetailsView'ın GridView'dan farklı olduğu durumlarda yerleşik ekleme desteği de sağlamasıdır.

GridView'un veri değiştirme özelliklerini göstermek için, mevcut GridView'un üstündeki sayfaya Basics.aspx bir DetailsView ekleyerek başlayın ve DetailsView'un akıllı etiketi aracılığıyla bunu mevcut ObjectDataSource'a bağlayın. Ardından DetailsView'ın Height ve Width özelliklerinin işaretini kaldırın ve akıllı etiketten Sayfalamayı Etkinleştir seçeneğini işaretleyin. Düzenleme, ekleme ve silme desteğini etkinleştirmek için akıllı etiketteki Düzenlemeyi Etkinleştir, Eklemeyi Etkinleştir ve Silmeyi Etkinleştir onay kutularını işaretlemeniz yeterlidir.

Eklemeyi Etkinleştir, Düzenlemeyi Etkinleştir ve Silmeyi Etkinleştir onay kutularının seçili olduğu DetailsView Görevleri penceresini gösteren ekran görüntüsü.

Şekil 17: DetailsView'u Düzenleme, Ekleme ve Silmeyi Destekleyecek Şekilde Yapılandırma

GridView'da olduğu gibi, düzenleme, ekleme veya silme desteği eklemek, aşağıdaki bildirim temelli söz diziminin gösterdiği gibi DetailsView'a bir CommandField ekler:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True">
    <Fields>
        <asp:BoundField DataField="ProductID"
            HeaderText="ProductID" InsertVisible="False"
            ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName"
            HeaderText="ProductName" SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
            SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit"
            HeaderText="QuantityPerUnit"
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice"
            HeaderText="UnitPrice" SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
            HeaderText="UnitsInStock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
            HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel"
            HeaderText="ReorderLevel" SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued"
            HeaderText="Discontinued" SortExpression="Discontinued" />
        <asp:BoundField DataField="CategoryName"
            HeaderText="CategoryName" ReadOnly="True"
            SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
            HeaderText="SupplierName" ReadOnly="True"
            SortExpression="SupplierName" />
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" ShowInsertButton="True" />
    </Fields>
</asp:DetailsView>

DetailsView için CommandField değerinin varsayılan olarak Columns koleksiyonunun sonunda göründüğünü unutmayın. DetailsView alanları satır olarak işlendiğinden CommandField, DetailsView'un en altında Ekle, Düzenle ve Sil düğmeleri bulunan bir satır olarak görünür.

Ekle, Düzenle ve Sil düğmeleriyle CommandField öğesinin alt satır olarak göründüğü DetailsView'ın ekran görüntüsü.

Şekil 18: DetailsView'u Düzenleme, Ekleme ve Silmeyi Destekleyecek Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sil düğmesine tıklanması GridView ile aynı olay dizisini başlatır: geri gönderme; ardından DetailsView değeri temel alarak DataKeyNames ObjectDataSource'larını DeleteParameters doldurup ObjectDataSource'un Delete() yöntemini çağırarak tamamlanır ve bu da ürünü veritabanından kaldırır. DetailsView'da düzenleme, GridView ile aynı şekilde de çalışır.

Ekleme için, son kullanıcıya tıklandığında DetailsView'ı "ekleme modunda" işleyen yeni bir düğme sunulur. "Ekleme modu" ile Yeni düğmesi Ekle ve İptal düğmeleriyle değiştirilir ve yalnızca özelliği (varsayılan) olarak ayarlanmış true BoundField'ler InsertVisible görüntülenir. gibi ProductIDotomatik artırma alanları olarak tanımlanan bu veri alanlarının, DetailsView'ı akıllı etiket aracılığıyla veri kaynağına bağlarken InsertVisible özelliği olarak ayarlanmıştır false .

Akıllı etiket aracılığıyla bir veri kaynağını DetailsView'a false bağlarken, Visual Studio özelliği yalnızca otomatik artırma alanları için olarak ayarlarInsertVisible. ve SupplierNamegibi CategoryName salt okunur alanlar, özellikleri açıkça olarak ayarlanmadığı falsesürece InsertVisible "ekleme modu" kullanıcı arabiriminde görüntülenir. DetailsView'un InsertVisible bildirim temelli söz dizimi aracılığıyla veya akıllı etiketteki Alanları Düzenle bağlantısı aracılığıyla bu iki alanın özelliklerini olarak ayarlamak için falsebiraz zaman ayırın. Şekil 19'da, Alanları Düzenle bağlantısına false tıklayarak özellikleri olarak ayarlama InsertVisible gösterilmektedir.

InsertVisible özelliğinin False olarak ayarlandığı Alanlar penceresini gösteren ekran görüntüsü.

Şekil 19: Northwind Traders Artık Acme Çayı Sunuyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özellikleri ayarladıktan InsertVisible sonra, sayfayı Basics.aspx tarayıcıda görüntüleyin ve Yeni düğmesine tıklayın. Şekil 20'de ürün hattımıza yeni bir içecek (Acme Tea) eklerken DetailsView gösterilmektedir.

Web tarayıcısında Basics.aspx sayfasının DetailsView'ını gösteren ekran görüntüsü.

Şekil 20: Northwind Traders Artık Acme Çayı Sunuyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Acme Tea için ayrıntıları girip Ekle düğmesine tıkladıktan sonra bir geri gönderme yapılır ve yeni kayıt veritabanı tablosuna Products eklenir. Bu DetailsView, ürünleri veritabanı tablosunda bulundukları sırayla listelediğinden, yeni ürünü görmek için son ürünü sayfalandırmalıyız.

Acme Tea için ayrıntılar

Şekil 21: Acme Tea ayrıntıları (Tam boyutlu resmi görüntülemek için tıklayın)

Not

DetailsView'un CurrentMode özelliği , görüntülenen arabirimi gösterir ve şu değerlerden biri olabilir: Edit, Insertveya ReadOnly. DefaultMode özelliği, bir düzenleme veya ekleme tamamlandıktan sonra DetailsView'un döndürdüğü modu gösterir ve kalıcı olarak düzenleme veya ekleme modunda olan bir DetailsView görüntülemek için kullanışlıdır.

DetailsView'un nokta ve tıklama ekleme ve düzenleme özellikleri GridView ile aynı sınırlamalardan muzdariptir: kullanıcının metin kutusu aracılığıyla mevcut CategoryID ve SupplierID değerleri girmesi gerekir; arabirimde herhangi bir doğrulama mantığı yoktur; değerlere izin NULL verilmeyen veya veritabanı düzeyinde belirtilen varsayılan değere sahip olmayan tüm ürün alanları ekleme arabirimine eklenmelidir. ve benzeri.

Gelecek makalelerde GridView'un düzenleme arabirimini genişletmek ve geliştirmek için inceleyeceğiz teknikler, DetailsView denetiminin düzenleme ve ekleme arabirimlerine de uygulanabilir.

Daha Esnek Veri Değişikliği Kullanıcı Arabirimi için FormView Kullanma

FormView, veri ekleme, düzenleme ve silme için yerleşik destek sunar, ancak alanlar yerine şablonlar kullandığından, veri değişikliği arabirimini sağlamak için GridView ve DetailsView denetimleri tarafından kullanılan BoundField veya CommandField'i ekleyebileceğiniz bir yer yoktur. Bunun yerine, Yeni, Düzenle, Sil, Ekle, Güncelleştir ve İptal düğmeleriyle birlikte yeni öğe eklerken veya var olan bir öğeyi düzenlerken kullanıcı girişi toplamak için Web denetimlerinin uygun şablonlara el ile eklenmesi gerekir. Neyse ki Visual Studio, FormView'u akıllı etiketindeki açılan liste aracılığıyla bir veri kaynağına bağlarken gerekli arabirimi otomatik olarak oluşturur.

Bu teknikleri göstermek için sayfaya Basics.aspx bir FormView ekleyerek başlayın ve FormView'un akıllı etiketinden bunu zaten oluşturulmuş ObjectDataSource'a bağlayın. Bu, kullanıcının girişini toplamaya yönelik TextBox Web ile FormView denetimleri ve Yeni, Düzenle, Sil, Ekle, Güncelleştir ve İptal düğmeleri için Düğme Web denetimleri için bir EditItemTemplate, InsertItemTemplateItemTemplate ve oluşturur. Ayrıca, FormView'un DataKeyNames özelliği ObjectDataSource tarafından döndürülen nesnenin birincil anahtar alanına (ProductID) ayarlanır. Son olarak, FormView'un akıllı etiketindeki Disk Belleğini Etkinleştir seçeneğini işaretleyin.

Aşağıda, FormView ObjectDataSource'a bağlandıktan sonra FormView'lar ItemTemplate için bildirim temelli işaretleme gösterilmektedir. Varsayılan olarak, her Boole değeri olmayan ürün alanı bir Etiket Web denetiminin özelliğine Text bağlanırken, her Boole değeri alanı (Discontinued) devre dışı bırakılmış bir CheckBox Web denetiminin özelliğine Checked bağlıdır. Yeni, Düzenle ve Sil düğmelerinin tıklandığında belirli FormView davranışını tetiklemesi için, değerlerinin CommandName sırasıyla , Editve Deleteolarak ayarlanması Newzorunludur.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ...
    </EditItemTemplate>
    <InsertItemTemplate>
        ...
    </InsertItemTemplate>
    <ItemTemplate>
        ProductID:
        <asp:Label ID="ProductIDLabel" runat="server"
            Text='<%# Eval("ProductID") %>'></asp:Label><br />
        ProductName:
        <asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Bind("ProductName") %>'>
        </asp:Label><br />
        SupplierID:
        <asp:Label ID="SupplierIDLabel" runat="server"
            Text='<%# Bind("SupplierID") %>'>
        </asp:Label><br />
        CategoryID:
        <asp:Label ID="CategoryIDLabel" runat="server"
            Text='<%# Bind("CategoryID") %>'>
        </asp:Label><br />
        QuantityPerUnit:
        <asp:Label ID="QuantityPerUnitLabel" runat="server"
            Text='<%# Bind("QuantityPerUnit") %>'>
        </asp:Label><br />
        UnitPrice:
        <asp:Label ID="UnitPriceLabel" runat="server"
            Text='<%# Bind("UnitPrice") %>'></asp:Label><br />
        UnitsInStock:
        <asp:Label ID="UnitsInStockLabel" runat="server"
            Text='<%# Bind("UnitsInStock") %>'>
        </asp:Label><br />
        UnitsOnOrder:
        <asp:Label ID="UnitsOnOrderLabel" runat="server"
            Text='<%# Bind("UnitsOnOrder") %>'>
        </asp:Label><br />
        ReorderLevel:
        <asp:Label ID="ReorderLevelLabel" runat="server"
            Text='<%# Bind("ReorderLevel") %>'>
        </asp:Label><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
            Checked='<%# Bind("Discontinued") %>'
            Enabled="false" /><br />
        CategoryName:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Bind("CategoryName") %>'>
        </asp:Label><br />
        SupplierName:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Bind("SupplierName") %>'>
        </asp:Label><br />
        <asp:LinkButton ID="EditButton" runat="server"
            CausesValidation="False" CommandName="Edit"
            Text="Edit">
        </asp:LinkButton>
        <asp:LinkButton ID="DeleteButton" runat="server"
            CausesValidation="False" CommandName="Delete"
            Text="Delete">
        </asp:LinkButton>
        <asp:LinkButton ID="NewButton" runat="server"
            CausesValidation="False" CommandName="New"
            Text="New">
        </asp:LinkButton>
    </ItemTemplate>
</asp:FormView>

Şekil 22'de ItemTemplate bir tarayıcı üzerinden görüntülendiğinde FormView'lar gösterilmektedir. Her ürün alanı en alttaki Yeni, Düzenle ve Sil düğmeleriyle listelenir.

Her Ürün Alanını Yeni, Düzenle ve Sil Düğmeleriyle birlikte Listeler Defaut FormView ItemTemplate

Şekil 22: Her Ürün Alanını Yeni, Düzenle ve Sil Düğmeleriyle Birlikte Listeler Defaut FormView ItemTemplate (Tam boyutlu görüntüyü görüntülemek için tıklayın)

GridView ve DetailsView'da olduğu gibi, Sil düğmesine veya özelliği Delete olarak ayarlanmış herhangi CommandName bir Button, LinkButton veya ImageButton öğesine tıklanması geri göndermeye neden olur, ObjectDataSource'ları DeleteParameters FormView'un DataKeyNames değerine göre doldurur ve ObjectDataSource'un Delete() yöntemini çağırır.

Düzenle düğmesine tıklandığında bir geri gönderme gönderildiğinde ve veriler düzenleme arabiriminin EditItemTemplateişlenmesinden sorumlu olan öğesine geri yüklenir. Bu arabirim, verileri düzenlemeye yönelik Web denetimlerinin yanı sıra Güncelleştir ve İptal düğmelerini içerir. Visual Studio tarafından oluşturulan varsayılan EditItemTemplate değer, otomatik artırma alanlarıProductID () için bir Etiket, Boole olmayan her değer alanı için bir TextBox ve her Boole değeri alanı için bir CheckBox içerir. Bu davranış GridView ve DetailsView denetimlerinde otomatik olarak oluşturulan BoundField'lara çok benzer.

Not

FormView'un otomatik olarak oluşturulmasıyla EditItemTemplate ilgili küçük bir sorun, ve SupplierNamegibi CategoryName salt okunur alanlar için TextBox Web denetimlerini işlemesidir. Bunu kısa süre sonra nasıl hesaplayacağımıza bakacağız.

içindeki EditItemTemplate TextBox denetimlerinin Text , iki yönlü veri bağlamayı kullanarak ilgili veri alanlarının değerine bağlı özellikleri vardır. tarafından <%# Bind("dataField") %>belirtilen iki yönlü veri bağlama, hem verileri şablona bağlarken hem de ObjectDataSource'un kayıtları ekleme veya düzenleme parametrelerini doldurma sırasında veri bağlama gerçekleştirir. Başka bir ifadeyle, kullanıcı içinden ItemTemplateBind() Düzenle düğmesine tıkladığında yöntem belirtilen veri alanı değerini döndürür. Kullanıcı değişikliklerini yaptıktan ve Güncelleştir'e tıkladıktan sonra, kullanılarak Bind() belirtilen veri alanlarına karşılık gelen geri gönderilen değerler ObjectDataSource'un UpdateParametersöğesine uygulanır. Alternatif olarak, tarafından <%# Eval("dataField") %>belirtilen tek yönlü veri bağlama, yalnızca verileri şablona bağlarken veri alanı değerlerini alır ve kullanıcı tarafından girilen değerleri geri gönderme sırasında veri kaynağının parametrelerine döndürmez .

Aşağıdaki bildirim temelli işaretleme, FormView'un EditItemTemplateöğesini gösterir. Yönteminin Bind() buradaki veri bağlama söz diziminde kullanıldığını ve Güncelleştir ve İptal Düğmesi Web denetimlerinin CommandName özelliklerini uygun şekilde ayarladığını unutmayın.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ProductID:
        <asp:Label ID="ProductIDLabel1" runat="server"
          Text="<%# Eval("ProductID") %>"></asp:Label><br />
        ProductName:
        <asp:TextBox ID="ProductNameTextBox" runat="server"
          Text="<%# Bind("ProductName") %>">
        </asp:TextBox><br />
        SupplierID:
        <asp:TextBox ID="SupplierIDTextBox" runat="server"
          Text="<%# Bind("SupplierID") %>">
        </asp:TextBox><br />
        CategoryID:
        <asp:TextBox ID="CategoryIDTextBox" runat="server"
          Text="<%# Bind("CategoryID") %>">
        </asp:TextBox><br />
        QuantityPerUnit:
        <asp:TextBox ID="QuantityPerUnitTextBox" runat="server"
           Text="<%# Bind("QuantityPerUnit") %>">
        </asp:TextBox><br />
        UnitPrice:
        <asp:TextBox ID="UnitPriceTextBox" runat="server"
           Text="<%# Bind("UnitPrice") %>">
        </asp:TextBox><br />
        UnitsInStock:
        <asp:TextBox ID="UnitsInStockTextBox" runat="server"
           Text="<%# Bind("UnitsInStock") %>">
        </asp:TextBox><br />
        UnitsOnOrder:
        <asp:TextBox ID="UnitsOnOrderTextBox" runat="server"
           Text="<%# Bind("UnitsOnOrder") %>">
        </asp:TextBox><br />
        ReorderLevel:
        <asp:TextBox ID="ReorderLevelTextBox" runat="server"
           Text="<%# Bind("ReorderLevel") %>">
        </asp:TextBox><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
            Checked="<%# Bind("Discontinued") %>" /><br />
        CategoryName:
        <asp:TextBox ID="CategoryNameTextBox" runat="server"
             Text="<%# Bind("CategoryName") %>">
        </asp:TextBox><br />
        SupplierName:
        <asp:TextBox ID="SupplierNameTextBox" runat="server"
             Text="<%# Bind("SupplierName") %>">
        </asp:TextBox><br />
        <asp:LinkButton ID="UpdateButton" runat="server"
            CausesValidation="True" CommandName="Update"
            Text="Update">
        </asp:LinkButton>
        <asp:LinkButton ID="UpdateCancelButton" runat="server"
            CausesValidation="False" CommandName="Cancel"
            Text="Cancel">
        </asp:LinkButton>
    </EditItemTemplate>
    <InsertItemTemplate>
        ...
    </InsertItemTemplate>
    <ItemTemplate>
        ...
    </ItemTemplate>
</asp:FormView>

EditItemTemplateBu noktada , kullanmayı denediğimizde bir özel durum oluşturmasına neden olur. Sorun, ve SupplierName alanlarının CategoryName içinde EditItemTemplateTextBox Web denetimleri olarak işlenmesidir. Bu TextBox'ları Etiketler olarak değiştirmemiz veya tamamen kaldırmamız gerekir. Şimdi bunları uygulamasından EditItemTemplatetamamen silelim.

Şekil 23'te, Chai için Düzenle düğmesine tıklandıktan sonra tarayıcıda FormView gösterilmektedir. SupplierName öğesinde ItemTemplate gösterilen ve CategoryName alanlarının artık mevcut olmadığını unutmayın. Bunları öğesinden EditItemTemplateyeni kaldırdık. Güncelleştir düğmesine tıklandığında FormView, GridView ve DetailsView denetimleriyle aynı adım dizisinde ilerler.

Varsayılan olarak EditItemTemplate, Düzenlenebilir Her Ürün Alanını TextBox veya CheckBox Olarak Gösterir

Şekil 23: Varsayılan olarak EditItemTemplate Her Düzenlenebilir Ürün Alanını TextBox veya CheckBox Olarak Gösterir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ekle düğmesine tıklandığında FormView ItemTemplate bir geri gönderme işlemidir. Ancak, yeni bir kayıt eklendiğinden FormView'a hiçbir veri bağlı değildir. Arabirim, InsertItemTemplate Ekle ve İptal düğmeleriyle birlikte yeni kayıt eklemeye yönelik Web denetimlerini içerir. Visual Studio tarafından oluşturulan varsayılan InsertItemTemplate değer, boole olmayan her bir değer alanı için bir TextBox ve otomatik olarak oluşturulan EditItemTemplatearabirimine benzer şekilde her Boole değeri alanı için bir CheckBox içerir. TextBox denetimleri, iki yönlü veri bağlama kullanarak ilgili veri alanlarının değerine bağlı özelliklerine sahiptir Text .

Aşağıdaki bildirim temelli işaretleme, FormView'un InsertItemTemplateöğesini gösterir. Yönteminin Bind() buradaki veri bağlama söz diziminde kullanıldığını ve Ekle ve İptal Düğmesi Web denetimlerinin CommandName özelliklerini uygun şekilde ayarladığını unutmayın.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ...
    </EditItemTemplate>
    <InsertItemTemplate>
        ProductName:
        <asp:TextBox ID="ProductNameTextBox" runat="server"
           Text="<%# Bind("ProductName") %>">
        </asp:TextBox><br />
        SupplierID:
        <asp:TextBox ID="SupplierIDTextBox" runat="server"
           Text="<%# Bind("SupplierID") %>">
        </asp:TextBox><br />
        CategoryID:
        <asp:TextBox ID="CategoryIDTextBox" runat="server"
           Text="<%# Bind("CategoryID") %>">
        </asp:TextBox><br />
        QuantityPerUnit:
        <asp:TextBox ID="QuantityPerUnitTextBox" runat="server"
           Text="<%# Bind("QuantityPerUnit") %>">
        </asp:TextBox><br />
        UnitPrice:
        <asp:TextBox ID="UnitPriceTextBox" runat="server"
           Text="<%# Bind("UnitPrice") %>">
        </asp:TextBox><br />
        UnitsInStock:
        <asp:TextBox ID="UnitsInStockTextBox" runat="server"
           Text="<%# Bind("UnitsInStock") %>">
        </asp:TextBox><br />
        UnitsOnOrder:
        <asp:TextBox ID="UnitsOnOrderTextBox" runat="server"
           Text="<%# Bind("UnitsOnOrder") %>">
        </asp:TextBox><br />
        ReorderLevel:
        <asp:TextBox ID="ReorderLevelTextBox" runat="server"
           Text="<%# Bind("ReorderLevel") %>">
        </asp:TextBox><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
           Checked="<%# Bind("Discontinued") %>" /><br />
        CategoryName:
        <asp:TextBox ID="CategoryNameTextBox" runat="server"
            Text="<%# Bind("CategoryName") %>">
        </asp:TextBox><br />
        SupplierName:
        <asp:TextBox ID="SupplierNameTextBox" runat="server"
           Text="<%# Bind("SupplierName") %>">
        </asp:TextBox><br />
        <asp:LinkButton ID="InsertButton" runat="server"
            CausesValidation="True" CommandName="Insert"
            Text="Insert">
        </asp:LinkButton>
        <asp:LinkButton ID="InsertCancelButton" runat="server"
            CausesValidation="False" CommandName="Cancel"
            Text="Cancel">
        </asp:LinkButton>
    </InsertItemTemplate>
    <ItemTemplate>
        ...
    </ItemTemplate>
</asp:FormView>

FormView'un otomatik olarak oluşturulmasında bir incelik InsertItemTemplatevardır. Özellikle, TextBox Web denetimleri ve SupplierNamegibi CategoryName salt okunur alanlar için bile oluşturulur. ile EditItemTemplateolduğu gibi, bu TextBoxes'ı içinden InsertItemTemplatekaldırmamız gerekir.

Şekil 24'te Acme Coffee adlı yeni bir ürün eklenirken tarayıcıda FormView gösterilmektedir. SupplierName'de ItemTemplate gösterilen ve CategoryName alanlarının artık mevcut olmadığını unutmayın. Bunları yeni kaldırdık. Ekle düğmesine tıklandığında FormView, DetailsView denetimiyle aynı adım dizisinde ilerleyerek tabloya Products yeni bir kayıt ekler. Şekil 25'te Acme Coffee ürününün eklendikten sonra FormView'daki ayrıntıları gösterilmektedir.

InsertItemTemplate, FormView'un Ekleme Arabirimini Dikte Eder

Şekil 24: InsertItemTemplate FormView'un Ekleme Arabirimini Dikte Eder (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Yeni Ürün, Acme Kahve için Ayrıntılar FormView'da Görüntülenir

Şekil 25: Yeni Ürün, Acme Kahve için Ayrıntılar FormView'da Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

FormView, salt okunur, düzenleme ve arabirimleri üç ayrı şablona ayırarak bu arabirimler üzerinde DetailsView ve GridView'dan daha ince bir denetim sağlar.

Not

DetailsView'da olduğu gibi, FormView'un CurrentMode özelliği de görüntülenen arabirimi gösterir ve DefaultMode özelliği formView'un bir düzenleme veya ekleme tamamlandıktan sonra döndürdüğü modu gösterir.

Özet

Bu öğreticide GridView, DetailsView ve FormView kullanarak veri ekleme, düzenleme ve silme ile ilgili temel bilgileri inceledik. Bu denetimlerin üçü de, veri Web denetimleri ve ObjectDataSource sayesinde ASP.NET sayfasında tek bir kod satırı yazmadan kullanılabilecek bazı yerleşik veri değiştirme özellikleri düzeyi sağlar. Ancak, basit nokta ve tıklama teknikleri oldukça zayıf ve saf bir veri değişikliği kullanıcı arabirimi oluşturur. Doğrulama sağlamak, programlı değerler eklemek, özel durumları düzgün bir şekilde işlemek, kullanıcı arabirimini özelleştirmek vb. için, sonraki birkaç öğreticide ele alınabilecek bir teknik parçasına güvenmemiz gerekir.

Mutlu Programlama!

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.