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
Tek bir işlemde birden çok veritabanı kaydını silmeyi öğrenin. Kullanıcı Arabirimi Katmanı'nda, önceki bir öğreticide oluşturulan gelişmiş bir GridView'un üzerine inşa ediyoruz. Veri Erişim Katmanı'nda, tüm silme işlemlerinin başarılı bir şekilde gerçekleştirildiğinden veya tüm silme işlemlerinin geri alındığından emin olmak için bir veri tabanı işlemi içindeki birden çok Silme işlemini kapsarız.
Giriş
Önceki öğreticide, tam olarak düzenlenebilir bir GridView kullanarak toplu düzenleme arabiriminin nasıl oluşturulacağı keşfedildi. Kullanıcıların sık sık aynı anda birçok kaydı düzenlediği durumlarda, toplu düzenleme arabirimi çok daha az geri gönderme ve klavyeden fareye bağlam anahtarı gerektirir ve böylece son kullanıcının verimliliğini artırır. Bu teknik, kullanıcıların tek seferde birçok kaydı silmesinin yaygın olduğu sayfalar için de benzer şekilde yararlıdır.
Çevrimiçi e-posta istemcisi kullanan herkes en yaygın toplu silme arabirimlerinden birini zaten biliyordur: kılavuzdaki her satırda karşılık gelen Tüm İşaretli Öğeleri Sil düğmesini içeren bir onay kutusu (bkz. Şekil 1). Bu öğretici oldukça kısadır çünkü hem web tabanlı arabirimi hem de tek bir atomik işlem olarak bir dizi kaydı silme yöntemini oluşturma konusunda önceki öğreticilerdeki tüm zor işleri zaten yaptık.
Onay Kutularının GridView Sütununu Ekleme öğreticisinde, onay kutuları sütunu içeren bir GridView oluşturduk ve İşlem içindeki Veritabanı Değişikliklerini Sarmalama öğreticisinde BLL'de değerlerden List<T>
birini ProductID
silmek için işlem kullanacak bir yöntem oluşturduk. Bu öğreticide, çalışan bir toplu silme örneği oluşturmak için önceki deneyimlerimizi derleyip birleştireceğiz.
Şekil 1: Her Satırda Onay Kutusu Vardır (Tam boyutlu görüntüyü görüntülemek için tıklayın)
1. Adım: Toplu Silme İşlevi Oluşturma
Onay Kutularının GridView Sütunu Ekleme öğreticisinde zaten toplu silme arabirimini oluşturduğumuz için, sıfırdan oluşturmak yerine doğrudan BatchDelete.aspx
'a kopyalayabiliriz. Başlangıç olarak BatchDelete.aspx
klasöründeki BatchData
sayfasını ve CheckBoxField.aspx
klasöründeki EnhancedGridView
sayfasını açın.
CheckBoxField.aspx
sayfasından kaynak görünümüne gidin ve Şekil 2'de gösterildiği gibi etiketler arasındaki işaretlemeyi <asp:Content>
kopyalayın.
Şekil 2: Bildirim temelli İşaretlemeyi CheckBoxField.aspx
Pano'ya kopyalayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ardından, BatchDelete.aspx
içinde Kaynak görünümüne gidin ve panonun içeriğini <asp:Content>
etiketlerinin içine yapıştırın. Ayrıca içindeki code-behind sınıfının CheckBoxField.aspx.vb
içindeki kodu kopyalayıp içindeki code-behind sınıfının BatchDelete.aspx.vb
içine yapıştırın (DeleteSelectedProducts
Button'ın Click
olay işleyicisi, ToggleCheckState
metodu ve Click
ve CheckAll
Düğmeleri için UncheckAll
olay işleyicileri). Bu içeriği kopyaladıktan sonra, BatchDelete.aspx
sayfanın code-behind sınıfı aşağıdaki kodu içermelidir.
Partial Class BatchData_BatchDelete
Inherits System.Web.UI.Page
Protected Sub DeleteSelectedProducts_Click(sender As Object, e As EventArgs) _
Handles DeleteSelectedProducts.Click
Dim atLeastOneRowDeleted As Boolean = False
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing AndAlso cb.Checked Then
' Delete row! (Well, not really...)
atLeastOneRowDeleted = True
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' "Delete" the row
DeleteResults.Text &= String.Format _
("This would have deleted ProductID {0}<br />", productID)
'... To actually delete the product, use ...
' Dim productAPI As New ProductsBLL
' productAPI.DeleteProduct(productID)
'............................................
End If
Next
' Show the Label if at least one row was deleted...
DeleteResults.Visible = atLeastOneRowDeleted
End Sub
Private Sub ToggleCheckState(ByVal checkState As Boolean)
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing Then
cb.Checked = checkState
End If
Next
End Sub
Protected Sub CheckAll_Click(sender As Object, e As EventArgs) _
Handles CheckAll.Click
ToggleCheckState(True)
End Sub
Protected Sub UncheckAll_Click(sender As Object, e As EventArgs) _
Handles UncheckAll.Click
ToggleCheckState(False)
End Sub
End Class
Bildirimsel işaretleme ve kaynak kodu kopyaladıktan sonra, tarayıcıda görüntüleyerek BatchDelete.aspx
öğesini test etmek için biraz zaman ayırın. İlk on ürünün listelendiği bir GridView'da, her satırda ürün adı, kategorisi ve fiyatıyla birlikte bir onay kutusunu listeleyen bir görünüm görmeniz gerekir. Üç düğme olmalıdır: Tümünü Seç, Tümünün İşaretini Kaldır ve Seçili Ürünleri Sil. Tümünü Seç düğmesine tıklanması tüm onay kutularını seçerken, Tümünü Temizle seçeneği tüm onay kutularını temizler. Seçili Ürünleri Sil'e tıklanması, seçili ürünlerin değerlerini listeleyen ProductID
ancak aslında ürünleri silmeyen bir ileti görüntüler.
Şekil 3: Arabirim CheckBoxField.aspx
BatchDeleting.aspx
konumuna taşındı (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım: İşlemleri Kullanarak Seçili Ürünleri Silme
Başarıyla toplu silme arabirimi BatchDeleting.aspx
üzerine kopyalandıktan sonra yapılması gereken tek şey, Seçilen Ürünleri Sil düğmesinin DeleteProductsWithTransaction
sınıfındaki ProductsBLL
yöntemini kullanarak işaretlenen ürünleri silmesi için kodu güncellemektir.
Bir İşlem öğreticisindeki Sarmalama Veritabanı Değişiklikleri'ne eklenen bu yöntem, List(Of T)
'nin içindeki ProductID
değerlerini girdi olarak alır ve bir işlem kapsamında her bir karşılık gelen ProductID
'ü siler.
DeleteSelectedProducts
Button olay yöneticisi şu anda her GridView satırında yinelemek için aşağıdaki Click
döngüyü kullanır.
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing AndAlso cb.Checked Then
' Delete row! (Well, not really...)
atLeastOneRowDeleted = True
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' "Delete" the row
DeleteResults.Text &= String.Format _
("This would have deleted ProductID {0}<br />", productID)
'... To actually delete the product, use ...
' Dim productAPI As New ProductsBLL
' productAPI.DeleteProduct(productID)
'............................................
End If
Next
Her satır için ProductSelector
CheckBox Web denetimine program aracılığıyla başvurulur. İşaretlenirse, satır ProductID
koleksiyondan alınır ve DataKeys
Label DeleteResults
özelliği, satırın silinmek üzere seçildiğini belirten bir ileti içerecek şekilde güncellenir.
ProductsBLL
sınıfının Delete
yöntemine yapılan çağrı yorum satırı olarak eklendiğinden, yukarıdaki kod aslında hiçbir kaydı silmez. Bu silme mantığı uygulansaydı kod, ürünleri silerdi fakat bunu atomik bir işlem olarak gerçekleştirmezdi. Diğer bir ifadeyle, dizideki ilk birkaç silme işlemi başarılı olduysa ancak sonraki bir silme işlemi başarısız olursa (yabancı anahtar kısıtlama ihlali nedeniyle olabilir), bir özel durum oluşturulur ancak zaten silinmiş olan ürünler silinmeye devam eder.
Bölünmezliği sağlamak için bunun yerine sınıfın ProductsBLL
DeleteProductsWithTransaction
yöntemini kullanmamız gerekir. Bu yöntem bir değer listesi kabul ettiğinden ProductID
, önce bu listeyi kılavuzdan derlememiz ve ardından parametre olarak geçirmemiz gerekir. İlk olarak List(Of T)
türünden bir Integer
örneği oluştururuz. Döngü içinde For Each
, seçilen ürün ProductID
değerlerini bu List(Of T)
öğesine eklememiz gerekir. Döngüden sonra List(Of T)
öğesi, ProductsBLL
sınıfındaki DeleteProductsWithTransaction
yöntemine geçirilmelidir.
DeleteSelectedProducts
Button'un olay Click
işleyicisini aşağıdaki kodla güncelleştirin:
Protected Sub DeleteSelectedProducts_Click(sender As Object, e As EventArgs) _
Handles DeleteSelectedProducts.Click
' Create a List to hold the ProductID values to delete
Dim productIDsToDelete As New System.Collections.Generic.List(Of Integer)
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = CType(row.FindControl("ProductSelector"), CheckBox)
If cb IsNot Nothing AndAlso cb.Checked Then
' Save the ProductID value for deletion
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' Add it to the List...
productIDsToDelete.Add(productID)
' Add a confirmation message
DeleteResults.Text &= String.Format _
("ProductID {0} has been deleted<br />", productID)
End If
Next
' Call the DeleteProductsWithTransaction method and show the Label
' if at least one row was deleted...
If productIDsToDelete.Count > 0 Then
Dim productAPI As New ProductsBLL()
productAPI.DeleteProductsWithTransaction(productIDsToDelete)
DeleteResults.Visible = True
' Rebind the data to the GridView
Products.DataBind()
End If
End Sub
Güncellenmiş kod, türü List(Of T)
(Integer
) olan bir productIDsToDelete
oluşturur ve bunu silinecek ProductID
değerleriyle doldurur. Döngüden For Each
sonra, seçilen en az bir ürün varsa, ProductsBLL
sınıfın DeleteProductsWithTransaction
yöntemi çağrılır ve bu liste aktarılır. Etiket DeleteResults
de görüntülenir ve veriler GridView'a yönlendirilir (böylece yeni silinen kayıtlar artık kılavuzda satır olarak görünmez).
Şekil 4'de, silinmek üzere bir dizi satır seçildikten sonra GridView gösterilmektedir. Şekil 5'de, Seçili Ürünleri Sil düğmesine tıkladıktan hemen sonra ekran gösterilmektedir. Şekil 5'te ProductID
silinen kayıtların değerlerinin GridView'un altındaki Etikette görüntülendiğine ve bu satırların artık GridView'da olmadığına dikkat edin.
Şekil 4: Seçili Ürünler Silinecek (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 5: Silinen Ürünler ProductID
Değerleri GridView Altında Listelenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Yöntemin DeleteProductsWithTransaction
bölünmezliğini test etmek için, tabloya Order Details
bir ürünün girdisini el ile ekleyin ve ardından bu ürünü silmeyi deneyin (diğerleriyle birlikte). Ürünü ilişkili bir siparişle silmeye çalışırken yabancı anahtar kısıtlaması ihlali alırsınız, ancak seçilen diğer ürün silmelerinin nasıl geri alınacağını not edin.
Özet
Toplu silme arabirimi oluşturma işlemi, onay kutuları sütunu içeren bir GridView ve tıklandığında seçili satırların tümünü tek bir atomik işlem olarak silecek bir Düğme Web denetimi eklemeyi içerir. Bu öğreticide, önceki iki öğreticide yapılmış işleri bir araya getirerek bir arabirim oluşturduk: Onay Kutularının GridView Sütununu Ekleme ve Veritabanı Değişikliklerini bir İşlem İçinde Sarmalama. İlk öğreticide bir onay kutusu sütunu içeren bir GridView oluşturduk. İkincisinde ise, verilen bir List(Of T)
ProductID
değerler kümesi olduğunda bunların tümünü bir işlem kapsamında silen bir yöntemi BLL'de uyguladık.
Sonraki öğreticide toplu eklemeleri gerçekleştirmek için bir arabirim oluşturacağı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.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin öncü gözden geçirenleri Hilton Giesenow ve Teresa Murphy'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.