Bagikan melalui


Melakukan Pembaruan Batch (VB)

oleh Scott Mitchell

Unduh PDF

Pelajari cara membuat DataList yang dapat diedit sepenuhnya di mana semua itemnya berada dalam mode edit dan yang nilainya dapat disimpan dengan mengklik tombol "Perbarui Semua" di halaman.

Pendahuluan

Dalam tutorial sebelumnya, kami memeriksa cara membuat DataList tingkat item. Seperti GridView yang dapat diedit standar, setiap item dalam DataList menyertakan tombol Edit yang, ketika diklik, akan membuat item dapat diedit. Meskipun pengeditan tingkat item ini berfungsi dengan baik untuk data yang hanya diperbarui sesekali, skenario kasus penggunaan tertentu mengharuskan pengguna untuk mengedit banyak rekaman. Jika pengguna perlu mengedit puluhan rekaman dan dipaksa untuk mengklik Edit, membuat perubahan mereka, dan mengklik Perbarui untuk masing-masing rekaman, jumlah klik dapat menghambat produktivitasnya. Dalam situasi seperti itu, opsi yang lebih baik adalah menyediakan DataList yang dapat diedit sepenuhnya, salah satu di mana semua itemnya berada dalam mode edit dan yang nilainya dapat diedit dengan mengklik tombol Perbarui Semua di halaman (lihat Gambar 1).

Setiap Item dalam Daftar Data yang Dapat Diedit Sepenuhnya dapat Dimodifikasi

Gambar 1: Setiap Item dalam Daftar Data yang Dapat Diedit Sepenuhnya dapat Dimodifikasi (Klik untuk melihat gambar ukuran penuh)

Dalam tutorial ini kita akan memeriksa cara memungkinkan pengguna memperbarui informasi alamat pemasok menggunakan DataList yang dapat diedit sepenuhnya.

Langkah 1: Buat Antarmuka Pengguna yang Dapat Diedit di DataList s ItemTemplate

Dalam tutorial sebelumnya, di mana kami membuat DataList standar tingkat item yang dapat diedit, kami menggunakan dua templat:

  • ItemTemplate berisi antarmuka pengguna baca-saja (kontrol Label Web untuk menampilkan setiap nama dan harga produk).
  • EditItemTemplate berisi antarmuka pengguna mode edit (dua kontrol Web TextBox).

Properti DataList EditItemIndex menentukan apa ( DataListItem jika ada) yang dirender menggunakan EditItemTemplate. Secara khusus, DataListItem yang nilainya ItemIndex cocok dengan properti DataList dirender EditItemIndex menggunakan EditItemTemplate. Model ini berfungsi dengan baik ketika hanya satu item yang dapat diedit pada satu waktu, tetapi terpisah saat membuat DataList yang sepenuhnya dapat diedit.

Untuk DataList yang dapat diedit sepenuhnya, kami ingin render menggunakan antarmuka yang dapat diedit. Cara paling sederhana untuk mencapainya adalah dengan menentukan antarmuka yang dapat diedit di ItemTemplate. Untuk memodifikasi informasi alamat pemasok, antarmuka yang dapat diedit berisi nama pemasok sebagai teks lalu TextBoxes untuk nilai alamat, kota, dan negara/wilayah.

Mulailah dengan membuka BatchUpdate.aspx halaman, tambahkan kontrol DataList, dan atur propertinya ID ke Suppliers. Dari tag pintar DataList, pilih untuk menambahkan kontrol ObjectDataSource baru bernama SuppliersDataSource.

Membuat ObjectDataSource Baru Bernama SuppliersDataSource

Gambar 2: Buat ObjectDataSource Baru Bernama SuppliersDataSource (Klik untuk melihat gambar ukuran penuh)

Konfigurasikan ObjectDataSource untuk mengambil data menggunakan SuppliersBLL metode kelas s GetSuppliers() (lihat Gambar 3). Seperti tutorial sebelumnya, daripada memperbarui informasi pemasok melalui ObjectDataSource, kita akan bekerja langsung dengan Lapisan Logika Bisnis. Oleh karena itu, atur daftar drop-down ke (Tidak Ada) di tab PERBARUI (lihat Gambar 4).

Mengambil Informasi Pemasok Menggunakan Metode GetSuppliers()

Gambar 3: Ambil Informasi Pemasok Menggunakan GetSuppliers() Metode (Klik untuk melihat gambar ukuran penuh)

Atur Daftar Drop-Down ke (Tidak Ada) di Tab PERBARUI

Gambar 4: Atur Daftar Drop-Down ke (Tidak Ada) di Tab PERBARUI (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard, Visual Studio secara otomatis menghasilkan DataList ItemTemplate untuk menampilkan setiap bidang data yang dikembalikan oleh sumber data dalam kontrol Web Label. Kita perlu memodifikasi templat ini sehingga menyediakan antarmuka pengeditan sebagai gantinya. ItemTemplate dapat dikustomisasi melalui Perancang menggunakan opsi Edit Templat dari tag pintar DataList atau langsung melalui sintaks deklaratif.

Luangkan waktu sejenak untuk membuat antarmuka pengeditan yang menampilkan nama pemasok sebagai teks, tetapi menyertakan TextBoxes untuk alamat pemasok, kota, dan nilai negara/wilayah. Setelah membuat perubahan ini, sintaks deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini:

<asp:DataList ID="Suppliers" runat="server" DataKeyField="SupplierID"
    DataSourceID="SuppliersDataSource">
    <ItemTemplate>
        <h4><asp:Label ID="CompanyNameLabel" runat="server"
            Text='<%# Eval("CompanyName") %>' /></h4>
        <table border="0">
            <tr>
                <td class="SupplierPropertyLabel">Address:</td>
                <td class="SupplierPropertyValue">
                    <asp:TextBox ID="Address" runat="server"
                        Text='<%# Eval("Address") %>' />
                </td>
            </tr>
            <tr>
                <td class="SupplierPropertyLabel">City:</td>
                <td class="SupplierPropertyValue">
                    <asp:TextBox ID="City" runat="server"
                        Text='<%# Eval("City") %>' />
                </td>
            </tr>
            <tr>
                <td class="SupplierPropertyLabel">Country:</td>
                <td class="SupplierPropertyValue">
                    <asp:TextBox ID="Country" runat="server"
                        Text='<%# Eval("Country") %>' />
                </td>
            </tr>
        </table>
        <br />
    </ItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
</asp:ObjectDataSource>

Catatan

Seperti tutorial sebelumnya, DataList dalam tutorial ini harus mengaktifkan status tampilannya.

ItemTemplate Di saya menggunakan dua kelas CSS baru, SupplierPropertyLabel dan SupplierPropertyValue, yang telah ditambahkan ke Styles.css kelas dan dikonfigurasi untuk menggunakan pengaturan gaya yang sama dengan ProductPropertyLabel kelas CSS dan ProductPropertyValue .

.ProductPropertyLabel, .SupplierPropertyLabel
{
    font-weight: bold;
    text-align: right;
}
.ProductPropertyValue, .SupplierPropertyValue
{
    padding-right: 35px;
}

Setelah membuat perubahan ini, kunjungi halaman ini melalui browser. Seperti yang ditunjukkan Gambar 5, setiap item DataList menampilkan nama pemasok sebagai teks dan menggunakan Kotak Teks untuk menampilkan alamat, kota, dan negara/wilayah.

Setiap Pemasok dalam DataList dapat diedit

Gambar 5: Setiap Pemasok dalam Daftar Data Dapat Diedit (Klik untuk melihat gambar ukuran penuh)

Langkah 2: Menambahkan Tombol Perbarui Semua

Meskipun setiap pemasok di Gambar 5 memiliki bidang alamat, kota, dan negara/wilayah yang ditampilkan di Kotak Teks, saat ini tidak ada tombol Perbarui yang tersedia. Daripada memiliki tombol Perbarui per item, dengan DataList yang sepenuhnya dapat diedit biasanya ada satu tombol Perbarui Semua pada halaman yang, ketika diklik, memperbarui semua rekaman di DataList. Untuk tutorial ini, mari kita tambahkan dua tombol Perbarui Semua - satu di bagian atas halaman dan satu di bagian bawah (meskipun mengklik salah satu tombol akan memiliki efek yang sama).

Mulailah dengan menambahkan kontrol Web Tombol di atas DataList dan atur propertinya ID ke UpdateAll1. Selanjutnya, tambahkan kontrol Web Tombol kedua di bawah DataList, atur ID ke UpdateAll2. Atur Text properti untuk dua Tombol ke Perbarui Semua. Terakhir, buat penanganan aktivitas untuk kedua peristiwa Tombol Click . Daripada menduplikasi logika pembaruan di setiap penanganan aktivitas, mari kita refaktor logika itu ke metode ketiga, UpdateAllSupplierAddresses, meminta penanganan aktivitas hanya memanggil metode ketiga ini.

Protected Sub UpdateAll1_Click(sender As Object, e As EventArgs) _
    Handles UpdateAll1.Click
    UpdateAllSupplierAddresses()
End Sub
Protected Sub UpdateAll2_Click(sender As Object, e As EventArgs) _
    Handles UpdateAll2.Click
    UpdateAllSupplierAddresses()
End Sub
Private Sub UpdateAllSupplierAddresses()
    ' TODO: Write code to update _all_ of the supplier addresses in the DataList
End Sub

Gambar 6 memperlihatkan halaman setelah tombol Perbarui Semua telah ditambahkan.

Dua Tombol Perbarui Semua telah Ditambahkan ke Halaman

Gambar 6: Dua Perbarui Semua Tombol telah Ditambahkan ke Halaman (Klik untuk melihat gambar ukuran penuh)

Langkah 3: Memperbarui Semua Informasi Alamat Pemasok

Dengan semua item DataList yang menampilkan antarmuka pengeditan dan dengan penambahan tombol Perbarui Semua, semua yang tersisa adalah menulis kode untuk melakukan pembaruan batch. Secara khusus, kita perlu mengulangi item DataList dan memanggil SuppliersBLL metode kelas UpdateSupplierAddress untuk masing-masing item.

Kumpulan DataListItem instans yang membuat DataList dapat diakses melalui propertiItems Dengan referensi ke DataListItem, kita dapat mengambil yang sesuai SupplierID dari DataKeys koleksi dan secara terprogram mereferensikan kontrol Web TextBox dalam ItemTemplate seperti yang diilustrasikan kode berikut:

Private Sub UpdateAllSupplierAddresses()
    ' Create an instance of the SuppliersBLL class
    Dim suppliersAPI As New SuppliersBLL()
    ' Iterate through the DataList's items
    For Each item As DataListItem In Suppliers.Items
        ' Get the supplierID from the DataKeys collection
        Dim supplierID As Integer = Convert.ToInt32(Suppliers.DataKeys(item.ItemIndex))
        ' Read in the user-entered values
        Dim address As TextBox = CType(item.FindControl("Address"), TextBox)
        Dim city As TextBox = CType(item.FindControl("City"), TextBox)
        Dim country As TextBox = CType(item.FindControl("Country"), TextBox)
        Dim addressValue As String = Nothing, _
            cityValue As String = Nothing, _
            countryValue As String = Nothing
        If address.Text.Trim().Length > 0 Then
            addressValue = address.Text.Trim()
        End If
        If city.Text.Trim().Length > 0 Then
            cityValue = city.Text.Trim()
        End If
        If country.Text.Trim().Length > 0 Then
            countryValue = country.Text.Trim()
        End If
        ' Call the SuppliersBLL class's UpdateSupplierAddress method
        suppliersAPI.UpdateSupplierAddress _
            (supplierID, addressValue, cityValue, countryValue)
    Next
End Sub

Ketika pengguna mengklik salah satu tombol Perbarui Semua, metode berulang UpdateAllSupplierAddresses melalui masing-masing DataListItem di Suppliers DataList dan memanggil SuppliersBLL metode kelas s UpdateSupplierAddress , meneruskan nilai yang sesuai. Nilai yang tidak dimasukkan untuk alamat, kota, atau negara/wilayah adalah nilai Nothing ke UpdateSupplierAddress (bukan string kosong), yang menghasilkan database NULL untuk bidang rekaman s yang mendasar.

Catatan

Sebagai penyempurnaan, Anda mungkin ingin menambahkan kontrol Web Label status ke halaman yang menyediakan beberapa pesan konfirmasi setelah pembaruan batch dilakukan.

Memperbarui hanya alamat yang telah dimodifikasi

Algoritma pembaruan batch yang digunakan untuk tutorial ini memanggil UpdateSupplierAddress metode untuk setiap pemasok dalam DataList, terlepas dari apakah informasi alamat mereka telah diubah. Meskipun pembaruan buta tersebut biasanya bukan masalah performa, pembaruan tersebut dapat menyebabkan rekaman berlebihan jika Anda mengaudit perubahan pada tabel database. Misalnya, jika Anda menggunakan pemicu untuk merekam semua UPDATE ke Suppliers tabel ke tabel audit, setiap kali pengguna mengklik tombol Perbarui Semua, rekaman audit baru akan dibuat untuk setiap pemasok dalam sistem, terlepas dari apakah pengguna membuat perubahan apa pun.

Kelas ADO.NET DataTable dan DataAdapter dirancang untuk mendukung pembaruan batch di mana hanya rekaman yang dimodifikasi, dihapus, dan rekaman baru menghasilkan komunikasi database apa pun. Setiap baris dalam DataTable memiliki RowState properti yang menunjukkan apakah baris telah ditambahkan ke DataTable, dihapus darinya, dimodifikasi, atau tetap tidak berubah. Saat DataTable awalnya diisi, semua baris ditandai tidak berubah. Mengubah nilai kolom baris s menandai baris sebagai dimodifikasi.

SuppliersBLL Di kelas kami memperbarui informasi alamat pemasok yang ditentukan dengan terlebih dahulu membaca dalam catatan pemasok tunggal ke dalam SuppliersDataTable lalu mengatur Addressnilai kolom , , Citydan Country menggunakan kode berikut:

Public Function UpdateSupplierAddress _
    (supplierID As Integer, address As String, city As String, country As String) _
    As Boolean
    Dim suppliers As Northwind.SuppliersDataTable = _
        Adapter.GetSupplierBySupplierID(supplierID)
    If suppliers.Count = 0 Then
        ' no matching record found, return false
        Return False
    Else
        Dim supplier As Northwind.SuppliersRow = suppliers(0)
        If address Is Nothing Then
            supplier.SetAddressNull()
        Else
            supplier.Address = address
        End If
        If city Is Nothing Then
            supplier.SetCityNull()
        Else
            supplier.City = city
        End If
        If country Is Nothing Then
            supplier.SetCountryNull()
        Else
            supplier.Country = country
        End If
        ' Update the supplier Address-related information
        Dim rowsAffected As Integer = Adapter.Update(supplier)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End If
End Function

Kode ini secara naif menetapkan nilai alamat, kota, dan negara/wilayah yang diteruskan ke SuppliersRow dalam SuppliersDataTable terlepas dari apakah nilai telah berubah atau tidak. Modifikasi ini menyebabkan SuppliersRow properti s RowState ditandai sebagai dimodifikasi. Ketika metode Lapisan Akses Data dipanggil Update , metode ini melihat bahwa SupplierRow telah dimodifikasi dan karenanya mengirim UPDATE perintah ke database.

Bayangkan, bagaimanapun, bahwa kami menambahkan kode ke metode ini untuk hanya menetapkan nilai alamat, kota, dan negara/wilayah yang diteruskan jika berbeda dari SuppliersRow nilai yang ada. Dalam kasus di mana alamat, kota, dan negara/wilayah sama dengan data yang ada, tidak ada perubahan yang akan dilakukan dan SupplierRow s RowState akan dibiarkan ditandai sebagai tidak berubah. Hasil bersih adalah bahwa ketika metode DAL s Update dipanggil, tidak ada panggilan database yang SuppliersRow akan dilakukan karena belum dimodifikasi.

Untuk memberlakukan perubahan ini, ganti pernyataan yang secara membabi buta menetapkan nilai alamat, kota, dan negara/wilayah yang diteruskan dengan kode berikut:

' Only assign the values to the SupplierRow's column values if they differ
If address Is Nothing AndAlso Not supplier.IsAddressNull() Then
    supplier.SetAddressNull()
ElseIf (address IsNot Nothing AndAlso supplier.IsAddressNull) _
    OrElse (Not supplier.IsAddressNull() AndAlso _
                String.Compare(supplier.Address, address) <> 0) Then
    supplier.Address = address
End If
If city Is Nothing AndAlso Not supplier.IsCityNull() Then
    supplier.SetCityNull()
ElseIf (city IsNot Nothing AndAlso supplier.IsCityNull) _
    OrElse (Not supplier.IsCityNull() AndAlso _
                String.Compare(supplier.City, city) <> 0) Then
    supplier.City = city
End If
If country Is Nothing AndAlso Not supplier.IsCountryNull() Then
    supplier.SetCountryNull()
ElseIf (country IsNot Nothing AndAlso supplier.IsCountryNull) _
    OrElse (Not supplier.IsCountryNull() AndAlso _
                String.Compare(supplier.Country, country) <> 0) Then
    supplier.Country = country
End If

Dengan kode tambahan ini, metode DAL s Update mengirimkan UPDATE pernyataan ke database hanya untuk rekaman yang nilai terkait alamatnya telah berubah.

Atau, kita dapat melacak apakah ada perbedaan antara bidang alamat yang diteruskan dan data database dan, jika tidak ada, cukup lewati panggilan ke metode DAL s Update . Pendekatan ini berfungsi dengan baik jika Anda menggunakan metode langsung DB, karena metode langsung DB tidak melewati SuppliersRow instans yang RowState dapat diperiksa untuk menentukan apakah panggilan database benar-benar diperlukan.

Catatan

Setiap kali UpdateSupplierAddress metode dipanggil, panggilan dilakukan ke database untuk mengambil informasi tentang rekaman yang diperbarui. Kemudian, jika ada perubahan dalam data, panggilan lain ke database dilakukan untuk memperbarui baris tabel. Alur kerja ini dapat dioptimalkan dengan membuat UpdateSupplierAddress kelebihan beban metode yang menerima instans EmployeesDataTable yang memiliki semua perubahan dari BatchUpdate.aspx halaman. Kemudian, itu bisa melakukan satu panggilan ke database untuk mendapatkan semua rekaman dari Suppliers tabel. Kedua hasil kemudian dapat dijumlahkan dan hanya rekaman di mana perubahan telah terjadi dapat diperbarui.

Ringkasan

Dalam tutorial ini kita melihat cara membuat DataList yang sepenuhnya dapat diedit, memungkinkan pengguna untuk dengan cepat memodifikasi informasi alamat untuk beberapa pemasok. Kami mulai dengan mendefinisikan antarmuka pengeditan kontrol Web TextBox untuk alamat pemasok, kota, dan nilai negara/wilayah di DataList s ItemTemplate. Selanjutnya, kami menambahkan tombol Perbarui Semua di atas dan di bawah DataList. Setelah pengguna membuat perubahannya dan mengklik salah satu tombol Perbarui Semua, DataListItem s dijumlahkan dan panggilan ke SuppliersBLL metode kelas dilakukan UpdateSupplierAddress .

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 utama untuk tutorial ini adalah Zack Jones dan Ken Pespisa. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.