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 memperbarui beberapa rekaman database dalam satu operasi. Di Lapisan Antarmuka Pengguna, kami membangun GridView tempat setiap baris dapat diedit. Di Lapisan Akses Data, kami membungkus beberapa operasi Pembaruan dalam transaksi untuk memastikan bahwa semua pembaruan berhasil atau semua pembaruan digulung balik.
Pendahuluan
Dalam tutorial sebelumnya kita melihat cara memperluas Lapisan Akses Data untuk menambahkan dukungan untuk transaksi database. Transaksi database menjamin bahwa serangkaian pernyataan modifikasi data akan diperlakukan sebagai satu operasi atom, yang memastikan bahwa semua modifikasi akan gagal atau semua akan berhasil. Dengan fungsionalitas DAL tingkat rendah ini, kami siap untuk mengalihkan perhatian kami untuk membuat antarmuka modifikasi data batch.
Dalam tutorial ini kita akan membangun GridView di mana setiap baris dapat diedit (lihat Gambar 1). Karena setiap baris dirender dalam antarmuka pengeditannya, tidak perlu kolom tombol Edit, Perbarui, dan Batalkan. Sebagai gantinya, ada dua tombol Perbarui Produk di halaman yang, ketika diklik, menghitung baris GridView dan memperbarui database.
Gambar 1: Setiap Baris di GridView Dapat Diedit (Klik untuk melihat gambar ukuran penuh)
Mari kita mulai!
Catatan
Dalam tutorial Melakukan Pembaruan Batch , kami membuat antarmuka pengeditan batch menggunakan kontrol DataList. Tutorial ini berbeda dari yang sebelumnya dalam yang menggunakan GridView dan pembaruan batch dilakukan dalam cakupan transaksi. Setelah menyelesaikan tutorial ini, saya mendorong Anda untuk kembali ke tutorial sebelumnya dan memperbaruinya untuk menggunakan fungsionalitas terkait transaksi database yang ditambahkan dalam tutorial sebelumnya.
Memeriksa Langkah-Langkah untuk Membuat Semua Baris GridView Dapat Diedit
Seperti yang dibahas dalam tutorial Gambaran Umum Menyisipkan, Memperbarui, dan Menghapus Data , GridView menawarkan dukungan bawaan untuk mengedit data dasarnya berdasarkan per baris. Secara internal, GridView mencatat baris apa yang dapat diedit melalui propertinyaEditIndex
. Karena GridView sedang terikat ke sumber datanya, GridView memeriksa setiap baris untuk melihat apakah indeks baris sama dengan nilai EditIndex
. Jika demikian, bidang baris tersebut dirender menggunakan antarmuka pengeditannya. Untuk BoundFields, antarmuka pengeditan adalah TextBox yang propertinya Text
diberi nilai bidang data yang ditentukan oleh properti BoundField s DataField
. Untuk TemplateFields, EditItemTemplate
digunakan sebagai pengganti ItemTemplate
.
Ingat bahwa alur kerja pengeditan dimulai saat pengguna mengklik tombol Edit baris. Ini menyebabkan postback, mengatur properti GridView ke EditIndex
indeks baris s yang diklik, dan mengikat ulang data ke kisi. Saat tombol Batalkan baris diklik, pada postback EditIndex
, diatur ke nilai -1
sebelum mengikat ulang data ke kisi. Karena baris GridView mulai mengindeks pada nol, pengaturan EditIndex
ke -1
memiliki efek menampilkan GridView dalam mode baca-saja.
Properti EditIndex
berfungsi dengan baik untuk pengeditan per baris, tetapi tidak dirancang untuk pengeditan batch. Untuk membuat seluruh GridView dapat diedit, kita harus membuat setiap baris dirender menggunakan antarmuka pengeditannya. Cara termudah untuk mencapai hal ini adalah dengan membuat di mana setiap bidang yang dapat diedit diimplementasikan sebagai TemplateField dengan antarmuka pengeditannya yang ditentukan dalam ItemTemplate
.
Selama beberapa langkah berikutnya, kita akan membuat GridView yang dapat diedit sepenuhnya. Di Langkah 1 kita akan mulai dengan membuat GridView dan ObjectDataSource-nya dan mengonversi BoundFields dan CheckBoxField menjadi TemplateFields. Di Langkah 2 dan 3 kita akan memindahkan antarmuka pengeditan dari TemplateFields EditItemTemplate
ke antarmukanya ItemTemplate
.
Langkah 1: Menampilkan Informasi Produk
Sebelum kita khawatir tentang membuat GridView di mana baris dapat diedit, mari kita mulai dengan hanya menampilkan informasi produk.
BatchUpdate.aspx
Buka halaman di BatchData
folder dan seret GridView dari Kotak Alat ke Perancang. Atur GridView ke ID
ProductsGrid
dan, dari tag pintarnya, pilih untuk mengikatnya ke ObjectDataSource baru bernama ProductsDataSource
. Konfigurasikan ObjectDataSource untuk mengambil datanya dari ProductsBLL
metode kelas.GetProducts
Gambar 2: Konfigurasikan ObjectDataSource untuk Menggunakan ProductsBLL
Kelas (Klik untuk melihat gambar ukuran penuh)
Gambar 3: Ambil Data Produk Menggunakan GetProducts
Metode (Klik untuk melihat gambar ukuran penuh)
Seperti GridView, fitur modifikasi ObjectDataSource dirancang untuk bekerja berdasarkan per baris. Untuk memperbarui sekumpulan rekaman, kita harus menulis sedikit kode di kelas code-behind halaman ASP.NET yang menambatkan data dan meneruskannya ke BLL. Oleh karena itu, atur daftar drop-down di tab UPDATE, INSERT, dan DELETE ObjectDataSource ke (Tidak Ada). Klik Selesai untuk menyelesaikan wizard.
Gambar 4: Atur Daftar Drop-Down di Tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak Ada) (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard Konfigurasi Sumber Data, markup deklaratif ObjectDataSource akan terlihat seperti berikut ini:
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
Menyelesaikan wizard Konfigurasi Sumber Data juga menyebabkan Visual Studio membuat BoundFields dan CheckBoxField untuk bidang data produk di GridView. Untuk tutorial ini, mari kita hanya mengizinkan pengguna untuk melihat dan mengedit nama produk, kategori, harga, dan status yang dihentikan. Hapus semua kecuali ProductName
bidang , , CategoryName
UnitPrice
, dan Discontinued
dan dan ganti nama HeaderText
properti dari tiga bidang pertama menjadi Produk, Kategori, dan Harga, masing-masing. Terakhir, centang kotak Aktifkan Halaman dan Aktifkan Pengurutan di tag pintar GridView.
Pada titik ini GridView memiliki tiga BoundFields (ProductName
, , dan CategoryName
) dan CheckBoxField (UnitPrice
Discontinued
). Kita perlu mengonversi keempat bidang ini menjadi TemplateFields dan kemudian memindahkan antarmuka pengeditan dari TemplateFields EditItemTemplate
ke ItemTemplate
.
Catatan
Kami mengeksplorasi pembuatan dan penyesuaian TemplateFields dalam tutorial Menyesuaikan Antarmuka Modifikasi Data . Kita akan menelusuri langkah-langkah mengonversi BoundFields dan CheckBoxField menjadi TemplateFields dan mendefinisikan antarmuka pengeditan mereka di dalamnya ItemTemplate
, tetapi jika Anda terjebak atau membutuhkan penyegaran, jangan ragu untuk merujuk kembali ke tutorial sebelumnya ini.
Dari tag pintar GridView, klik tautan Edit Kolom untuk membuka kotak dialog Bidang. Selanjutnya, pilih setiap bidang dan klik tautan Konversi bidang ini menjadi TemplateField.
Gambar 5: Konversi BoundFields dan CheckBoxField yang Ada Menjadi TemplateFields
Sekarang setelah setiap bidang adalah TemplateField, kami siap untuk memindahkan antarmuka pengeditan dari EditItemTemplate
s ke ItemTemplate
s.
Langkah 2: MembuatProductName
,UnitPrice
danDiscontinued
Mengedit Antarmuka
ProductName
Membuat antarmuka pengeditan , , UnitPrice
dan Discontinued
adalah topik dari langkah ini dan cukup mudah, karena setiap antarmuka sudah didefinisikan dalam TemplateFields EditItemTemplate
.
CategoryName
Membuat antarmuka pengeditan sedikit lebih terlibat karena kita perlu membuat DropDownList dari kategori yang berlaku. Antarmuka pengeditan ini CategoryName
ditanggulangi di Langkah 3.
Mari kita mulai dengan ProductName
TemplateField. Klik tautan Edit Templat dari tag pintar GridView dan telusuri paling detail ke ProductName
TemplateFields EditItemTemplate
. Pilih Kotak Teks, salin ke clipboard, lalu tempelkan ke ProductName
TemplateFields ItemTemplate
. Ubah properti TextBox menjadi ID
ProductName
.
Selanjutnya, tambahkan RequiredFieldValidator ke ItemTemplate
untuk memastikan bahwa pengguna memberikan nilai untuk setiap nama produk. Atur ControlToValidate
properti ke ProductName, ErrorMessage
properti ke Anda harus memberikan nama produk.
Text
dan properti ke *. Setelah membuat penambahan ini ke ItemTemplate
, layar Anda akan terlihat mirip dengan Gambar 6.
Gambar 6: ProductName
TemplateField Sekarang Menyertakan Kotak Teks dan RequiredFieldValidator (Klik untuk melihat gambar ukuran penuh)
UnitPrice
Untuk antarmuka pengeditan, mulailah dengan menyalin TextBox dari EditItemTemplate
ke ItemTemplate
. Selanjutnya, tempatkan $ di depan TextBox dan atur propertinya ID
ke UnitPrice dan propertinya Columns
ke 8 .
Tambahkan juga CompareValidator ke UnitPrice
s ItemTemplate
untuk memastikan bahwa nilai yang dimasukkan oleh pengguna adalah nilai mata uang yang valid lebih besar dari atau sama dengan $0,00. Atur properti validator ke ControlToValidate
UnitPrice, propertinya ErrorMessage
ke Anda harus memasukkan nilai mata uang yang valid. Harap hilangkan simbol mata uang apa pun., propertinya Text
ke *, propertinya Type
ke Currency
, propertinya Operator
ke GreaterThanEqual
, dan propertinya ValueToCompare
menjadi 0 .
Gambar 7: Tambahkan CompareValidator untuk Memastikan Harga yang Dimasukkan adalah Nilai Mata Uang Non-Negatif (Klik untuk melihat gambar ukuran penuh)
Discontinued
Untuk TemplateField, Anda dapat menggunakan Kotak Centang yang sudah ditentukan di ItemTemplate
. Cukup atur ID
ke Dihentikan dan propertinya Enabled
ke True
.
Langkah 3: MembuatCategoryName
Antarmuka Pengeditan
Antarmuka pengeditan di CategoryName
TemplateFields EditItemTemplate
berisi Kotak Teks yang menampilkan nilai CategoryName
bidang data. Kita perlu mengganti ini dengan DropDownList yang mencantumkan kategori yang mungkin.
Catatan
Tutorial Menyesuaikan Antarmuka Modifikasi Data berisi diskusi yang lebih menyeluruh dan lengkap tentang menyesuaikan templat untuk menyertakan DropDownList dibandingkan dengan TextBox. Meskipun langkah-langkah di sini selesai, langkah-langkah tersebut disajikan secara tersely. Untuk melihat lebih mendalam dalam membuat dan mengonfigurasi kategori DropDownList, lihat kembali tutorial Menyesuaikan Antarmuka Modifikasi Data .
Seret DropDownList dari Kotak Alat ke CategoryName
TemplateFields ItemTemplate
, atur ID
ke Categories
. Pada titik ini kita biasanya akan menentukan sumber data DropDownLists melalui tag pintarnya, membuat ObjectDataSource baru. Namun, ini akan menambahkan ObjectDataSource dalam ItemTemplate
, yang akan menghasilkan instans ObjectDataSource yang dibuat untuk setiap baris GridView. Sebagai gantinya, mari kita buat ObjectDataSource di luar GridView s TemplateFields. Akhiri pengeditan templat dan seret ObjectDataSource dari Kotak Alat ke Perancang di bawah ProductsDataSource
ObjectDataSource. Beri nama ObjectDataSource CategoriesDataSource
baru dan konfigurasikan untuk menggunakan CategoriesBLL
metode kelas.GetCategories
Gambar 8: Konfigurasikan ObjectDataSource untuk Menggunakan CategoriesBLL
Kelas (Klik untuk melihat gambar ukuran penuh)
Gambar 9: Ambil Data Kategori Menggunakan GetCategories
Metode (Klik untuk melihat gambar ukuran penuh)
Karena ObjectDataSource ini digunakan hanya untuk mengambil data, atur daftar drop-down di tab PERBARUI dan HAPUS ke (Tidak Ada). Klik Selesai untuk menyelesaikan wizard.
Gambar 10: Atur Daftar Drop-Down di Tab PERBARUI dan HAPUS ke (Tidak Ada) (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard, CategoriesDataSource
markup deklaratif akan terlihat seperti berikut ini:
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
Dengan dibuat dan dikonfigurasi CategoriesDataSource
, kembali ke CategoryName
TemplateField s ItemTemplate
dan, dari tag pintar DropDownList, klik tautan Pilih Sumber Data. Di wizard Konfigurasi Sumber Data, pilih CategoriesDataSource
opsi dari daftar drop-down pertama dan pilih untuk digunakan CategoryName
untuk tampilan dan CategoryID
sebagai nilai.
Gambar 11: Ikat DropDownList ke CategoriesDataSource
(Klik untuk melihat gambar ukuran penuh)
Pada titik Categories
ini DropDownList mencantumkan semua kategori, tetapi belum secara otomatis memilih kategori yang sesuai untuk produk yang terikat ke baris GridView. Untuk mencapai hal ini, kita perlu mengatur Categories
DropDownList ke SelectedValue
nilai produk CategoryID
. Klik tautan Edit DataBindings dari tag pintar DropDownList dan kaitkan SelectedValue
properti dengan CategoryID
bidang data seperti yang ditunjukkan pada Gambar 12.
Gambar 12: Ikat Nilai Produk CategoryID
ke Properti DropDownList SelectedValue
Satu masalah terakhir tetap ada: jika produk tidak memiliki nilai yang CategoryID
ditentukan maka pernyataan pengikatan data akan SelectedValue
menghasilkan pengecualian. Ini karena DropDownList hanya berisi item untuk kategori dan tidak menawarkan opsi untuk produk yang memiliki NULL
nilai database untuk CategoryID
. Untuk memperbaikinya, atur properti AppendDataBoundItems
DropDownList ke True
dan tambahkan item baru ke DropDownList, hilangkan Value
properti dari sintaks deklaratif. Artinya, pastikan bahwa Categories
sintaks deklaratif DropDownList terlihat seperti berikut ini:
<asp:DropDownList ID="Categories" runat="server" AppendDataBoundItems="True"
DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'>
<asp:ListItem Value=">-- Select One --</asp:ListItem>
</asp:DropDownList>
Perhatikan bagaimana <asp:ListItem Value="">
-- Pilih Satu -- memiliki atributnya Value
yang secara eksplisit diatur ke string kosong. Lihat kembali tutorial Menyesuaikan Antarmuka Modifikasi Data untuk diskusi yang lebih menyeluruh tentang mengapa item DropDownList tambahan ini diperlukan untuk menangani NULL
kasus dan mengapa penugasan Value
properti ke string kosong sangat penting.
Catatan
Ada potensi masalah performa dan skalabilitas di sini yang layak disebutkan. Karena setiap baris memiliki DropDownList yang menggunakan CategoriesDataSource
sebagai sumber datanya, CategoriesBLL
metode kelas s GetCategories
akan dipanggil n kali per kunjungan halaman, di mana n adalah jumlah baris di GridView. Ada n panggilan ke GetCategories
yang menghasilkan n kueri ke database. Dampak ini pada database dapat dikurangi dengan penembolokan kategori yang dikembalikan baik dalam cache per permintaan atau melalui Lapisan Penembolokan menggunakan dependensi penembolokan SQL atau kedaluwarsa berbasis waktu yang sangat singkat.
Langkah 4: Menyelesaikan Antarmuka Pengeditan
Kami telah membuat sejumlah perubahan pada templat GridView tanpa menjeda untuk melihat kemajuan kami. Luangkan waktu sejenak untuk melihat kemajuan kami melalui browser. Seperti yang ditunjukkan Gambar 13, setiap baris dirender menggunakan ItemTemplate
, yang berisi antarmuka pengeditan sel.
Gambar 13: Setiap Baris GridView Dapat Diedit (Klik untuk melihat gambar ukuran penuh)
Ada beberapa masalah pemformatan kecil yang harus kita urus pada saat ini. Pertama, perhatikan bahwa UnitPrice
nilai berisi empat titik desimal. Untuk memperbaikinya, kembali ke UnitPrice
TemplateField s ItemTemplate
dan, dari tag pintar TextBox, klik tautan Edit DataBindings. Selanjutnya, tentukan Text
bahwa properti harus diformat sebagai angka.
Gambar 14: Format Text
Properti sebagai Angka
Kedua, mari kita tengahkan kotak centang di Discontinued
kolom (daripada rata kiri). Klik Edit Kolom dari tag pintar GridView dan pilih Discontinued
TemplateField dari daftar bidang di sudut kiri bawah. Telusuri paling detail ItemStyle
dan atur properti ke Tengah seperti yang HorizontalAlign
ditunjukkan pada Gambar 15.
Gambar 15: Tengahkan Discontinued
Kotak Centang
Selanjutnya, tambahkan kontrol ValidationSummary ke halaman dan atur propertinya ShowMessageBox
ke True
dan propertinya ShowSummary
ke False
. Tambahkan juga kontrol Web Tombol yang, ketika diklik, akan memperbarui perubahan pengguna. Secara khusus, tambahkan dua kontrol Web Tombol, satu di atas GridView dan satu di bawahnya, mengatur kedua properti kontrol Text
ke Perbarui Produk .
Karena antarmuka pengeditan GridView didefinisikan dalam TemplateFields-nya ItemTemplate
, EditItemTemplate
antarmukanya berlebihan dan dapat dihapus.
Setelah membuat perubahan pemformatan yang disebutkan di atas, menambahkan kontrol Tombol, dan menghapus EditItemTemplate
sintaks deklaratif halaman Anda akan terlihat seperti berikut ini:
<p>
<asp:Button ID="UpdateAllProducts1" runat="server" Text="Update Products" />
</p>
<p>
<asp:GridView ID="ProductsGrid" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
AllowPaging="True" AllowSorting="True">
<Columns>
<asp:TemplateField HeaderText="Product" SortExpression="ProductName">
<ItemTemplate>
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="ProductName"
ErrorMessage="You must provide the product's name."
runat="server">*</asp:RequiredFieldValidator>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Category"
SortExpression="CategoryName">
<ItemTemplate>
<asp:DropDownList ID="Categories" runat="server"
AppendDataBoundItems="True"
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName"
DataValueField="CategoryID"
SelectedValue='<%# Bind("CategoryID") %>'>
<asp:ListItem>-- Select One --</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Price"
SortExpression="UnitPrice">
<ItemTemplate>
$<asp:TextBox ID="UnitPrice" runat="server" Columns="8"
Text='<%# Bind("UnitPrice", "{0:N}") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="UnitPrice"
ErrorMessage="You must enter a valid currency value.
Please omit any currency symbols."
Operator="GreaterThanEqual" Type="Currency"
ValueToCompare="0">*</asp:CompareValidator>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
<ItemTemplate>
<asp:CheckBox ID="Discontinued" runat="server"
Checked='<%# Bind("Discontinued") %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
</Columns>
</asp:GridView>
</p>
<p>
<asp:Button ID="UpdateAllProducts2" runat="server" Text="Update Products" />
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
ShowMessageBox="True" ShowSummary="False" />
</p>
Gambar 16 memperlihatkan halaman ini saat dilihat melalui browser setelah kontrol Web Tombol ditambahkan dan perubahan pemformatan dibuat.
Gambar 16: Halaman Sekarang Menyertakan Dua Tombol Perbarui Produk (Klik untuk melihat gambar ukuran penuh)
Langkah 5: Memperbarui Produk
Ketika pengguna mengunjungi halaman ini, mereka akan melakukan modifikasi dan kemudian mengklik salah satu dari dua tombol Perbarui Produk. Pada saat itu kita perlu menyimpan nilai yang dimasukkan pengguna untuk setiap baris ke dalam ProductsDataTable
instans dan kemudian meneruskan itu ke metode BLL yang kemudian akan meneruskan ProductsDataTable
instans tersebut ke metode DAL s UpdateWithTransaction
. Metode UpdateWithTransaction
, yang kami buat dalam tutorial sebelumnya, memastikan bahwa batch perubahan akan diperbarui sebagai operasi atomik.
Buat metode bernama BatchUpdate
di BatchUpdate.aspx.vb
dan tambahkan kode berikut:
Private Sub BatchUpdate()
' Enumerate the GridView's Rows collection and create a ProductRow
Dim productsAPI As New ProductsBLL()
Dim products As Northwind.ProductsDataTable = productsAPI.GetProducts()
For Each gvRow As GridViewRow In ProductsGrid.Rows
' Find the ProductsRow instance in products that maps to gvRow
Dim productID As Integer = _
Convert.ToInt32(ProductsGrid.DataKeys(gvRow.RowIndex).Value)
Dim product As Northwind.ProductsRow = products.FindByProductID(productID)
If product IsNot Nothing Then
' Programmatically access the form field elements in the
' current GridViewRow
Dim productName As TextBox = _
CType(gvRow.FindControl("ProductName"), TextBox)
Dim categories As DropDownList = _
CType(gvRow.FindControl("Categories"), DropDownList)
Dim unitPrice As TextBox = _
CType(gvRow.FindControl("UnitPrice"), TextBox)
Dim discontinued As CheckBox = _
CType(gvRow.FindControl("Discontinued"), CheckBox)
' Assign the user-entered values to the current ProductRow
product.ProductName = productName.Text.Trim()
If categories.SelectedIndex = 0 Then
product.SetCategoryIDNull()
Else
product.CategoryID = Convert.ToInt32(categories.SelectedValue)
End If
If unitPrice.Text.Trim().Length = 0 Then
product.SetUnitPriceNull()
Else
product.UnitPrice = Convert.ToDecimal(unitPrice.Text)
End If
product.Discontinued = discontinued.Checked
End If
Next
' Now have the BLL update the products data using a transaction
productsAPI.UpdateWithTransaction(products)
End Sub
Metode ini dimulai dengan mendapatkan semua produk kembali melalui ProductsDataTable
panggilan ke metode BLL s GetProducts
. Kemudian melakukan enumerasi pada koleksi ProductGrid
GridViewRows
. Koleksi Rows
berisi GridViewRow
instance untuk setiap baris yang ditampilkan di GridView. Karena kami menampilkan paling banyak sepuluh baris per halaman, koleksi GridView akan Rows
memiliki tidak lebih dari sepuluh item.
Untuk setiap baris, ProductID
diambil dari DataKeys
koleksi dan yang sesuai ProductsRow
dipilih dari ProductsDataTable
. Empat kontrol input TemplateField direferensikan secara terprogram dan nilainya ditetapkan ke ProductsRow
properti instans. Setelah setiap nilai baris GridView digunakan untuk memperbarui ProductsDataTable
, nilai tersebut diteruskan ke metode BLL s UpdateWithTransaction
yang, seperti yang kita lihat dalam tutorial sebelumnya, hanya memanggil ke dalam metode DAL s UpdateWithTransaction
.
Algoritma pembaruan batch yang digunakan untuk tutorial ini memperbarui setiap baris dalam ProductsDataTable
yang sesuai dengan baris di GridView, terlepas dari apakah informasi produk telah diubah. Meskipun pembaruan buta tersebut biasanya bukan masalah performa, pembaruan tersebut dapat menyebabkan rekaman berlebihan jika Anda mengaudit perubahan pada tabel database. Kembali ke tutorial Melakukan Pembaruan Batch , kami menjelajahi antarmuka pembaruan batch dengan DataList dan menambahkan kode yang hanya akan memperbarui rekaman yang benar-benar dimodifikasi oleh pengguna. Jangan ragu untuk menggunakan teknik dari Melakukan Pembaruan Batch untuk memperbarui kode dalam tutorial ini, jika diinginkan.
Catatan
Saat mengikat sumber data ke GridView melalui tag pintarnya, Visual Studio secara otomatis menetapkan nilai kunci utama sumber data ke properti GridView DataKeyNames
. Jika Anda tidak mengikat ObjectDataSource ke GridView melalui tag pintar GridView seperti yang diuraikan di Langkah 1, maka Anda harus mengatur properti GridView s DataKeyNames
secara manual ke ProductID untuk mengakses ProductID
nilai untuk setiap baris melalui DataKeys
koleksi.
Kode yang digunakan BatchUpdate
mirip dengan yang digunakan dalam metode BLL s UpdateProduct
, perbedaan utamanya adalah bahwa dalam UpdateProduct
metode hanya satu ProductRow
instans yang diambil dari arsitektur. Kode yang menetapkan properti ProductRow
sama antara UpdateProducts
metode dan kode dalam For Each
perulangan di BatchUpdate
, seperti pola keseluruhan.
Untuk menyelesaikan tutorial ini, kita perlu meminta BatchUpdate
metode ketika salah satu tombol Perbarui Produk diklik. Buat penanganan aktivitas untuk Click
peristiwa kedua kontrol Tombol ini dan tambahkan kode berikut di penanganan aktivitas:
BatchUpdate()
ClientScript.RegisterStartupScript(Me.GetType(), "message", _
"alert('The products have been updated.');", True)
Pertama, panggilan dilakukan ke BatchUpdate
. Selanjutnya, ClientScript
properti digunakan untuk menyuntikkan JavaScript yang akan menampilkan kotak pesan yang membaca Produk telah diperbarui.
Luangkan waktu satu menit untuk menguji kode ini. Kunjungi BatchUpdate.aspx
melalui browser, edit sejumlah baris, dan klik salah satu tombol Perbarui Produk. Dengan asumsi tidak ada kesalahan validasi input, Anda akan melihat kotak pesan yang membaca Produk telah diperbarui. Untuk memverifikasi atomitas pembaruan, pertimbangkan untuk menambahkan batasan acak CHECK
, seperti yang melarang UnitPrice
nilai 1234.56. Kemudian dari BatchUpdate.aspx
, edit sejumlah rekaman, pastikan untuk mengatur salah satu nilai produk UnitPrice
ke nilai terlarang ( 1234,56 ). Ini akan mengakibatkan kesalahan saat mengklik Perbarui Produk dengan perubahan lain selama operasi batch tersebut digulung balik ke nilai aslinya.
Metode AlternatifBatchUpdate
Metode BatchUpdate
yang baru saja kami periksa mengambil semua produk dari metode BLL s GetProducts
dan kemudian memperbarui hanya rekaman yang muncul di GridView. Pendekatan ini sangat ideal jika GridView tidak menggunakan halaman, tetapi jika ya, mungkin ada ratusan, ribuan, atau puluhan ribu produk, tetapi hanya sepuluh baris di GridView. Dalam kasus seperti itu, mendapatkan semua produk dari database hanya untuk memodifikasi 10 di antaranya kurang dari ideal.
Untuk jenis situasi tersebut, pertimbangkan untuk menggunakan metode berikut BatchUpdateAlternate
:
Private Sub BatchUpdateAlternate()
' Enumerate the GridView's Rows collection and create a ProductRow
Dim productsAPI As New ProductsBLL()
Dim products As New Northwind.ProductsDataTable()
For Each gvRow As GridViewRow In ProductsGrid.Rows
' Create a new ProductRow instance
Dim productID As Integer = _
Convert.ToInt32(ProductsGrid.DataKeys(gvRow.RowIndex).Value)
Dim currentProductDataTable As Northwind.ProductsDataTable = _
productsAPI.GetProductByProductID(productID)
If currentProductDataTable.Rows.Count > 0 Then
Dim product As Northwind.ProductsRow = currentProductDataTable(0)
Dim productName As TextBox = _
CType(gvRow.FindControl("ProductName"), TextBox)
Dim categories As DropDownList = _
CType(gvRow.FindControl("Categories"), DropDownList)
Dim unitPrice As TextBox = _
CType(gvRow.FindControl("UnitPrice"), TextBox)
Dim discontinued As CheckBox = _
CType(gvRow.FindControl("Discontinued"), CheckBox)
' Assign the user-entered values to the current ProductRow
product.ProductName = productName.Text.Trim()
If categories.SelectedIndex = 0 Then
product.SetCategoryIDNull()
Else
product.CategoryID = Convert.ToInt32(categories.SelectedValue)
End If
If unitPrice.Text.Trim().Length = 0 Then
product.SetUnitPriceNull()
Else
product.UnitPrice = Convert.ToDecimal(unitPrice.Text)
End If
product.Discontinued = discontinued.Checked
' Import the ProductRow into the products DataTable
products.ImportRow(product)
End If
Next
' Now have the BLL update the products data using a transaction
productsAPI.UpdateProductsWithTransaction(products)
End Sub
BatchMethodAlternate
dimulai dengan membuat kosong ProductsDataTable
baru bernama products
. Kemudian langkah-langkah melalui koleksi GridView dan Rows
untuk setiap baris mendapatkan informasi produk tertentu menggunakan metode BLL s GetProductByProductID(productID)
. Instans yang diambil ProductsRow
akan memiliki propertinya diperbarui dengan cara yang sama seperti BatchUpdate
, tetapi setelah memperbarui baris, diimpor ke dalam products
ProductsDataTable
melalui metode DataTable ImportRow(DataRow)
.
Setelah perulangan For Each
selesai, products
berisi satu ProductsRow
instans untuk setiap baris di GridView. Karena setiap ProductsRow
instans telah ditambahkan ke products
(alih-alih diperbarui), jika kita secara membabi buta meneruskannya ke UpdateWithTransaction
metode, ProductsTableAdapter
akan mencoba menyisipkan setiap rekaman ke dalam database. Sebagai gantinya, kita perlu menentukan bahwa masing-masing baris ini telah dimodifikasi (tidak ditambahkan).
Ini dapat dicapai dengan menambahkan metode baru ke BLL bernama UpdateProductsWithTransaction
.
UpdateProductsWithTransaction
, yang ditunjukkan di bawah ini, mengatur masing-masing RowState
instans di ProductsRow
ke ProductsDataTable
dan kemudian meneruskan Modified
ke metode DAL sProductsDataTable
.UpdateWithTransaction
Public Function UpdateProductsWithTransaction _
(ByVal products As Northwind.ProductsDataTable) As Integer
' Mark each product as Modified
products.AcceptChanges()
For Each product As Northwind.ProductsRow In products
product.SetModified()
Next
' Update the data via a transaction
Return UpdateWithTransaction(products)
End Function
Ringkasan
GridView menyediakan kemampuan pengeditan per baris bawaan, tetapi tidak memiliki dukungan untuk membuat antarmuka yang dapat diedit sepenuhnya. Seperti yang kita lihat dalam tutorial ini, antarmuka seperti itu dimungkinkan, tetapi membutuhkan sedikit pekerjaan. Untuk membuat GridView di mana setiap baris dapat diedit, kita perlu mengonversi bidang GridView s menjadi TemplateFields dan menentukan antarmuka pengeditan dalam ItemTemplate
s. Selain itu, Perbarui Semua kontrol Web Tombol -type harus ditambahkan ke halaman, terpisah dari GridView. Penanganan aktivitas Tombol Click
ini perlu menghitung koleksi GridView, Rows
menyimpan perubahan dalam , dan meneruskan informasi yang diperbarui ProductsDataTable
ke dalam metode BLL yang sesuai.
Dalam tutorial berikutnya kita akan melihat cara membuat antarmuka untuk penghapusan batch. Secara khusus, setiap baris GridView akan menyertakan kotak centang dan alih-alih tombol Perbarui Semua jenis, kita akan memiliki tombol Hapus Baris yang Dipilih.
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.
Terima kasih khusus untuk
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau prospek untuk tutorial ini adalah Teresa Murphy dan David Suru. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.