Bagikan melalui


Pembaruan Batch (VB)

oleh Scott Mitchell

Unduh PDF

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.

Setiap Baris di GridView dapat Diedit

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 IDProductsGrid dan, dari tag pintarnya, pilih untuk mengikatnya ke ObjectDataSource baru bernama ProductsDataSource. Konfigurasikan ObjectDataSource untuk mengambil datanya dari ProductsBLL metode kelas.GetProducts

Mengonfigurasi ObjectDataSource untuk Menggunakan Kelas ProductsBLL

Gambar 2: Konfigurasikan ObjectDataSource untuk Menggunakan ProductsBLL Kelas (Klik untuk melihat gambar ukuran penuh)

Mengambil Data Produk Menggunakan Metode GetProducts

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.

Atur Daftar Drop-Down di Tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak Ada)

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 ProductNamebidang , , CategoryNameUnitPrice, 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 (UnitPriceDiscontinued). 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.

Konversi BoundFields dan CheckBoxField yang Ada Menjadi TemplateFields

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 danDiscontinuedMengedit Antarmuka

ProductNameMembuat antarmuka pengeditan , , UnitPricedan 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 IDProductName.

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.

Bidang Templat ProductName Sekarang Menyertakan Kotak Teks dan RequiredFieldValidator

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 .

Tambahkan CompareValidator untuk Memastikan Harga yang Dimasukkan adalah Nilai Mata Uang Non-Negatif

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: MembuatCategoryNameAntarmuka 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

Mengonfigurasi ObjectDataSource untuk Menggunakan Kelas CategoriesBLL

Gambar 8: Konfigurasikan ObjectDataSource untuk Menggunakan CategoriesBLL Kelas (Klik untuk melihat gambar ukuran penuh)

Mengambil Data Kategori Menggunakan Metode GetCategories

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.

Atur Daftar Drop-Down di Lembar PERBARUI dan HAPUS menjadi (Tidak Ada)

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.

Mengikat DropDownList ke CategoriesDataSource

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.

Mengikat Nilai CategoryID Produk ke Properti SelectedValue milik DropDownList

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.

Setiap Baris GridView dapat diedit

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.

Memformat Properti Teks 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.

Tengahkan Kotak Centang Nonaktif

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.

Halaman Sekarang Menyertakan Dua Tombol Perbarui Produk

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 productsProductsDataTable 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 ProductsDataTableke 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.