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
Dalam tutorial ini kita akan memeriksa menggunakan peristiwa yang terjadi sebelum, selama, dan setelah operasi sisipkan, perbarui, atau hapus kontrol Web data ASP.NET. Kita juga akan melihat cara menyesuaikan antarmuka pengeditan untuk hanya memperbarui subset bidang produk.
Pendahuluan
Saat menggunakan fitur penyisipan, pengeditan, atau penghapusan bawaan kontrol GridView, DetailsView, atau FormView, berbagai langkah menerjemahkan saat pengguna akhir menyelesaikan proses penambahan rekaman baru atau memperbarui atau menghapus rekaman yang sudah ada. Seperti yang kita bahas di tutorial sebelumnya, ketika baris diedit di GridView tombol Edit digantikan oleh tombol Perbarui dan Batalkan dan BoundFields berubah menjadi Kotak Teks. Setelah pengguna akhir memperbarui data dan mengklik Perbarui, langkah-langkah berikut dilakukan pada postback:
- GridView mengisi ObjectDataSource-nya
UpdateParameters
dengan bidang identifikasi unik rekaman yang diedit (melaluiDataKeyNames
properti) bersama dengan nilai yang dimasukkan oleh pengguna - GridView memanggil metode ObjectDataSource-nya
Update()
, yang pada gilirannya memanggil metode yang sesuai dalam objek yang mendasar (ProductsDAL.UpdateProduct
, dalam tutorial kami sebelumnya) - Data yang mendasar, yang sekarang menyertakan perubahan yang diperbarui, direbound ke GridView
Selama urutan langkah ini, sejumlah peristiwa diaktifkan, memungkinkan kami membuat penanganan aktivitas untuk menambahkan logika kustom jika diperlukan. Misalnya, sebelum Langkah 1, peristiwa GridView RowUpdating
diaktifkan. Kita dapat, pada titik ini, membatalkan permintaan pembaruan jika ada beberapa kesalahan validasi.
Update()
Ketika metode dipanggil, peristiwa ObjectDataSource Updating
diaktifkan, memberikan kesempatan untuk menambahkan atau menyesuaikan nilai salah satu dari UpdateParameters
. Setelah metode objek dasar ObjectDataSource selesai dieksekusi, peristiwa ObjectDataSource Updated
dinaikkan. Penanganan aktivitas untuk Updated
peristiwa dapat memeriksa detail tentang operasi pembaruan, seperti berapa banyak baris yang terpengaruh dan apakah terjadi pengecualian atau tidak. Terakhir, setelah Langkah 2, peristiwa GridView RowUpdated
diaktifkan; penanganan aktivitas untuk peristiwa ini dapat memeriksa informasi tambahan tentang operasi pembaruan yang baru saja dilakukan.
Gambar 1 menggambarkan rangkaian peristiwa dan langkah-langkah ini saat memperbarui GridView. Pola peristiwa di Gambar 1 tidak unik untuk memperbarui dengan GridView. Menyisipkan, memperbarui, atau menghapus data dari GridView, DetailsView, atau FormView mengendapkan urutan peristiwa pra-dan pasca-tingkat yang sama untuk kontrol Web data dan ObjectDataSource.
Gambar 1: Serangkaian Kebakaran Pra-dan Pasca-Peristiwa Saat Memperbarui Data di GridView (Klik untuk melihat gambar ukuran penuh)
Dalam tutorial ini kita akan memeriksa menggunakan peristiwa ini untuk memperluas kemampuan penyisipan, pembaruan, dan penghapusan bawaan kontrol Web data ASP.NET. Kita juga akan melihat cara menyesuaikan antarmuka pengeditan untuk hanya memperbarui subset bidang produk.
Langkah 1: Memperbarui ProdukProductName
danUnitPrice
Bidang
Dalam antarmuka pengeditan dari tutorial sebelumnya semua bidang produk yang tidak baca-saja harus disertakan. Jika kita menghapus bidang dari GridView - katakan QuantityPerUnit
- saat memperbarui data, kontrol Web data tidak akan mengatur nilai ObjectDataSource QuantityPerUnit
UpdateParameters
. ObjectDataSource kemudian akan meneruskan nilai Nothing
ke dalam UpdateProduct
metode Business Logic Layer (BLL), yang akan mengubah kolom rekaman QuantityPerUnit
database yang diedit menjadi NULL
nilai. Demikian pula, jika bidang yang diperlukan, seperti ProductName
, dihapus dari antarmuka pengeditan, pembaruan akan gagal dengan pengecualian "ProductName' Kolom tidak mengizinkan null". Alasan perilaku ini karena ObjectDataSource dikonfigurasi untuk memanggil ProductsBLL
metode kelas UpdateProduct
, yang mengharapkan parameter input untuk setiap bidang produk. Oleh karena itu, koleksi ObjectDataSource UpdateParameters
berisi parameter untuk setiap parameter input metode.
Jika kita ingin menyediakan kontrol Web data yang memungkinkan pengguna akhir untuk hanya memperbarui subset bidang, maka kita perlu mengatur nilai yang hilang UpdateParameters
secara terprogram di penanganan aktivitas ObjectDataSource Updating
atau membuat dan memanggil metode BLL yang hanya mengharapkan subset bidang. Mari kita jelajahi pendekatan terakhir ini.
Secara khusus, mari kita buat halaman yang hanya ProductName
menampilkan bidang dan UnitPrice
di GridView yang dapat diedit. Antarmuka pengeditan GridView ini hanya akan memungkinkan pengguna untuk memperbarui dua bidang yang ditampilkan, ProductName
dan UnitPrice
. Karena antarmuka pengeditan ini hanya menyediakan subset bidang produk, kita perlu membuat ObjectDataSource yang menggunakan metode BLL UpdateProduct
yang ada dan memiliki nilai bidang produk yang hilang yang diatur secara terprogram dalam penanganan aktivitasnya Updating
, atau kita perlu membuat metode BLL baru yang hanya mengharapkan subset bidang yang ditentukan dalam GridView. Untuk tutorial ini, mari kita gunakan opsi terakhir dan membuat kelebihan beban UpdateProduct
metode, yang hanya mengambil tiga parameter input: productName
, unitPrice
, dan productID
:
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, False)> _
Public Function UpdateProduct(productName As String, _
unitPrice As Nullable(Of Decimal), productID As Integer) _
As Boolean
Dim products As Northwind.ProductsDataTable = _
Adapter.GetProductByProductID(productID)
If products.Count = 0 Then
Return False
End If
Dim product As Northwind.ProductsRow = products(0)
product.ProductName = productName
If Not unitPrice.HasValue Then
product.SetUnitPriceNull()
Else
product.UnitPrice = unitPrice.Value
End If
Dim rowsAffected As Integer = Adapter.Update(product)
Return rowsAffected = 1
End Function
Seperti metode asli UpdateProduct
, kelebihan beban ini dimulai dengan memeriksa untuk melihat apakah ada produk dalam database dengan yang ditentukan ProductID
. Jika tidak, ia mengembalikan False
, menunjukkan bahwa permintaan untuk memperbarui informasi produk gagal. Jika tidak, ini memperbarui bidang dan ProductName
catatan UnitPrice
produk yang ada dan melakukan pembaruan dengan memanggil metode TableAdapterUpdate()
, meneruskan ProductsRow
instans.
Dengan tambahan ini ke kelas kami ProductsBLL
, kami siap untuk membuat antarmuka GridView yang disederhanakan.
DataModificationEvents.aspx
Buka di EditInsertDelete
folder dan tambahkan GridView ke halaman. Buat ObjectDataSource baru dan konfigurasikan untuk menggunakan ProductsBLL
kelas dengan pemetaan metodenya Select()
ke GetProducts
dan pemetaan metodenya Update()
ke UpdateProduct
kelebihan beban yang hanya productName
mengambil parameter input , , unitPrice
dan productID
. Gambar 2 memperlihatkan wizard Buat Sumber Data saat memetakan metode ObjectDataSource Update()
ke ProductsBLL
kelebihan muatan metode baru UpdateProduct
kelas.
Gambar 2: Petakan Metode ObjectDataSource Update()
ke Kelebihan Beban Baru UpdateProduct
(Klik untuk melihat gambar ukuran penuh)
Karena contoh kami awalnya hanya akan membutuhkan kemampuan untuk mengedit data, tetapi tidak untuk menyisipkan atau menghapus rekaman, luangkan waktu sejenak untuk secara eksplisit menunjukkan bahwa metode dan Insert()
ObjectDataSource Delete()
tidak boleh dipetakan ke salah satu ProductsBLL
metode kelas dengan masuk ke tab INSERT dan DELETE dan memilih (Tidak Ada) dari daftar drop-down.
Gambar 3: Pilih (Tidak Ada) Dari Daftar Drop-Down untuk Tab INSERT dan DELETE (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard ini, centang kotak Aktifkan Pengeditan dari tag pintar GridView.
Dengan selesainya wizard Buat Sumber Data dan pengikatannya ke GridView, Visual Studio telah membuat sintaks deklaratif untuk kedua kontrol. Buka tampilan Sumber untuk memeriksa markup deklaratif ObjectDataSource, yang ditunjukkan di bawah ini:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts"
TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Karena tidak ada pemetaan untuk metode dan ObjectDataSourceInsert()
, tidak Delete()
ada bagian atau InsertParameters
.DeleteParameters
Selain itu, karena metode dipetakan Update()
ke UpdateProduct
metode kelebihan beban yang hanya menerima tiga parameter input, UpdateParameters
bagian hanya memiliki tiga Parameter
instans.
Perhatikan bahwa properti ObjectDataSource OldValuesParameterFormatString
diatur ke original_{0}
. Properti ini diatur secara otomatis oleh Visual Studio saat menggunakan wizard Konfigurasi Sumber Data. Namun, karena metode BLL kami tidak mengharapkan nilai asli ProductID
untuk diteruskan, hapus penetapan properti ini sama sekali dari sintaks deklaratif ObjectDataSource.
Catatan
Jika Anda hanya menghapus OldValuesParameterFormatString
nilai properti dari jendela Properti dalam tampilan Desain, properti masih akan ada dalam sintaks deklaratif, tetapi akan diatur ke string kosong. Hapus properti sama sekali dari sintaks deklaratif atau, dari jendela Properti, atur nilai ke default, {0}
.
Meskipun ObjectDataSource hanya memiliki UpdateParameters
untuk nama, harga, dan ID produk, Visual Studio telah menambahkan BoundField atau CheckBoxField di GridView untuk setiap bidang produk.
Gambar 4: GridView Berisi BoundField atau CheckBoxField untuk Setiap Bidang Produk (Klik untuk melihat gambar ukuran penuh)
Saat pengguna akhir mengedit produk dan mengklik tombol Perbarui, GridView menghitung bidang yang tidak bersifat baca-saja. Kemudian mengatur nilai parameter yang sesuai dalam koleksi ObjectDataSource UpdateParameters
ke nilai yang dimasukkan oleh pengguna. Jika tidak ada parameter yang sesuai, GridView menambahkannya ke koleksi. Oleh karena itu, jika GridView kami berisi BoundFields dan CheckBoxFields untuk semua bidang produk, ObjectDataSource akan akhirnya memanggil UpdateProduct
kelebihan beban yang mengambil semua parameter ini, terlepas dari fakta bahwa markup deklaratif ObjectDataSource hanya menentukan tiga parameter input (lihat Gambar 5). Demikian pula, jika ada beberapa kombinasi bidang produk non-baca-saja di GridView yang tidak sesuai dengan parameter input untuk UpdateProduct
kelebihan beban, pengecualian akan dimunculkan saat mencoba memperbarui.
Gambar 5: GridView Akan Menambahkan Parameter ke Koleksi ObjectDataSource UpdateParameters
(Klik untuk melihat gambar ukuran penuh)
Untuk memastikan bahwa ObjectDataSource memanggil UpdateProduct
kelebihan beban yang hanya mengambil nama, harga, dan ID produk, kita perlu membatasi GridView untuk memiliki bidang yang dapat diedit hanya ProductName
untuk dan UnitPrice
. Ini dapat dicapai dengan menghapus BoundFields dan CheckBoxFields lainnya, dengan mengatur properti bidang ReadOnly
lain tersebut ke True
, atau dengan beberapa kombinasi dari keduanya. Untuk tutorial ini mari kita hapus semua bidang GridView kecuali ProductName
dan UnitPrice
BoundFields, setelah itu markup deklaratif GridView akan terlihat seperti:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ProductName"
HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
</Columns>
</asp:GridView>
Meskipun UpdateProduct
kelebihan beban mengharapkan tiga parameter input, kami hanya memiliki dua BoundFields di GridView kami. Ini karena productID
parameter input adalah nilai kunci utama dan diteruskan melalui nilai DataKeyNames
properti untuk baris yang diedit.
GridView kami, bersama dengan UpdateProduct
kelebihan beban, memungkinkan pengguna untuk mengedit nama dan harga produk saja tanpa kehilangan salah satu bidang produk lainnya.
Gambar 6: Antarmuka Memungkinkan Pengeditan Hanya Nama dan Harga Produk (Klik untuk melihat gambar ukuran penuh)
Catatan
Seperti yang dibahas dalam tutorial sebelumnya, sangat penting bahwa status tampilan GridView diaktifkan (perilaku default). Jika Anda mengatur properti EnableViewState
GridView ke false
, Anda berisiko memiliki pengguna bersamaan yang secara tidak sengaja menghapus atau mengedit rekaman.
MeningkatkanUnitPrice
Pemformatan
Meskipun contoh GridView yang ditampilkan dalam Gambar 6 berfungsi, UnitPrice
bidang tidak diformat sama sekali, menghasilkan tampilan harga yang tidak memiliki simbol mata uang apa pun dan memiliki empat tempat desimal. Untuk menerapkan pemformatan mata uang untuk baris yang tidak dapat diedit, cukup atur UnitPrice
properti BoundField DataFormatString
ke {0:c}
dan propertinya HtmlEncode
ke False
.
Gambar 7: Atur UnitPrice
Properti dan DataFormatString
Sesuai HtmlEncode
(Klik untuk melihat gambar ukuran penuh)
Dengan perubahan ini, baris yang tidak dapat diedit memformat harga sebagai mata uang; namun, baris yang diedit masih menampilkan nilai tanpa simbol mata uang dan dengan empat tempat desimal.
Gambar 8: Baris yang Tidak Dapat Diedit Sekarang Diformat sebagai Nilai Mata Uang (Klik untuk melihat gambar ukuran penuh)
Instruksi pemformatan yang ditentukan dalam DataFormatString
properti dapat diterapkan ke antarmuka pengeditan dengan mengatur properti BoundField ApplyFormatInEditMode
ke True
(defaultnya adalah False
). Luangkan waktu sejenak untuk mengatur properti ini ke True
.
Gambar 9: Atur UnitPrice
properti BoundField ApplyFormatInEditMode
ke True
(Klik untuk melihat gambar ukuran penuh)
Dengan perubahan ini, nilai yang UnitPrice
ditampilkan dalam baris yang diedit juga diformat sebagai mata uang.
Gambar 10: Nilai Baris UnitPrice
yang Diedit Sekarang Diformat sebagai Mata Uang (Klik untuk melihat gambar ukuran penuh)
Namun, memperbarui produk dengan simbol mata uang di kotak teks seperti $ 19.00 melempar FormatException
. Ketika GridView mencoba menetapkan nilai yang disediakan pengguna ke koleksi ObjectDataSource, UpdateParameters
GridView tidak dapat mengonversi UnitPrice
string "$19.00" ke dalam Decimal
yang diperlukan oleh parameter (lihat Gambar 11). Untuk memperbaikinya, kita dapat membuat penanganan aktivitas untuk peristiwa GridView RowUpdating
dan mengurainya yang disediakan UnitPrice
pengguna sebagai berformat Decimal
mata uang .
Peristiwa GridView RowUpdating
menerima sebagai parameter kedua objek jenis sebagai salah satu propertinya yang menyimpan nilai yang disediakan pengguna yang siap ditetapkan ke koleksi ObjectDataSourceNewValues
. Kita dapat menimpa nilai yang ada UnitPrice
dalam NewValues
koleksi dengan nilai desimal yang diurai menggunakan format mata uang dengan baris kode berikut dalam RowUpdating
penanganan aktivitas:
Protected Sub GridView1_RowUpdating(sender As Object, e As GridViewUpdateEventArgs) _
Handles GridView1.RowUpdating
If e.NewValues("UnitPrice") IsNot Nothing Then
e.NewValues("UnitPrice") = _
Decimal.Parse(e.NewValues("UnitPrice").ToString(), _
System.Globalization.NumberStyles.Currency)
End If
End Sub
Jika pengguna telah menyediakan UnitPrice
nilai (seperti "$19,00"), nilai ini ditimpa dengan nilai desimal yang dihitung oleh Decimal.Parse, mengurai nilai sebagai mata uang. Ini akan mengurai desimal dengan benar jika ada simbol mata uang, koma, titik desimal, dan sebagainya, dan menggunakan enumerasi NumberStyles di namespace System.Globalization .
Gambar 11 menunjukkan kedua masalah yang disebabkan oleh simbol mata uang dalam yang disediakan UnitPrice
pengguna , bersama dengan bagaimana penanganan aktivitas GridView RowUpdating
dapat digunakan untuk mengurai input tersebut dengan benar.
Gambar 11: Nilai Baris UnitPrice
yang Diedit Sekarang Diformat sebagai Mata Uang (Klik untuk melihat gambar ukuran penuh)
Langkah 2: MelarangNULL UnitPrices
Saat database dikonfigurasi untuk mengizinkan NULL
nilai di Products
kolom tabel UnitPrice
, kami mungkin ingin mencegah pengguna mengunjungi halaman khusus ini untuk menentukan NULL
UnitPrice
nilai. Artinya, jika pengguna gagal memasukkan UnitPrice
nilai saat mengedit baris produk, daripada menyimpan hasilnya ke database, kami ingin menampilkan pesan yang memberi tahu pengguna bahwa, melalui halaman ini, setiap produk yang diedit harus memiliki harga yang ditentukan.
Objek GridViewUpdateEventArgs
yang diteruskan ke penanganan aktivitas GridView RowUpdating
berisi Cancel
properti yang, jika diatur ke True
, mengakhiri proses pembaruan. Mari kita perluas RowUpdating
penanganan aktivitas untuk diatur e.Cancel
ke True
dan menampilkan pesan yang menjelaskan mengapa jika UnitPrice
nilai dalam NewValues
koleksi memiliki nilai Nothing
.
Mulailah dengan menambahkan kontrol Web Label ke halaman bernama MustProvideUnitPriceMessage
. Kontrol Label ini akan ditampilkan jika pengguna gagal menentukan UnitPrice
nilai saat memperbarui produk. Atur properti Label Text
ke "Anda harus memberikan harga untuk produk." Saya juga telah membuat kelas CSS baru di bernama Styles.css
Warning
dengan definisi berikut:
.Warning
{
color: Red;
font-style: italic;
font-weight: bold;
font-size: x-large;
}
Terakhir, atur properti Label CssClass
ke Warning
. Pada titik ini Perancang harus menampilkan pesan peringatan dalam ukuran font merah, tebal, miring, ekstra besar di atas GridView, seperti yang ditunjukkan pada Gambar 12.
Gambar 12: Label Telah Ditambahkan di Atas GridView (Klik untuk melihat gambar ukuran penuh)
Secara default, Label ini harus disembunyikan, jadi atur propertinya Visible
ke False
di penanganan Page_Load
aktivitas:
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
MustProvideUnitPriceMessage.Visible = False
End Sub
Jika pengguna mencoba memperbarui produk tanpa menentukan UnitPrice
, kami ingin membatalkan pembaruan dan menampilkan label peringatan. Perbaiki penanganan aktivitas GridView RowUpdating
sebagai berikut:
Protected Sub GridView1_RowUpdating(sender As Object, e As GridViewUpdateEventArgs) _
Handles GridView1.RowUpdating
If e.NewValues("UnitPrice") IsNot Nothing Then
e.NewValues("UnitPrice") = _
Decimal.Parse(e.NewValues("UnitPrice").ToString(), _
System.Globalization.NumberStyles.Currency)
Else
MustProvideUnitPriceMessage.Visible = True
e.Cancel = True
End If
End Sub
Jika pengguna mencoba menyimpan produk tanpa menentukan harga, pembaruan dibatalkan dan pesan bermanfaat ditampilkan. Meskipun database (dan logika bisnis) memungkinkan NULL
UnitPrice
s, halaman ASP.NET khusus ini tidak.
Gambar 13: Pengguna Tidak Dapat Membiarkan UnitPrice
Kosong (Klik untuk melihat gambar ukuran penuh)
Sejauh ini kita telah melihat cara menggunakan peristiwa GridView RowUpdating
untuk secara terprogram mengubah nilai parameter yang ditetapkan ke koleksi ObjectDataSource UpdateParameters
serta cara membatalkan proses pembaruan sama sekali. Konsep-konsep ini dibawa ke kontrol DetailsView dan FormView dan juga berlaku untuk menyisipkan dan menghapus.
Tugas-tugas ini juga dapat dilakukan di tingkat ObjectDataSource melalui penanganan aktivitas untuk Inserting
peristiwa , , Updating
dan Deleting
. Peristiwa ini diaktifkan sebelum metode terkait dari objek yang mendasar dipanggil dan memberikan kesempatan terakhir untuk memodifikasi koleksi parameter input atau membatalkan operasi secara langsung. Penanganan aktivitas untuk ketiga peristiwa ini melewati objek jenis ObjectDataSourceMethodEventArgs yang memiliki dua properti yang menarik:
-
Batalkan, yang, jika diatur ke
True
, membatalkan operasi yang sedang dilakukan -
InputParameters, yang merupakan kumpulan
InsertParameters
, ,UpdateParameters
atauDeleteParameters
, tergantung pada apakah penanganan aktivitas adalah untukInserting
, ,Updating
atauDeleting
peristiwa
Untuk mengilustrasikan bekerja dengan nilai parameter di tingkat ObjectDataSource, mari kita sertakan DetailsView di halaman kami yang memungkinkan pengguna untuk menambahkan produk baru. DetailsView ini akan digunakan untuk menyediakan antarmuka untuk menambahkan produk baru dengan cepat ke database. Untuk mempertahankan antarmuka pengguna yang konsisten saat menambahkan produk baru, mari kita izinkan pengguna untuk hanya memasukkan nilai untuk ProductName
bidang dan UnitPrice
. Secara default, nilai-nilai yang tidak disediakan dalam antarmuka penyisipan DetailsView akan diatur ke NULL
nilai database. Namun, kita dapat menggunakan peristiwa ObjectDataSource Inserting
untuk menyuntikkan nilai default yang berbeda, seperti yang akan segera kita lihat.
Langkah 3: Menyediakan Antarmuka untuk Menambahkan Produk Baru
Seret DetailsView dari Kotak Alat ke Perancang di atas GridView, hapus Height
properti dan Width
dan ikat ke ObjectDataSource yang sudah ada di halaman. Ini akan menambahkan BoundField atau CheckBoxField untuk setiap bidang produk. Karena kita ingin menggunakan DetailsView ini untuk menambahkan produk baru, kita perlu memeriksa opsi Aktifkan Penyisipan dari tag pintar; namun, tidak ada opsi seperti itu karena metode ObjectDataSource Insert()
tidak dipetakan ke metode di ProductsBLL
kelas (ingat bahwa kita mengatur pemetaan ini ke (Tidak Ada) saat mengonfigurasi sumber data lihat Gambar 3).
Untuk mengonfigurasi ObjectDataSource, pilih tautan Konfigurasi Sumber Data dari tag pintarnya, luncurkan wizard. Layar pertama memungkinkan Anda mengubah objek yang mendasar yang terikat pada ObjectDataSource; biarkan diatur ke ProductsBLL
. Layar berikutnya mencantumkan pemetaan dari metode ObjectDataSource ke objek yang mendasar. Meskipun kami secara eksplisit menunjukkan bahwa Insert()
metode dan Delete()
tidak boleh dipetakan ke metode apa pun, jika Anda membuka tab INSERT dan DELETE, Anda akan melihat bahwa pemetaan ada di sana. Ini karena ProductsBLL
metode dan AddProduct
DeleteProduct
menggunakan DataObjectMethodAttribute
atribut untuk menunjukkan bahwa mereka adalah metode default untuk Insert()
dan Delete()
, masing-masing. Oleh karena itu, wizard ObjectDataSource memilih ini setiap kali Anda menjalankan wizard kecuali ada beberapa nilai lain yang ditentukan secara eksplisit.
Insert()
Biarkan metode menunjuk ke AddProduct
metode , tetapi sekali lagi atur daftar drop-down tab DELETE ke (Tidak Ada).
Gambar 14: Atur Daftar Drop-Down Tab INSERT ke AddProduct
Metode (Klik untuk melihat gambar ukuran penuh)
Gambar 15: Atur Daftar Drop-Down Tab DELETE ke (Tidak Ada) (Klik untuk melihat gambar ukuran penuh)
Setelah membuat perubahan ini, sintaks deklaratif ObjectDataSource akan diperluas untuk menyertakan koleksi, seperti yang InsertParameters
ditunjukkan di bawah ini:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL"
UpdateMethod="UpdateProduct" OnUpdating="ObjectDataSource1_Updating"
InsertMethod="AddProduct" OldValuesParameterFormatString="original_{0}">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="supplierID" Type="Int32" />
<asp:Parameter Name="categoryID" Type="Int32" />
<asp:Parameter Name="quantityPerUnit" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="unitsInStock" Type="Int16" />
<asp:Parameter Name="unitsOnOrder" Type="Int16" />
<asp:Parameter Name="reorderLevel" Type="Int16" />
<asp:Parameter Name="discontinued" Type="Boolean" />
</InsertParameters>
</asp:ObjectDataSource>
Menjalankan kembali wizard menambahkan kembali OldValuesParameterFormatString
properti . Luangkan waktu sejenak untuk menghapus properti ini dengan mengaturnya ke nilai default ({0}
) atau menghapusnya sama sekali dari sintaks deklaratif.
Dengan ObjectDataSource yang menyediakan kemampuan penyisipan, tag pintar DetailsView sekarang akan menyertakan kotak centang Aktifkan Penyisipan; kembali ke Perancang dan centang opsi ini. Selanjutnya, pare down DetailsView sehingga hanya memiliki dua BoundFields - ProductName
dan UnitPrice
- dan CommandField. Pada titik ini sintaks deklaratif DetailsView akan terlihat seperti:
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
<Fields>
<asp:BoundField DataField="ProductName"
HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
Gambar 16 memperlihatkan halaman ini saat dilihat melalui browser pada titik ini. Seperti yang Anda lihat, DetailsView mencantumkan nama dan harga produk pertama (Chai). Namun, yang kami inginkan adalah antarmuka penyisipan yang menyediakan sarana bagi pengguna untuk dengan cepat menambahkan produk baru ke database.
Gambar 16: DetailTampilan Saat Ini Dirender dalam Mode Baca-Saja (Klik untuk melihat gambar ukuran penuh)
Untuk menampilkan DetailsView dalam mode penyisipannya, kita perlu mengatur DefaultMode
properti ke Inserting
. Ini merender DetailsView dalam mode sisipkan saat pertama kali dikunjungi dan menyimpannya di sana setelah menyisipkan rekaman baru. Seperti yang ditunjukkan Gambar 17, Seperti yang ditunjukkan detailsView menyediakan antarmuka cepat untuk menambahkan rekaman baru.
Gambar 17: DetailView Menyediakan Antarmuka untuk Menambahkan Produk Baru dengan Cepat (Klik untuk melihat gambar ukuran penuh)
Ketika pengguna memasukkan nama produk dan harga (seperti "Air Acme" dan 1,99, seperti pada Gambar 17) dan mengklik Sisipkan, postback dimulai dan alur kerja penyisipan dimulai, berujul pada rekaman produk baru yang ditambahkan ke database. DetailsView mempertahankan antarmuka penyisipannya dan GridView secara otomatis masuk ke sumber datanya untuk menyertakan produk baru, seperti yang ditunjukkan pada Gambar 18.
Gambar 18: Produk "Air Acme" Telah Ditambahkan ke Database
Meskipun GridView di Gambar 18 tidak menunjukkannya, bidang produk yang kurang dari antarmuka CategoryID
DetailsView , , SupplierID
, QuantityPerUnit
dan sebagainya adalah nilai database yang ditetapkan NULL
. Anda dapat melihat ini dengan melakukan langkah-langkah berikut:
- Buka Server Explorer di Visual Studio
- Memperluas simpul
NORTHWND.MDF
database - Klik kanan pada simpul
Products
tabel database - Pilih Perlihatkan Data Tabel
Ini akan mencantumkan semua rekaman dalam Products
tabel. Seperti yang ditunjukkan Gambar 19, semua kolom produk baru kami selain ProductID
, ProductName
, dan UnitPrice
memiliki NULL
nilai.
Gambar 19: Bidang Produk yang Tidak Disediakan dalam DetailTampilan NULL
adalah Nilai yang Ditetapkan (Klik untuk melihat gambar ukuran penuh)
Kami mungkin ingin memberikan nilai default selain NULL
untuk satu atau beberapa nilai kolom ini, baik karena NULL
bukan opsi default terbaik atau karena kolom database itu sendiri tidak mengizinkannya NULL
. Untuk mencapai hal ini, kita dapat secara terprogram mengatur nilai parameter koleksi DetailsView InputParameters
. Penugasan ini dapat dilakukan baik di penanganan aktivitas untuk peristiwa DetailsView ItemInserting
atau peristiwa ObjectDataSource Inserting
. Karena kita sudah melihat menggunakan peristiwa pra-dan pasca-tingkat di tingkat kontrol Web data, mari kita jelajahi menggunakan peristiwa ObjectDataSource kali ini.
Langkah 4: Menetapkan Nilai keCategoryID
parameter danSupplierID
Untuk tutorial ini mari kita bayangkan bahwa untuk aplikasi kita saat menambahkan produk baru melalui antarmuka ini harus diberi CategoryID
nilai dan SupplierID
1. Seperti disebutkan sebelumnya, ObjectDataSource memiliki sepasang peristiwa pra-dan pasca-tingkat yang diaktifkan selama proses modifikasi data. Ketika metodenya Insert()
dipanggil, ObjectDataSource pertama kali menaikkan peristiwanya Inserting
, kemudian memanggil metode yang metodenya Insert()
telah dipetakan, dan akhirnya meningkatkan Inserted
peristiwa. Penanganan Inserting
aktivitas memberi kami satu kesempatan terakhir untuk mengubah parameter input atau membatalkan operasi secara langsung.
Catatan
Dalam aplikasi dunia nyata, Anda mungkin ingin membiarkan pengguna menentukan kategori dan pemasok atau akan memilih nilai ini untuk mereka berdasarkan beberapa kriteria atau logika bisnis (daripada memilih ID 1 secara membabi buta). Terlepas dari itu, contoh ini menggambarkan cara mengatur nilai parameter input secara terprogram dari peristiwa pre-level ObjectDataSource.
Luangkan waktu sejenak untuk membuat penanganan aktivitas untuk peristiwa ObjectDataSource Inserting
. Perhatikan bahwa parameter input kedua penanganan aktivitas adalah objek jenis ObjectDataSourceMethodEventArgs
, yang memiliki properti untuk mengakses koleksi parameter (InputParameters
) dan properti untuk membatalkan operasi (Cancel
).
Protected Sub ObjectDataSource1_Inserting _
(sender As Object, e As ObjectDataSourceMethodEventArgs) _
Handles ObjectDataSource1.Inserting
End Sub
Pada titik ini, InputParameters
properti berisi koleksi ObjectDataSource InsertParameters
dengan nilai yang ditetapkan dari DetailsView. Untuk mengubah nilai salah satu parameter ini, cukup gunakan: e.InputParameters("paramName") = value
. Oleh karena itu, untuk mengatur CategoryID
dan SupplierID
ke nilai 1, sesuaikan Inserting
penanganan aktivitas agar terlihat seperti berikut ini:
Protected Sub ObjectDataSource1_Inserting _
(sender As Object, e As ObjectDataSourceMethodEventArgs) _
Handles ObjectDataSource1.Inserting
e.InputParameters("CategoryID") = 1
e.InputParameters("SupplierID") = 1
End Sub
Kali ini saat menambahkan produk baru (seperti Acme Soda), CategoryID
kolom dan SupplierID
produk baru diatur ke 1 (lihat Gambar 20).
Gambar 20: Produk Baru Sekarang Memiliki Nilai dan CategoryID
Yang SupplierID
Diatur ke 1 (Klik untuk melihat gambar ukuran penuh)
Ringkasan
Selama proses pengeditan, penyisipan, dan penghapusan, kontrol Web data dan ObjectDataSource melanjutkan melalui sejumlah peristiwa pra-dan pasca-tingkat. Dalam tutorial ini kami memeriksa peristiwa pra-tingkat dan melihat cara menggunakannya untuk menyesuaikan parameter input atau membatalkan operasi modifikasi data sama sekali baik dari kontrol Web data maupun peristiwa ObjectDataSource. Dalam tutorial berikutnya kita akan melihat membuat dan menggunakan penanganan aktivitas untuk peristiwa pasca-tingkat.
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 Jackie Goor dan Liz Shulok. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.