Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
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).
Ş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ı 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 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.
Ş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>
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.sitemap
sonra, öğ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.
Ş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.
Ş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.
Ş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()
, ProductsBLL
ve UpdateProduct
yöntemlerini çağırması için yapılandırın.AddProduct
DeleteProduct
Ş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)
Ş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)
Ş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, DeleteParameters
sınıfın UpdateParameters
, InsertParameters
ve ProductsBLL
yöntemlerinin giriş parametreleriyle AddProduct
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 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
, UpdateParameters
ve 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
,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 BoundField'lerin 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 öğ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:
- 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
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 false
ayarlarsanı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.
Ş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 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şlemi tamamlandı! Şekil 11'de gösterildiği gibi, bu sayfayı tarayıcı üzerinden ziyaret ederken Sil düğmelerinin bir sütunu 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ı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.
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ı belirtir.
Ş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 Details
en az bir kaydı olduğundan, ürünün ilişkili sipariş ayrıntıları kayıtlarını silmeden 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)
Öğ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]
Ş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:
- GridView'un
EditItemIndex
özelliği, Düzenle düğmesine tıklanan satırın dizinine atanır - GridView, yöntemini çağırarak
Select()
objectDataSource'a yeniden bağlanır - 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) 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'un 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
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.
Ş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 ShowEditButton
ayarlartrue
. 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 CategoryID
gibi SupplierID
alanları içerir.
Ş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
veyaSupplierID
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 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 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.
Ş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.
Ş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 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 InsertVisible
bağlarken, Visual Studio özelliği yalnızca otomatik artırma alanları için olarak ayarlarfalse
. ve CategoryName
gibi SupplierName
salt okunur alanlar, özellikleri açıkça olarak olarak ayarlanmadığı InsertVisible
sü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 false
biraz zaman ayırın. Şekil 19'da, Alanları Düzenle bağlantısına InsertVisible
tıklayarak özelliklerin olarak ayarlanması false
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ı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.
Ş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.
Ş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
, Insert
veya 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
, 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ı 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 , New
ve Edit
olarak ayarlanması Delete
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 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.
Ş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 EditItemTemplate
iş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 CategoryName
gibi 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 ItemTemplate
Bind()
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 , EditItemTemplate
kullanmaya çalışırsak bir özel durum oluşturmasına neden olur. Sorun, ve CategoryName
alanlarının SupplierName
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 CategoryName
gösterilen ve ItemTemplate
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: 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 InsertItemTemplate
ilgili bir incelik vardır. Özellikle, TextBox Web denetimleri ve CategoryName
gibi SupplierName
salt okunur alanlar için bile oluşturulur. ile EditItemTemplate
olduğu gibi, bu TextBox'ları 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 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.
Ş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 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.