Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış (C#)
tarafından Scott Mitchell
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).
Ş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ı EditInsertDelete
yeni 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
Ş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.
Şekil 3: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascx
Default.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.sitemap
sonra, öğ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.
Ş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.
Ş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.
Ş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()
UpdateProduct
ProductsBLL
, AddProduct
ve DeleteProduct
yöntemlerini çağırması için bu sekmeleri yapılandırın.Delete()
Ş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)
Ş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)
Ş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, DeleteParameters
sınıfın AddProduct
, UpdateParameters
ve InsertParameters
yöntemlerinin giriş parametreleriyle ProductsBLL
eşlenebilen , UpdateProduct
ve 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
, UpdateParameters
ve değerleri GridView, DetailsView ve FormView tarafından otomatik olarak ayarlanır.Delete()
Update()
InsertParameters
Insert()
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 UpdateParameters
DeleteParameters
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
,CategoryName
veSupplierName
alanları içindeProductsDataTable
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 olaraktrue
ayarlanı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:
- ObjectDataSource'un
DeleteParameters
değerleri atanır - ObjectDataSource'un
Delete()
yöntemi çağrılır ve belirtilen kayıt silinir - 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 false
ayarlarsanı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.
Ş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 ShowDeleteButton
true
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.
Ş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. DeleteProduct
ancak, 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.
Ş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 Details
en 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.
Ş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]
Ş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:
- GridView'un
EditItemIndex
özelliği, Düzenle düğmesine tıklanan satırın dizinine atanır - GridView, yöntemini çağırarak objectDataSource'a yeniden bağlanır
Select()
- 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) olanReadOnly
BoundField'ler, özellikleri veri alanlarının değerlerine atanan TextBox Web denetimleriText
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:
- ObjectDataSource'un
UpdateParameters
değerleri, son kullanıcı tarafından GridView'ın düzenleme arabirimine girilen değerlere atanır - Belirtilen kayıt güncelleştirilerek ObjectDataSource'un
Update()
yöntemi çağrılır - 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.
Ş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 true
ayarlarShowEditButton
. 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 SupplierID
gibi CategoryID
alanları içerir.
Ş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
veyaSupplierID
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 kutusunaUnitPrice
"Ç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 ayarlamazUnitPrice
UpdateParameters
ve bu da veritabanı kaydınınUnitPrice
NULL
değerini değiştirir. Benzer şekilde, gibiProductName
gerekli 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 olarakCategoryID
veSupplierID
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.
Ş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.
Ş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 ProductID
otomatik 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 SupplierName
gibi CategoryName
salt okunur alanlar, özellikleri açıkça olarak ayarlanmadığı false
sü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 false
biraz zaman ayırın. Şekil 19'da, Alanları Düzenle bağlantısına false
tıklayarak özellikleri olarak ayarlama InsertVisible
gösterilmektedir.
Ş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.
Ş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.
Ş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
, Insert
veya 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
, InsertItemTemplate
ItemTemplate
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 , Edit
ve Delete
olarak ayarlanması New
zorunludur.
<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.
Ş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 EditItemTemplate
iş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 SupplierName
gibi 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 ItemTemplate
Bind()
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>
EditItemTemplate
Bu noktada , kullanmayı denediğimizde bir özel durum oluşturmasına neden olur. Sorun, ve SupplierName
alanlarının CategoryName
içinde EditItemTemplate
TextBox Web denetimleri olarak işlenmesidir. Bu TextBox'ları Etiketler olarak değiştirmemiz veya tamamen kaldırmamız gerekir. Şimdi bunları uygulamasından EditItemTemplate
tamamen 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 EditItemTemplate
yeni kaldırdık. Güncelleştir düğmesine tıklandığında FormView, GridView ve DetailsView denetimleriyle aynı adım dizisinde ilerler.
Ş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 EditItemTemplate
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 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 InsertItemTemplate
vardır. Özellikle, TextBox Web denetimleri ve SupplierName
gibi CategoryName
salt okunur alanlar için bile oluşturulur. ile EditItemTemplate
olduğu gibi, bu TextBoxes'ı içinden InsertItemTemplate
kaldı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.
Şekil 24: InsertItemTemplate
FormView'un Ekleme Arabirimini Dikte Eder (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ş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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin