Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
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.
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.
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.cs
ke dalam kelas code-behind di BatchDelete.aspx.cs
(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:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class BatchData_BatchDelete : System.Web.UI.Page
{
protected void DeleteSelectedProducts_Click(object sender, EventArgs e)
{
bool atLeastOneRowDeleted = false;
// Iterate through the Products.Rows property
foreach (GridViewRow row in Products.Rows)
{
// Access the CheckBox
CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
if (cb != null && cb.Checked)
{
// Delete row! (Well, not really...)
atLeastOneRowDeleted = true;
// First, get the ProductID for the selected row
int productID = 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 ...
//ProductsBLL productAPI = new ProductsBLL();
//productAPI.DeleteProduct(productID);
//............................................
}
}
// Show the Label if at least one row was deleted...
DeleteResults.Visible = atLeastOneRowDeleted;
}
private void ToggleCheckState(bool checkState)
{
// Iterate through the Products.Rows property
foreach (GridViewRow row in Products.Rows)
{
// Access the CheckBox
CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
if (cb != null)
cb.Checked = checkState;
}
}
protected void CheckAll_Click(object sender, EventArgs e)
{
ToggleCheckState(true);
}
protected void UncheckAll_Click(object sender, EventArgs e)
{
ToggleCheckState(false);
}
}
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.
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<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 foreach
untuk melakukan iterasi melalui setiap baris GridView:
// Iterate through the Products.Rows property
foreach (GridViewRow row in Products.Rows)
{
// Access the CheckBox
CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
if (cb != null && cb.Checked)
{
// Delete row! (Well, not really...)
atLeastOneRowDeleted = true;
// First, get the ProductID for the selected row
int productID = 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 ...
//ProductsBLL productAPI = new ProductsBLL();
//productAPI.DeleteProduct(productID);
//............................................
}
}
Untuk setiap baris, kontrol Kotak Centang Web ProductSelector
disebutkan secara programatis. Jika dicentang, baris ProductID
diambil dari koleksi DataKeys
dan properti Label s DeleteResults
Text
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<T>
dengan jenis int
. Dalam perulangan foreach
, kita perlu menambahkan nilai-nilai dari produk terpilih ProductID
ke dalam List<T>
. Setelah perulangan, ini List<T>
harus diteruskan ke ProductsBLL
metode kelas s DeleteProductsWithTransaction
. Perbarui pengendali acara DeleteSelectedProducts
Tombol Click
dengan kode berikut:
protected void DeleteSelectedProducts_Click(object sender, EventArgs e)
{
// Create a List to hold the ProductID values to delete
System.Collections.Generic.List<int> productIDsToDelete =
new System.Collections.Generic.List<int>();
// Iterate through the Products.Rows property
foreach (GridViewRow row in Products.Rows)
{
// Access the CheckBox
CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
if (cb != null && cb.Checked)
{
// Save the ProductID value for deletion
// First, get the ProductID for the selected row
int productID = 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);
}
}
// Call the DeleteProductsWithTransaction method and show the Label
// if at least one row was deleted...
if (productIDsToDelete.Count > 0)
{
ProductsBLL productAPI = new ProductsBLL();
productAPI.DeleteProductsWithTransaction(productIDsToDelete);
DeleteResults.Visible = true;
// Rebind the data to the GridView
Products.DataBind();
}
}
Kode diperbarui List<T>
membuat objek jenis int
(productIDsToDelete
) dan mengisinya dengan nilai ProductID
yang akan dihapus. Setelah perulangan foreach
, 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.
Gambar 4: Produk yang Dipilih Akan Dihapus (Klik untuk melihat gambar ukuran penuh)
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<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.