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 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).
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
.
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).
Gambar 3: Ambil Informasi Pemasok Menggunakan GetSuppliers()
Metode (Klik untuk melihat gambar ukuran penuh)
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.
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.
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 Address
nilai kolom , , City
dan 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.