Bagikan melalui


Penghapusan Batch (VB)

oleh Scott Mitchell

Unduh PDF

Pelajari cara menghapus beberapa rekaman database dalam satu operasi. Di Lapisan Antarmuka Pengguna, kami membangun GridView yang disempurnakan yang dibuat dalam tutorial sebelumnya. Di Lapisan Akses Data, kami membungkus beberapa operasi Hapus dalam transaksi untuk memastikan bahwa semua penghapusan berhasil atau semua penghapusan digulung balik.

Pendahuluan

Tutorial sebelumnya mengeksplorasi cara membuat antarmuka pengeditan batch menggunakan GridView yang dapat diedit sepenuhnya. Dalam situasi di mana pengguna biasanya mengedit banyak rekaman sekaligus, antarmuka pengeditan batch akan membutuhkan lebih sedikit postback dan sakelar konteks keyboard-ke-mouse, sehingga meningkatkan efisiensi pengguna akhir. Teknik ini juga berguna untuk halaman di mana umum bagi pengguna untuk menghapus banyak rekaman dalam sekali jalan.

Siapa pun yang telah menggunakan klien email online sudah terbiasa dengan salah satu antarmuka penghapusan batch yang paling umum: kotak centang di setiap baris dalam kisi dengan tombol Hapus Semua Item yang Dicentang yang sesuai (lihat Gambar 1). Tutorial ini agak singkat karena kita telah melakukan semua kerja keras dalam tutorial sebelumnya dalam membuat antarmuka berbasis web dan metode untuk menghapus serangkaian rekaman sebagai operasi atom tunggal. Dalam tutorial Menambahkan Kolom Kotak Centang GridView, kami membuat GridView dengan kolom kotak centang dan dalam tutorial Pembungkusan Modifikasi Database dalam Transaksi, kami membuat metode di BLL yang menggunakan transaksi untuk menghapus List<T>ProductID nilai. Dalam tutorial ini, kami akan membangun dan menggabungkan pengalaman kami sebelumnya untuk membuat contoh penghapusan batch yang berfungsi.

Setiap Baris Menyertakan Kotak Centang

Gambar 1: Setiap Baris Menyertakan Kotak Centang (Klik untuk melihat gambar ukuran penuh)

Langkah 1: Membuat Antarmuka Penghapusan Batch

Karena kita sudah membuat antarmuka penghapusan batch di tutorial Menambahkan Kolom Kotak Centang GridView, kita cukup menyalinnya ke BatchDelete.aspx daripada membuatnya dari awal. Mulailah dengan membuka BatchDelete.aspx halaman di BatchData folder dan CheckBoxField.aspx halaman di EnhancedGridView folder. CheckBoxField.aspx Dari halaman, buka tampilan Sumber dan salin markup di antara <asp:Content> tag seperti yang ditunjukkan pada Gambar 2.

Menyalin Markup Deklaratif CheckBoxField.aspx ke Papan Klip

Gambar 2: Salin Markup CheckBoxField.aspx Deklaratif ke Clipboard (Klik untuk melihat gambar ukuran penuh)

Selanjutnya, buka tampilan Sumber di BatchDelete.aspx dan tempelkan konten clipboard di dalam <asp:Content> tag. Salin dan tempel kode dari dalam kelas code-behind di CheckBoxField.aspx.vb ke dalam kelas code-behind di BatchDelete.aspx.vb (penangan peristiwa DeleteSelectedProducts untuk Tombol Click, metode ToggleCheckState, dan penanganan peristiwa untuk Tombol Click dan CheckAll). Setelah menyalin konten ini, kode di kelas code-behind dari halaman BatchDelete.aspx harus berisi kode berikut:

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

Setelah menyalin markup deklaratif dan kode sumber, luangkan waktu sejenak untuk mengujinya BatchDelete.aspx dengan melihatnya melalui browser. Anda akan melihat GridView yang mencantumkan sepuluh produk pertama, dengan setiap baris mencantumkan nama, kategori, dan harga produk, serta kotak centang. Harus ada tiga tombol: Centang Semua, Hapus Centang Semua, dan Hapus Produk yang Dipilih. Mengklik tombol Centang Semua akan memilih semua kotak centang, sedangkan tombol Kosongkan Semua akan menghapus semua pilihan kotak centang. Mengklik Hapus Produk Terpilih menampilkan pesan yang mencantumkan ProductID nilai produk yang dipilih, tetapi tidak benar-benar menghapus produk.

Antarmuka dari CheckBoxField.aspx telah Dipindahkan ke BatchDeleting.aspx

Gambar 3: Antarmuka dari CheckBoxField.aspx telah Dipindahkan ke BatchDeleting.aspx (Klik untuk melihat gambar ukuran penuh)

Langkah 2: Menghapus Produk yang Diperiksa Menggunakan Transaksi

Dengan antarmuka penghapusan batch berhasil disalin ke BatchDeleting.aspx, yang tersisa adalah memperbarui kode sehingga tombol Hapus Produk yang Dipilih menghapus produk yang dicentang menggunakan DeleteProductsWithTransaction metode di ProductsBLL kelas . Metode ini, yang ditambahkan dalam tutorial Modifikasi Database Pembungkusan dalam Transaksi, menerima List(Of T) dari nilai-nilai ProductID sebagai input dan menghapus setiap ProductID yang sesuai dalam lingkup transaksi.

Handler DeleteSelectedProducts aktivitas Tombol Click saat ini menggunakan perulangan berikut For Each untuk melakukan iterasi melalui setiap baris GridView:

' 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

Untuk setiap baris, kontrol Kotak Centang Web ProductSelector disebutkan secara programatis. Jika dicentang, baris ProductID diambil dari koleksi DataKeys dan properti Label s DeleteResultsText diperbarui untuk menyertakan pesan yang menunjukkan bahwa baris tersebut dipilih untuk dihapus.

Kode di atas sebenarnya tidak menghapus catatan apa pun karena panggilan ke metode kelas yang dipanggil ProductsBLL dikomentari. Jika logika penghapusan ini diterapkan, kode akan menghapus produk tetapi tidak sebagai operasi atomik. Artinya, jika beberapa penghapusan pertama dalam urutan berhasil, tetapi yang lebih baru gagal (mungkin karena pelanggaran batasan kunci asing), pengecualian akan dilemparkan tetapi produk yang sudah dihapus akan tetap dihapus.

Untuk memastikan atomicitas, kita perlu menggunakan metode dalam kelas ProductsBLL s DeleteProductsWithTransaction. Karena metode ini menerima daftar ProductID nilai, kita perlu terlebih dahulu mengkompilasi daftar ini dari kisi dan kemudian meneruskannya sebagai parameter. Kami pertama-tama membuat sebuah instans dari List(Of T) dengan jenis Integer. Dalam perulangan For Each, kita perlu menambahkan nilai-nilai dari produk terpilih ProductID ke dalam List(Of T). Setelah perulangan, ini List(Of T) harus diteruskan ke ProductsBLL metode kelas s DeleteProductsWithTransaction . Perbarui pengendali acara DeleteSelectedProducts Tombol Click dengan kode berikut:

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

Kode diperbarui List(Of T) membuat objek jenis Integer (productIDsToDelete) dan mengisinya dengan nilai ProductID yang akan dihapus. Setelah perulangan For Each, jika setidaknya ada satu produk yang dipilih, metode kelas ProductsBLL dipanggil DeleteProductsWithTransaction dan daftar ini diteruskan. DeleteResults Label juga ditampilkan dan data diikat ulang ke GridView (sehingga rekaman yang baru saja dihapus tidak lagi muncul sebagai baris di grid).

Gambar 4 memperlihatkan GridView setelah sejumlah baris dipilih untuk dihapus. Gambar 5 memperlihatkan layar segera setelah tombol Hapus Produk yang Dipilih diklik. Perhatikan bahwa di Gambar 5 ProductID nilai rekaman yang dihapus ditampilkan di Label di bawah GridView dan baris tersebut tidak lagi berada di GridView.

Produk Yang Dipilih Akan Dihapus

Gambar 4: Produk yang Dipilih Akan Dihapus (Klik untuk melihat gambar ukuran penuh)

Nilai ProductID Produk yang Dihapus Tercantum di bawah GridView

Gambar 5: Nilai Produk ProductID yang Dihapus Tercantum di bawah GridView (Klik untuk melihat gambar ukuran penuh)

Nota

Untuk menguji atomitas dari metode DeleteProductsWithTransaction, tambahkan entri produk secara manual dalam tabel Order Details lalu coba hapus produk tersebut bersama dengan produk lainnya. Anda akan menerima pelanggaran batasan kunci asing saat mencoba menghapus produk dengan pesanan terkait, tetapi perhatikan bagaimana penghapusan produk lain yang dipilih digulung balik.

Ringkasan

Membuat antarmuka penghapusan batch melibatkan penambahan GridView dengan kolom kotak centang dan kontrol tombol Web yang, ketika diklik, akan menghapus semua baris yang dipilih sebagai operasi tunggal yang tak terpisahkan. Dalam tutorial ini kami membangun antarmuka seperti itu dengan mengumpulkan pekerjaan yang dilakukan dalam dua tutorial sebelumnya, Menambahkan Kolom Kotak Centang GridView dan Membungkus Modifikasi Database dalam Transaksi. Dalam tutorial pertama kami membuat GridView dengan kolom berisi kotak centang dan dalam tutorial berikutnya kami menerapkan metode di BLL yang, ketika melewati nilai List(Of T)ProductID, menghapus semuanya dalam cakupan transaksi.

Untuk tutorial berikutnya, kita akan membuat antarmuka untuk melakukan penyisipan secara batch.

Selamat Pemrograman!

Tentang Penulis

Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.

Ucapan terima kasih khusus kepada

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Hilton Giesenow dan Teresa Murphy. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.