Aracılığıyla paylaş


Toplu Silme (VB)

tarafından Scott Mitchell

PDF'i indirin

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.

Her Satırda Onay Kutusu Vardır

Ş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.

CheckBoxField.aspx Bildirim İşaretlemeyi Panoya Kopyalama

Ş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.

CheckBoxField.aspx Arabirimi BatchDeleting.aspx'e Taşındı

Şekil 3: Arabirim CheckBoxField.aspxBatchDeleting.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 ProductsBLLDeleteProductsWithTransaction 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.

Seçili ürünler silinecek

Şekil 4: Seçili Ürünler Silinecek (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Silinen Ürünler Ürün Kimliği Değerleri GridView Altında Listelenir

Ş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.