Bagikan melalui


Memeriksa Peristiwa yang Terkait dengan Menyisipkan, Memperbarui, dan Menghapus (C#)

oleh Scott Mitchell

Unduh PDF

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:

  1. GridView mengisi ObjectDataSource-nya UpdateParameters dengan bidang identifikasi unik rekaman yang diedit (melalui DataKeyNames properti) bersama dengan nilai yang dimasukkan oleh pengguna
  2. GridView memanggil metode ObjectDataSource-nya Update() , yang pada gilirannya memanggil metode yang sesuai dalam objek yang mendasar (ProductsDAL.UpdateProduct, dalam tutorial kami sebelumnya)
  3. 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.

Serangkaian Kebakaran Pra-dan Pasca-Peristiwa Saat Memperbarui Data di GridView

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 ProdukProductNamedanUnitPriceBidang

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 QuantityPerUnitUpdateParameters . ObjectDataSource kemudian akan meneruskan null nilai 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 bool UpdateProduct(string productName, decimal? unitPrice, int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;

    Northwind.ProductsRow product = products[0];

    product.ProductName = productName;
    if (unitPrice == null) product.SetUnitPriceNull();
      else product.UnitPrice = unitPrice.Value;

    // Update the product record
    int rowsAffected = Adapter.Update(product);

    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

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 productNamemengambil parameter input , , unitPricedan productID . Gambar 2 memperlihatkan wizard Buat Sumber Data saat memetakan metode ObjectDataSource Update() ke ProductsBLL kelebihan muatan metode baru UpdateProduct kelas.

Memetakan Metode Pembaruan() ObjectDataSource ke Overload UpdateProduct Baru

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.

Pilih (Tidak Ada) Dari Daftar Drop-Down untuk Tab INSERT dan DELETE

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.

GridView Berisi BoundField atau CheckBoxField 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.

GridView Akan Menambahkan Parameter ke Koleksi UpdateParameters ObjectDataSource

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.

Antarmuka Memungkinkan Pengeditan Hanya Nama dan Harga Produk

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 EnableViewStateGridView ke false , Anda berisiko memiliki pengguna bersamaan yang secara tidak sengaja menghapus atau mengedit rekaman.

MeningkatkanUnitPricePemformatan

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.

Atur Properti DataFormatString dan HtmlEncode UnitPrice yang Sesuai

Gambar 7: Atur UnitPriceProperti 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.

Baris yang Tidak Dapat Diedit Sekarang Diformat sebagai Nilai Mata Uang

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.

Atur properti ApplyFormatInEditMode UnitPrice BoundField 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.

Cuplikan layar GridView memperlihatkan nilai UnitPrice baris yang diedit yang 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 decimalmata 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 void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
  if (e.NewValues["UnitPrice"] != null)
    e.NewValues["UnitPrice"] =
        decimal.Parse(e.NewValues["UnitPrice"].ToString(),
            System.Globalization.NumberStyles.Currency);
}

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 UnitPricepengguna , bersama dengan bagaimana penanganan aktivitas GridView RowUpdating dapat digunakan untuk mengurai input tersebut dengan benar.

Diagram memperlihatkan bagaimana ObjectDataSource memproses bidang UnitPrice dan bagaimana penanganan aktivitas RowUpdate dari GridView mengonversi string menjadi desimal.

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 NULLUnitPrice 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 adalah null.

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.cssWarning 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.

Label Telah Ditambahkan di Atas GridView

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 void Page_Load(object sender, EventArgs e)
{
    MustProvideUnitPriceMessage.Visible = false;
}

Jika pengguna mencoba memperbarui produk tanpa menentukan UnitPrice, kami ingin membatalkan pembaruan dan menampilkan label peringatan. Perbaiki penanganan aktivitas GridView RowUpdating sebagai berikut:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    if (e.NewValues["UnitPrice"] != null)
    {
        e.NewValues["UnitPrice"] =
            decimal.Parse(e.NewValues["UnitPrice"].ToString(),
                System.Globalization.NumberStyles.Currency);
    }
    else
    {
        // Show the Label
        MustProvideUnitPriceMessage.Visible = true;

        // Cancel the update
        e.Cancel = true;
    }
}

Jika pengguna mencoba menyimpan produk tanpa menentukan harga, pembaruan dibatalkan dan pesan bermanfaat ditampilkan. Meskipun database (dan logika bisnis) memungkinkan NULLUnitPrice s, halaman ASP.NET khusus ini tidak.

Pengguna tidak dapat membiarkan UnitPrice kosong

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 Insertingperistiwa , , Updatingdan 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, , UpdateParametersatau DeleteParameters, tergantung pada apakah penanganan aktivitas adalah untuk Inserting, , Updatingatau Deleting 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 ProductsBLLmetode dan AddProductDeleteProduct 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).

Atur Daftar Drop-Down Tab INSERT ke Metode AddProduct

Gambar 14: Atur Daftar Drop-Down Tab INSERT ke AddProduct Metode (Klik untuk melihat gambar ukuran penuh)

Atur Daftar Drop-Down Tab DELETE ke (Tidak Ada)

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.

DetailsView Saat Ini Dirender dalam Mode Baca-Saja

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.

DetailsView Menyediakan Antarmuka untuk Menambahkan Produk Baru dengan Cepat

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.

Produk

Gambar 18: Produk "Air Acme" Telah Ditambahkan ke Database

Meskipun GridView di Gambar 18 tidak menunjukkannya, bidang produk yang kurang dari antarmuka CategoryIDDetailsView , , SupplierID, QuantityPerUnitdan sebagainya adalah nilai database yang ditetapkan NULL . Anda dapat melihat ini dengan melakukan langkah-langkah berikut:

  1. Buka Server Explorer di Visual Studio
  2. Memperluas simpul NORTHWND.MDF database
  3. Klik kanan pada simpul Products tabel database
  4. 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.

Bidang Produk yang Tidak Disediakan dalam DetailsView adalah Nilai NULL yang Ditetapkan

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 keCategoryIDparameter 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 void ObjectDataSource1_Inserting
    (object sender, ObjectDataSourceMethodEventArgs e)
{

}

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 void ObjectDataSource1_Inserting
    (object sender, ObjectDataSourceMethodEventArgs e)
{
    e.InputParameters["CategoryID"] = 1;
    e.InputParameters["SupplierID"] = 1;
}

Kali ini saat menambahkan produk baru (seperti Acme Soda), CategoryID kolom dan SupplierID produk baru diatur ke 1 (lihat Gambar 20).

Produk Baru Sekarang Memiliki Nilai CategoryID dan SupplierID Mereka Diatur ke 1

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.