Aracılığıyla paylaş


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

tarafından Scott Mitchell

PDF'i indirin

Bu öğreticide, bir 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ş

Geçmişteki birkaç öğreticide GridView, DetailsView ve FormView denetimlerini kullanarak ASP.NET bir sayfada 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 da 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 , Insert()ve Update() yöntemlerine de sahiptirDelete(). 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 , Insert()ve Update() yöntemlerini çağırır Delete()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 Görevi Görür

Şekil 1: ObjectDataSource'un , Insert()ve Update() Yöntemleri BLL'de Delete()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, web sitesi projemizde bu öğretici ve sonraki birkaç sayfa için ihtiyacımız olacak 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 Değişikliğiyle İlgili Öğreticiler için ASP.NET Sayfaları Ekleme

Şekil 2: Veri Değişikliğiyle İlgili Öğreticiler 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 listelenir. 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>arkasına 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 bekleyin. Soldaki 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'un her biri veri değiştirme özelliklerinde ve düzenlerinde farklılık gösterdiğinden, her birini tek tek inceleyelim. Bununla birlikte, 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ç Kutusu'ndan bir ObjectDataSource öğesini Tasarımcı'ya 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, sınıfın hangi yöntemlerinin ProductsBLL ObjectDataSource'un Select(), , Insert()öğesine Update()eşleneceğini belirtebilir ve Delete() uygun sekmeyi seçip açılan listeden yöntemini seçebiliriz. Şimdiye kadar tanıdık görünmesi gereken Şekil 6, ObjectDataSource'un Select() yöntemini sınıfın ProductsBLL yöntemiyle GetProducts() eşler. Insert(), Update()ve Delete() yöntemleri, ü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. Bu sekmeleri, , ve yöntemlerinin Insert()sırasıyla sınıfın Update()Delete() , ProductsBLLve UpdateProduct yöntemlerini çağırması için yapılandırın.AddProductDeleteProduct

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 ProductBLL Yöntemiyle UpdateProduct 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 ProductBLL Yöntemiyle Product 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'un Delete() Yöntemini Sınıfın ProductBLL Yöntemiyle DeleteProduct 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 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 UpdateParameters, InsertParametersve ProductsBLL yöntemlerinin giriş parametreleriyle AddProduct 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 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, bu DeleteParameters, UpdateParametersve InsertParameters değerleri ObjectDataSource 'un Insert(), Update()veya Delete() yöntemini çağırmadan önce GridView, DetailsView ve FormView tarafından otomatik olarak ayarlanır. Bu değerler, gelecek bir öğreticide ele alacağımız gibi 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 ayarlamasıdır.original_{0} 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 buna göre güncelleştirilebilmesi 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 başka bir kullanıcının 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. Ancak şimdi konuyu açıyorum çünkü BLL'mizin yöntemleri özgün değerleri beklemiyor ve bu nedenle bu özelliği kaldırmamız önemli. OldValuesParameterFormatString ObjectDataSource hem veya {0} hem de Update() özgün değer parametrelerini geçirmeyi deneyeceği için, bir veri Web denetimi ObjectDataSource'un Delete() veya UpdateParameters yöntemlerini çağırmaya çalıştığında özelliğin varsayılan (DeleteParameters) dışında bir değere ayarlanması hataya neden olur.

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 bulunmaya devam eder, ancak boş bir dizeye ayarlanır. Bu, ne yazık ki yukarıda açıklanan aynı sorunla sonuçlanır. Bu nedenle, özelliğini 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 üzere 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 basittir. Gerçek dünyada, bu tür işlevlerin sağlanmasını yalnızca işaret ve tıklamaktan daha fazla söz konusu hale getiren birçok incelik ve uç durum vardır. Ancak bu öğretici yalnızca basit veri değişikliği özelliklerini kanıtlamaya odaklanır. Gelecekteki öğreticiler, şüphesiz gerçek bir ortamda ortaya çıkacak endişeleri inceleyecektir.

GridView'dan Veri Silme

Araç Kutusundan Tasarımcı'ya bir GridView sürükleyerek başlayın. 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'ın ö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 BoundField'lerin 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 öğreticisiyle Seçilebilir Ana Kılavuz Görünümü Kullanma Ana/Ayrıntı bölümüne bakın.

GridView, Özellikler penceresi veya bildirim temelli söz dizimi aracılığıyla ObjectDataSource'a bağlanabileceğ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üğmelerinin bir sütununu ekler. Son kullanıcı belirli bir satır için Sil düğmesine tıkladığında, 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 Select() objectDataSource'a yeniden bağlanır

öğ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 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, yani DataKeys GridView görünüm durumu devre dışı bırakılmış olsa bile geri göndermede değerlerin hatırlanacağı anlamına gelir. Ancak, düzenlemeyi veya silmeyi (varsayılan davranış) destekleyen GridView'lar için görünüm durumunun etkin kalması çok önemlidir. GridView s EnableViewState özelliğini olarak falseayarlarsanız, düzenleme ve silme davranışı tek bir kullanıcı için sorunsuz ç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'da bir sütunu aşağıdaki 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, Details DetailView öğreticisiyle Seçilebilir Bir Ana Kılavuz Görünümü Kullanarak Master/Detail içindeki kayıtları seçerek 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şlemi tamamlandı! Şekil 11'de gösterildiği gibi, bu sayfayı tarayıcı üzerinden ziyaret ederken Sil düğmelerinin bir sütunu bulunur.

CommandField, Silme 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ıklandığında bir özel durum oluşur. Bu özel durumların neden yükseltildiğ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 katılmıştır. 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 original_ProductID' yöntemi bulamadı" gibi bir özel durumla karşılaşı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 productID de original_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ı belirtir.

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' BAŞVURU kısıtlamasıyla çakıştı." Northwind veritabanı ve Order Details tablosu arasında Products 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ünün içinde Order Detailsen az bir kaydı olduğundan, ürünün ilişkili sipariş ayrıntıları kayıtlarını silmeden 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)

Öğreticimiz için, tablodaki tüm kayıtları Order Details silelim. Gerçek dünyadaki 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 mantığı dahil etmek için yöntemini geliştirme
  • 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ıklanması ürünü hatasız siler. Sil düğmesine tıklandığında ürün silinmiyorsa GridView DataKeyNames özelliğinin birincil anahtar alanına (ProductID ) ayarlandığından emin olun.

Not

Sil düğmesine tıklandığında 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, bir 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 perspektifinden, bir satırın Düzenle düğmesine tıklanması, bu satırın düzenlenebilir hale gelmesine neden olur, hücreleri mevcut 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 ön düzenleme durumuna döner.

Sayfa geliştiricisi olarak 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 Select() objectDataSource'a yeniden bağlanır
  3. ile eşleşen EditItemIndex satır dizini "düzenleme modunda" işlenir. Bu modda, Düzenle düğmesinin yerini Güncelleştir ve İptal düğmeleri alır 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'un 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 Select() objectDataSource'a yeniden bağlanır

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 ShowEditButtonayarlartrue. 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 yapmanız gereken bu. Şekil16'da gösterildiği gibi, düzenleme arabirimi, özelliği (varsayılan) olarak ayarlanmış ReadOnly olan her BoundField'ın false bir TextBox olarak işlendiğini gösterir. Bu, diğer tabloların anahtarları olan ve CategoryIDgibi SupplierID alanları içerir.

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

Şekil 16: Chai Düzenle Düğmesine Tıklanması Satırı Düzenleme Modunda Görüntüler (Tam boyutlu görüntüyü 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 tetiklenmesine 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 tedarikçileri listeleyen DropDownLists'i içerir.

Bunlar şimdilik yaşamamız gereken ancak gelecek öğreticilerde ele alacağımız eksikliklerdir.

DetailsView ile Veri Ekleme, Düzenleme ve Silme

Önceki öğreticilerde gördüğümüz gibi DetailsView denetimi bir kerede 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'un GridView'dan farklı olduğu durumlarda yerleşik ekleme desteği de sağlar.

GridView'un veri değişikliği özelliklerini göstermek için, mevcut GridView'un üst kısmındaki sayfaya Basics.aspx 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 özelliklerinin işaretini kaldırın ve Width 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'ı 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 diziminde gösterildiğ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 Sütunlar koleksiyonunun sonunda göründüğünü unutmayın. DetailsView'un alanları satır olarak işlendiğinden, CommandField DetailsView'un alt kısmında Ekle, Düzenle ve Sil düğmeleri bulunan bir satır olarak görünür.

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

Şekil 18: DetailsView'ı 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 temelinde DeleteParameters ObjectDataSource'larını DataKeyNames dolduruyor ve objectDataSource'un Delete() yöntemini çağırarak tamamlanır ve bu yöntem ü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ış InsertVisible BoundField'ler true 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 InsertVisible bağlarken, Visual Studio özelliği yalnızca otomatik artırma alanları için olarak ayarlarfalse. ve CategoryNamegibi SupplierName salt okunur alanlar, özellikleri açıkça olarak olarak ayarlanmadığı InsertVisiblesürece false "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 InsertVisible tıklayarak özelliklerin olarak ayarlanması false 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ız)

Ö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ız)

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

Acme Çayı için ayrıntılar

Şekil 21: Acme Çayı ayrıntıları (Tam boyutlu görüntüyü 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, 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 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 var olan 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 inceleyacağımız teknikler DetailsView denetiminin düzenleme ve ekleme arabirimlerine de uygulanabilir.

Daha Esnek Bir 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ştirme arabirimini sağlamak için GridView ve DetailsView denetimleri tarafından kullanılan BoundField'leri veya CommandField'ı eklemeye yer yoktur. Bunun yerine, Yeni, Düzenle, Sil, Ekle, Güncelleştir ve İptal düğmeleriyle birlikte yeni öğe eklerken veya mevcut bir öğeyi düzenlerken kullanıcı girişi toplamaya yönelik Web denetimleri uygun şablonlara el ile eklenmelidir. 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 denetimleri ile FormView 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ı etiketinde Sayfalama'yı Etkinleştir seçeneğini işaretleyin.

Aşağıda, FormView ItemTemplate ObjectDataSource'a bağlandıktan sonra FormView'lar için bildirim temelli işaretleme gösterilmektedir. Varsayılan olarak, Boole değeri olmayan her ü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 , Newve Editolarak ayarlanması Deletezorunludur.

<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 tarayıcı üzerinden görüntülendiğinde FormView'lar ItemTemplate gösterilmektedir. Her ürün alanı en alttaki Yeni, Düzenle ve Sil düğmeleriyle listelenir.

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

Şekil 22: Defaut FormView ItemTemplate Her Ürün Alanını Yeni, Düzenle ve Sil Düğmeleriyle Birlikte Listeler (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 bir Düğme, LinkButton veya ImageButton'a CommandName 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 başlatılır ve veriler düzenleme arabirimini EditItemTemplateişlemeden sorumlu olan öğesine yeniden bağlanır. Bu arabirim, Verileri düzenlemek için 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 Onay Kutusu içerir. Bu davranış, GridView ve DetailsView denetimlerinde otomatik olarak oluşturulan BoundField'lere çok benzer.

Not

FormView'un otomatik olarak oluşturulmasıyla EditItemTemplate ilgili küçük bir sorun, ve CategoryNamegibi SupplierName 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 denetimlerininText, iki yönlü veri bağlama kullanarak ilgili veri alanının değerine bağlı özellikleri vardır. tarafından <%# Bind("dataField") %>belirtilen iki yönlü veri bağlama, hem şablona veri 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öntemi 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 buna göre 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>

Bu noktada , EditItemTemplatekullanmaya çalışırsak bir özel durum oluşturmasına neden olur. Sorun, ve CategoryName alanlarının SupplierName 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 CategoryName gösterilen ve ItemTemplate 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 Her Düzenlenebilir Ürün Alanını TextBox veya CheckBox Olarak Gösterir

Şekil 23: Her Düzenlenebilir Ürün Alanını Varsayılan Olarak EditItemTemplate 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şlemi olur. 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 değer alanı için bir TextBox ve otomatik olarak oluşturulan EditItemTemplate'ın arabirimine benzer şekilde her Boole değeri alanı için bir CheckBox içerir. TextBox denetimleri, iki yönlü veri bağlama kullanarak ilgili veri alanı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 buna göre 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ıyla InsertItemTemplateilgili bir incelik vardır. Özellikle, TextBox Web denetimleri ve CategoryNamegibi SupplierName salt okunur alanlar için bile oluşturulur. ile EditItemTemplateolduğu gibi, bu TextBox'ları 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 CategoryName gösterilen ve ItemTemplate alanlarının artık mevcut olmadığına dikkat edin. Yeni kaldırdığımız için. 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 Kahvesinin Ayrıntıları FormView'da Görüntülenir

Şekil 25: Yeni Ürün, Acme Kahvesinin 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 hassas bir denetim sağlar.

Not

DetailsView gibi, FormView'un CurrentMode özelliği de arabirimin görüntülendiğini, özelliği de DefaultMode FormView'un 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şikliği özellikleri 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 dizi teknikten yararlanmalıyız.

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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.