Megosztás a következőn keresztül:


Az adatok beszúrásának, frissítésének és törlésének áttekintése (C#)

által Scott Mitchell

PDF letöltése

Ebben az oktatóanyagban megtudhatja, hogyan képezheti le az ObjectDataSource Insert(), Update() és Delete() metódusait a BLL-osztályok metódusaihoz, valamint hogyan konfigurálhatja a GridView, a DetailsView és a FormView vezérlőket az adatmódosítási képességek biztosításához.

Bevezetés

Az elmúlt néhány oktatóanyag során megvizsgáltuk, hogyan jeleníthet meg adatokat egy ASP.NET lapon a GridView, a DetailsView és a FormView vezérlőkkel. Ezek a vezérlők egyszerűen csak a nekik megadott adatokkal működnek. Ezek a vezérlők általában egy adatforrás-vezérlő, például az ObjectDataSource használatával férnek hozzá az adatokhoz. Láttuk, hogyan működik az ObjectDataSource proxyként a ASP.NET lap és a mögöttes adatok között. Amikor egy GridView-nak adatokat kell megjelenítenie, meghívja az ObjectDataSource metódusát Select() , amely viszont meghív egy metódust az Üzleti logikai rétegből (BLL), amely meghív egy metódust a megfelelő Data Access Layer (DAL) TableAdapterben, amely viszont egy lekérdezést SELECT küld a Northwind-adatbázisnak.

Ne feledje, hogy amikor az első oktatóanyagban létrehoztuk a TableAdapterst a DAL-ban, a Visual Studio automatikusan hozzáadott metódusokat az alapul szolgáló adatbázistábla adatainak beszúrásához, frissítéséhez és törléséhez. Emellett az üzleti logikai réteg létrehozásakor olyan módszereket terveztünk a BLL-ben, amelyek lehívták ezeket az adatmódosítási DAL metódusokat.

A metódus mellett Select() az ObjectDataSource is rendelkezik Insert(), Update()és Delete() metódusokkal is. A Select() módszerhez hasonlóan ez a három módszer is leképezhető egy mögöttes objektum metódusaihoz. Ha adatok beszúrására, frissítésére vagy törlésére van konfigurálva, a GridView, a DetailsView és a FormView vezérlők felhasználói felületet biztosítanak az alapul szolgáló adatok módosításához. Ez a felhasználói felület meghívja az Insert()ObjectDataSource metódusait Update()és Delete() metódusait, amelyek ezután meghívják az alapul szolgáló objektum társított metódusait (lásd az 1. ábrát).

Az ObjectDataSource Beszúrás(), Update() és Delete() metódusai proxyként szolgálnak a BLL-ben

1. ábra: Az ObjectDataSource Insert(), Update()és Delete() a metódusok proxyként szolgálnak a BLL-ben (kattintson ide a teljes méretű kép megtekintéséhez)

Ebben az oktatóanyagban megismerjük, hogyan képezhetjük le az ObjectDataSourceInsert()Update()- és Delete() metódusokat a BLL osztályainak metódusaihoz, valamint hogyan konfigurálhatjuk a GridView, a DetailsView és a FormView vezérlőket az adatmódosítási képességek biztosításához.

1. lépés: Weboldalak létrehozása a beszúrási, frissítési és törlési oktatóanyagokhoz

Mielőtt elkezdenénk feltárni az adatok beszúrásának, frissítésének és törlésének módját, először szánjunk egy kis időt arra, hogy létrehozzuk a webhelyprojekt ASP.NET lapjait, amelyekre szükségünk lesz az oktatóanyaghoz és a következő néhányhoz. Első lépésként adjon hozzá egy új mappát.EditInsertDelete Ezután adja hozzá a következő ASP.NET lapokat a mappához, és mindenképpen társítsa az egyes lapokat a Site.master mesterlaphoz:

  • Default.aspx
  • Basics.aspx
  • DataModificationEvents.aspx
  • ErrorHandling.aspx
  • UIValidation.aspx
  • CustomizedUI.aspx
  • OptimisticConcurrency.aspx
  • ConfirmationOnDelete.aspx
  • UserLevelAccess.aspx

Az Modification-Related-oktatóanyagok ASP.NET lapjainak hozzáadása

2. ábra: Az ASP.NET-lapok hozzáadása az adat-Modification-Related oktatóanyagokhoz

A többi mappához Default.aspx hasonlóan a EditInsertDelete mappában is a szakasz oktatóanyagai jelennek meg. Ne feledje, hogy a SectionLevelTutorialListing.ascx Felhasználói vezérlő biztosítja ezt a funkciót. Ezért adja hozzá ezt a felhasználói vezérlőt a Default.aspx-hez úgy, hogy a Megoldáskezelőből húzza a lap Tervező nézetébe.

Adja hozzá a SectionLevelTutorialListing.ascx felhasználói vezérlőt a Default.aspx

3. ábra: A felhasználói vezérlő hozzáadása SectionLevelTutorialListing.ascx (Default.aspxide kattintva megtekintheti a teljes méretű képet)

Végül adja hozzá a lapokat bejegyzésként a Web.sitemap fájlhoz. Pontosabban adja hozzá a következő jelölést a testreszabott formázás <siteMapNode> után:

<siteMapNode title="Editing, Inserting, and Deleting"
    url="~/EditInsertDelete/Default.aspx"
    description="Samples of Reports that Provide Editing, Inserting,
                  and Deleting Capabilities">
    <siteMapNode url="~/EditInsertDelete/Basics.aspx"
        title="Basics"
        description="Examines the basics of data modification with the
                      GridView, DetailsView, and FormView controls." />
    <siteMapNode url="~/EditInsertDelete/DataModificationEvents.aspx"
        title="Data Modification Events"
        description="Explores the events raised by the ObjectDataSource
                      pertinent to data modification." />
    <siteMapNode url="~/EditInsertDelete/ErrorHandling.aspx"
        title="Error Handling"
        description="Learn how to gracefully handle exceptions raised
                      during the data modification workflow." />
    <siteMapNode url="~/EditInsertDelete/UIValidation.aspx"
        title="Adding Data Entry Validation"
        description="Help prevent data entry errors by providing validation." />
    <siteMapNode url="~/EditInsertDelete/CustomizedUI.aspx"
        title="Customize the User Interface"
        description="Customize the editing and inserting user interfaces." />
    <siteMapNode url="~/EditInsertDelete/OptimisticConcurrency.aspx"
        title="Optimistic Concurrency"
        description="Learn how to help prevent simultaneous users from
                      overwritting one another s changes." />
    <siteMapNode url="~/EditInsertDelete/ConfirmationOnDelete.aspx"
        title="Confirm On Delete"
        description="Prompt a user for confirmation when deleting a record." />
    <siteMapNode url="~/EditInsertDelete/UserLevelAccess.aspx"
        title="Limit Capabilities Based on User"
        description="Learn how to limit the data modification functionality
                      based on the user role or permissions." />
</siteMapNode>

A frissítés Web.sitemapután szánjon egy kis időt az oktatóanyagok webhelyének megtekintésére egy böngészőben. A bal oldali menü mostantól tartalmazza az oktatóanyagok szerkesztéséhez, beszúrásához és törléséhez szükséges elemeket.

A webhelytérkép most már tartalmazza a szerkesztési, beszúrási és törlési oktatóanyagok bejegyzéseit

4. ábra: A webhelytérkép mostantól tartalmazza a szerkesztési, beszúrási és törlési oktatóanyagok bejegyzéseit

2. lépés: Az ObjectDataSource vezérlő hozzáadása és konfigurálása

Mivel a GridView, a DetailsView és a FormView mindegyike különbözik az adatmódosítási képességeiktől és elrendezésüktől, egyenként vizsgáljuk meg őket. Ahelyett azonban, hogy mindegyik vezérlő saját ObjectDataSource-t használ, hozzunk létre egyetlen ObjectDataSource-t, amelyet mindhárom vezérlő-példa megoszthat.

Nyissa meg a Basics.aspx lapot, húzza az ObjectDataSource-t az eszközkészletből a Tervezőbe, és kattintson az adatforrás konfigurálása hivatkozásra az intelligens címkéről. Mivel ez ProductsBLL az egyetlen BLL-osztály, amely szerkesztési, beszúrási és törlési módszereket biztosít, konfigurálja az ObjectDataSource-t az osztály használatára.

Az ObjectDataSource konfigurálása a ProductsBLL osztály használatára

5. ábra: Az ObjectDataSource konfigurálása az ProductsBLL osztály használatára (kattintson ide a teljes méretű kép megtekintéséhez)

A következő képernyőn megadhatjuk, hogy az ProductsBLL osztály metódusai közül melyek vannak leképezve az ObjectDataSource Select(), Insert(), Update() és Delete() elemeire, a megfelelő lap kiválasztásával és a metódus kiválasztásával a legördülő listából. A 6. ábra, amely már ismerős lehet, összekapcsolja az ObjectDataSource Select() metódusát az ProductsBLL osztály GetProducts() metódusával. A Insert(), Update()és Delete() metódusok úgy konfigurálhatók, hogy a lista tetején a megfelelő lapot választja.

Az ObjectDataSource adja vissza az összes terméket

6. ábra: Az ObjectDataSource visszaadja az összes terméket (ide kattintva megtekintheti a teljes méretű képet)

A 7., 8. és 9. ábra az ObjectDataSource UPDATE, INSERT és DELETE lapjait jeleníti meg. Konfigurálja ezeket a lapokat úgy, hogy a Insert(), Update(), és Delete() metódusok meghívják a ProductsBLL osztály UpdateProduct, AddProduct, illetve DeleteProduct metódusait.

Az ObjectDataSource Update() metódusának leképezése a ProductBLL-osztály UpdateProduct metódusára

7. ábra: Az ObjectDataSource metódusának leképezése Update() az ProductBLL osztály metódusára UpdateProduct (kattintson ide a teljes méretű kép megtekintéséhez)

Az ObjectDataSource Insert() metódusának megfeleltetése a ProductBLL-osztály AddProduct metódusával

8. ábra: Az ObjectDataSource metódusának leképezése Insert() az ProductBLL osztály Hozzáadás Product metódusához (ide kattintva megtekintheti a teljes méretű képet)

Az ObjectDataSource Delete() metódusának leképezése a ProductBLL-osztály DeleteProduct metódusára

9. ábra: Az ObjectDataSource metódusának leképezése Delete() az ProductBLL osztály metódusára DeleteProduct (ide kattintva megtekintheti a teljes méretű képet)

Bizonyára észrevette, hogy az UPDATE, INSERT és DELETE fülek legördülő listáiban már ki vannak választva ezek a metódusok. Ez annak köszönhető, hogy az általunk használt DataObjectMethodAttribute díszíti a ProductsBLL módszereit. A DeleteProduct metódus például a következő aláírást tartalmazza:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Delete, true)]
public bool DeleteProduct(int productID)
{
    ...
}

Az DataObjectMethodAttribute attribútum jelzi az egyes metódusok célját, függetlenül attól, hogy az a kijelölésre, beszúrásra, frissítésre vagy törlésre szolgál-e, és hogy ez-e az alapértelmezett érték. Ha ezeket az attribútumokat nem tette meg a BLL-osztályok létrehozásakor, manuálisan kell kiválasztania a metódusokat az UPDATE, INSERT és DELETE lapon.

Miután meggyőződött arról, hogy a megfelelő ProductsBLL metódusok az ObjectDataSource Insert(), Update(), és Delete() metódusaihoz vannak rendelve, kattintson a "Befejezés" gombra, hogy befejezze a varázslót.

Az ObjectDataSource jelölésének vizsgálata

Miután konfigurálta az ObjectDataSource-t a varázslón keresztül, lépjen a Forrás nézetre a létrehozott deklaratív korrektúra vizsgálatához. A <asp:ObjectDataSource> címke a mögöttes objektumot és a meghívandó metódusokat határozza meg. Emellett vannak DeleteParameters, UpdateParameters, és InsertParameters, amelyek az ProductsBLL osztály bemeneti paramétereihez és a AddProduct, UpdateProduct, valamint DeleteProduct metódusaihoz vannak megfeleltetve.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    DeleteMethod="DeleteProduct" InsertMethod="AddProduct"
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts"
    TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
    <DeleteParameters>
        <asp:Parameter Name="productID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <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" />
        <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>

Az ObjectDataSource tartalmaz egy paramétert az egyes bemeneti paraméterekhez a társított metódusokhoz, ahogyan az s-ek listája SelectParameter is jelen van, amikor az ObjectDataSource úgy van konfigurálva, hogy meghívjon egy olyan kiválasztási metódust, amely bemeneti paramétert vár (például GetProductsByCategoryID(categoryID)). Amint rövidesen látni fogjuk, ezek DeleteParametersUpdateParametersInsertParameters értékeit a GridView, a DetailsView és a FormView automatikusan állítja be az ObjectDataSource metódusának Insert()vagy Update() metódusának meghívása Delete()előtt. Ezeket az értékeket szükség szerint programozott módon is be lehet állítani, amint azt egy későbbi oktatóanyagban tárgyaljuk.

A varázsló ObjectDataSource-ra való konfigurálásának egyik mellékhatása, hogy a Visual Studio az OldValuesParameterFormatString tulajdonságot a következőre original_{0}állítja. Ez a tulajdonságérték a szerkesztett adatok eredeti értékeit tartalmazza, és két esetben hasznos:

  • Ha egy rekord szerkesztésekor a felhasználók módosíthatják az elsődleges kulcs értékét. Ebben az esetben az új elsődleges kulcs értékét és az eredeti elsődleges kulcs értékét is meg kell adni, hogy az eredeti elsődleges kulcs értékkel rendelkező rekord megtalálható legyen, és ennek megfelelően frissüljön az értéke.
  • Optimista egyidejűség használata esetén. Az optimista egyidejűség egy olyan technika, amellyel biztosítható, hogy két egyidejű felhasználó ne írja felül egymás módosításait, és egy későbbi oktatóanyag témája legyen.

A OldValuesParameterFormatString tulajdonság az alapul szolgáló objektum frissítési és törlési metódusaiban szereplő bemeneti paraméterek nevét jelzi az eredeti értékekhez. Az optimista egyidejűség vizsgálatakor részletesebben tárgyaljuk ezt a tulajdonságot és e tulajdonság célját. Most azonban felhozom, mert a BLL módszerei nem várják az eredeti értékeket, ezért fontos, hogy eltávolítsuk ezt a tulajdonságot. Ha a tulajdonságot nem az alapértelmezett (OldValuesParameterFormatString) {0} értékre állítja, hibát okoz, amikor egy adatweb-vezérlő megkísérli meghívni az ObjectDataSource Update() vagy Delete() metódusait, mert az ObjectDataSource megpróbálja átadni mind a megadott UpdateParameters, mind az eredeti DeleteParameters értékparamétereket.

Ha ez ebben a helyzetben nem teljesen egyértelmű, ne aggódjon, egy későbbi oktatóanyagban megvizsgáljuk ezt a tulajdonságot és annak segédprogramját. Egyelőre csak biztos lehet benne, hogy teljesen eltávolítja ezt a tulajdonságdeklarációt a deklaratív szintaxisból, vagy beállítja az értéket az alapértelmezett értékre ({0}).

Megjegyzés:

Ha egyszerűen törli a tulajdonság értékét a OldValuesParameterFormatString Tervező nézetben a Tulajdonságok ablakból, a tulajdonság továbbra is létezik a deklaratív szintaxisban, de egy üres sztringre lesz beállítva. Ez sajnos továbbra is ugyanazt a problémát eredményezi, amelyet fent említettünk. Ezért távolítsa el teljesen a tulajdonságot a deklaratív szintaxisból, vagy a Tulajdonságok ablakból állítsa be az alapértelmezett értéket. {0}

3. lépés: Adat-webvezérlő hozzáadása és konfigurálása adatmódosításhoz

Miután hozzáadtuk az ObjectDataSource-t a laphoz, és konfiguráltuk, készen állunk arra, hogy adat-webvezérlőket adjunk hozzá a laphoz, hogy megjelenítsük az adatokat, és módot biztosítsunk a végfelhasználó számára a módosításra. Külön tekintjük meg a GridView, a DetailsView és a FormView nézetet, mivel ezek az adatweb-vezérlők az adatmódosítási képességeikben és konfigurációjukban különböznek.

Ahogy a cikk hátralévő részében látni fogjuk, a szerkesztés, beillesztés és törlés alapvető támogatásának hozzáadása a GridView, DetailsView és FormView vezérlőkön keresztül valóban annyira egyszerű, mint néhány jelölőnégyzet bejelölése. A valóságban számos finomság és szélsőséges eset létezik, amelyek megnehezítik az ilyen funkciók biztosítását, mint egyszerűen a kattintás. Ez az oktatóanyag azonban kizárólag az egyszerű adatmódosítási képességek bizonyítására összpontosít. A jövőbeli oktatóanyagok olyan aggodalmakat vizsgálnak meg, amelyek kétségtelenül valós környezetben merülnek fel.

Adatok törlése a GridView-ból

Először húzzon egy GridView-t az eszközkészletből a Tervezőbe. Ezután kösse az ObjectDataSource-t a GridView-hoz úgy, hogy kiválasztja azt a GridView intelligens címkéjének legördülő listájából. Ezen a ponton a GridView deklaratív jelölése a következő lesz:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False"
            ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName"
            SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
           SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
           SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit"
           HeaderText="QuantityPerUnit"
           SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
           SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
           HeaderText="UnitsInStock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
           HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel"
           HeaderText="ReorderLevel" SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
        <asp:BoundField DataField="CategoryName"
           HeaderText="CategoryName" ReadOnly="True"
            SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
            HeaderText="SupplierName" ReadOnly="True"
            SortExpression="SupplierName" />
    </Columns>
</asp:GridView>

A GridView és az ObjectDataSource intelligens címkén keresztüli kötése két előnnyel jár:

  • A BoundFields és a CheckBoxFields automatikusan létrejön az ObjectDataSource által visszaadott mezők mindegyikéhez. Ezenkívül a BoundField és a CheckBoxField tulajdonságai a mögöttes mező metaadatai alapján vannak beállítva. Például a ProductID, CategoryName és SupplierName mezők írásvédettként vannak megjelölve a ProductsDataTable-ban, ezért nem szabad őket frissíteni szerkesztéskor. Ennek megfelelően a BoundFields ReadOnly tulajdonsága a következőre truevan állítva: .
  • A DataKeyNames tulajdonság a mögöttes objektum elsődleges kulcsmezőihez van rendelve. Ez elengedhetetlen az adatok szerkesztéséhez vagy törléséhez a GridView használatakor, mivel ez a tulajdonság azt a mezőt (vagy mezőkészletet) jelzi, amely egyedi módon azonosítja az egyes rekordokat. A DataKeyNames tulajdonsággal kapcsolatos további információkért hivatkozzon a Master/Detail Using a Selectable Master GridView with a Details DetailView oktatóanyagra.

Bár a GridView a Tulajdonságok ablakban vagy deklaratív szintaxissal köthető az ObjectDataSource-hoz, ehhez manuálisan kell hozzáadnia a megfelelő BoundFieldet és DataKeyNames korrektúrát.

A GridView vezérlő beépített támogatást nyújt a sorszintű szerkesztéshez és törléshez. Ha a GridView-t úgy konfigurálja, hogy támogassa a törlést, a Törlés gombokat tartalmazó oszlopot ad hozzá. Amikor a végfelhasználó egy adott sor Törlés gombjára kattint, megjelenik egy postback, és a GridView végrehajtja a következő lépéseket:

  1. Az ObjectDataSource DeleteParameters érték(ek) hozzárendelésre kerülnek
  2. Meghívja az ObjectDataSource metódusát Delete() , és törli a megadott rekordot
  3. A GridView újracsatlakozik az ObjectDataSource-hoz a saját Select() metódusának meghívásával.

A hozzájuk rendelt DeleteParameters értékek annak a sornak a DataKeyNames mező(ke)nek az értékei, amelyre a Törlés gombra kattintott. Ezért létfontosságú, hogy a GridView tulajdonsága DataKeyNames helyesen legyen beállítva. Ha hiányzik, az DeleteParameters 1. lépésben a rendszer egy null értéket rendel hozzá, amely viszont nem eredményez törölt rekordokat a 2. lépésben.

Megjegyzés:

A DataKeys gyűjtemény a GridView vezérlőállapotában van tárolva, ami azt jelenti, hogy a rendszer akkor is emlékezni fog az DataKeys értékekre, ha a GridView nézetállapota le van tiltva. Nagyon fontos azonban, hogy a nézet állapota továbbra is engedélyezve legyen a szerkesztést vagy törlést támogató GridViews esetében (az alapértelmezett viselkedés). Ha a GridView tulajdonságot úgy állítja EnableViewState be, hogy falsea szerkesztési és törlési viselkedés egyetlen felhasználó esetében jól működik, de ha egyidejűleg vannak olyan felhasználók, akik adatokat törölnek, fennáll annak a lehetősége, hogy ezek az egyidejű felhasználók véletlenül törölnek vagy szerkesztenek olyan rekordokat, amelyeket nem akartak.

Ugyanez a figyelmeztetés a DetailsViewsra és a FormViewsra is vonatkozik.

Ha törlési képességeket szeretne hozzáadni a GridView-hoz, egyszerűen lépjen az intelligens címkéjére, és jelölje be a Törlés engedélyezése jelölőnégyzetet.

Jelölje be a Törlés engedélyezése jelölőnégyzetet

10. ábra: A Törlés engedélyezése jelölőnégyzet ellenőrzése

Az intelligens címkéről a Törlés engedélyezése jelölőnégyzet bejelölése egy CommandFieldet ad hozzá a GridView-hoz. A CommandField egy oszlopot jelenít meg a GridView-ban a következő feladatok végrehajtására szolgáló gombokkal: rekord kiválasztása, rekord szerkesztése és rekord törlése. Korábban a CommandField működés közben volt, amikor rekordokat választott ki a Master/Detail Using a Selectable Master GridView és a Details DetailView oktatóanyagban.

A CommandField számos ShowXButton tulajdonságot tartalmaz, amelyek jelzik, hogy milyen gombsorozatok jelennek meg a CommandFieldben. A Törlés engedélyezése jelölőnégyzet bejelölésével egy CommandField, amelynek ShowDeleteButton tulajdonsága true, hozzáadódik a GridView Oszlopok gyűjteményéhez.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        ... BoundFields removed for brevity ...
    </Columns>
</asp:GridView>

El se hinnéd, de ezen a ponton végre befejeztük a törlési támogatás hozzáadását a GridView-hoz! Ahogy a 11. ábrán látható, a lap böngészőn keresztüli felkeresésekor a Delete gombok oszlopa jelenik meg.

A CommandField hozzáadja a törlési gombok oszlopát

11. ábra: A CommandField hozzáadja a törlési gombok oszlopát (ide kattintva megtekintheti a teljes méretű képet)

Ha ezt az oktatóanyagot az alapoktól kezdve önállóan készíti el, a lap Törlés gombra kattintva történő tesztelése kivételt fog eredményezni. Folytassa az olvasást, hogy megtudja, miért keletkeztek ezek a kivételek, és hogyan lehet kijavítani őket.

Megjegyzés:

Ha követi az ezzel az oktatóanyaggal járó letöltést, ezek a problémák már figyelembe lettek véve. Ugyanakkor azt javaslom, hogy olvassa át az alábbi részleteket, hogy segítsen azonosítani a problémákat, amelyek felmerülhetnek, és megfelelő megoldásokat.

Ha egy termék törlésekor olyan kivételt kap, amelynek üzenete hasonló az "ObjectDataSource "ObjectDataSource1" kifejezéshez, nem talál olyan nem általános "DeleteProduct" metódust, amely paraméterekkel rendelkezik: productID, original_ProductID, akkor valószínűleg elfelejtette eltávolítani a tulajdonságot az OldValuesParameterFormatString ObjectDataSource-ból. Az OldValuesParameterFormatString tulajdonság megadása esetén az ObjectDataSource megkísérli mind a productID, mind a original_ProductID bemeneti paramétert átadni a DeleteProduct metódusnak. DeleteProductazonban csak egyetlen bemeneti paramétert fogad el, ezért kivételt képez. A OldValuesParameterFormatString tulajdonság eltávolítása (vagy beállítása {0}) arra utasítja az ObjectDataSource-t, hogy ne kísérelje meg az eredeti bemeneti paraméter átadását.

Győződjön meg arról, hogy az OldValuesParameterFormatString tulajdonság törölve lett

12. ábra: Győződjön meg arról, hogy a OldValuesParameterFormatString tulajdonság törölve lett (kattintson ide a teljes méretű kép megtekintéséhez)

Még ha eltávolította is a OldValuesParameterFormatString tulajdonságot, akkor is kivételt kap, amikor megpróbál törölni egy terméket a következő üzenettel: "A DELETE utasítás ütközött az 'FK_Order_Details_Products' hivatkozási kényszerrel." A Northwind-adatbázis tartalmaz egy idegen kulcsot a Order Details és a Products tábla között, ami azt jelenti, hogy egy terméket nem lehet törölni a rendszerből, ha egy vagy több rekord van hozzá a Order Details táblában. Mivel a Northwind-adatbázisban minden termékben van legalább egy rekord Order Details, addig nem törölhetünk termékeket, amíg először nem töröljük a termékhez tartozó rendelés részleteit tartalmazó rekordokat.

Idegenkulcs-korlátozás tiltja a termékek törlését

13. ábra: Egy idegenkulcs-korlátozás tiltja a termékek törlését (kattintson ide a teljes méretű kép megtekintéséhez)

Oktatóanyagunkhoz egyszerűen töröljük az összes rekordot a Order Details táblából. Egy valós alkalmazásban a következőkre lenne szükségünk:

  • Legyen egy másik képernyő a rendelés részleteinek kezelésére.
  • A metódus kiegészítése a DeleteProduct megadott termék rendelési adatainak törléséhez szükséges logikával
  • Módosítsa a TableAdapter által használt SQL-lekérdezést, hogy tartalmazza a megadott termék rendelési adatainak törlését

Egyszerűen töröljük az összes rekordot a táblából, Order Details hogy megkerüljük az idegenkulcs-korlátozást. Nyissa meg a Kiszolgálókezelőt a Visual Studióban, kattintson a jobb gombbal a csomópontra, és válassza az NORTHWND.MDF Új lekérdezés lehetőséget. Ezután a lekérdezési ablakban futtassa a következő SQL-utasítást: DELETE FROM [Order Details]

Az összes rekord törlése a Rendelés részletei táblából

14. ábra: Az összes rekord törlése a Order Details táblázatból (ide kattintva megtekintheti a teljes méretű képet)

Miután törölte a táblát, Order Details a Törlés gombra kattintva hiba nélkül törli a terméket. Ha a Törlés gombra kattintva nem törli a terméket, ellenőrizze, hogy a GridView tulajdonsága DataKeyNames az elsődleges kulcsmezőre (ProductID) van-e állítva.

Megjegyzés:

Amikor a Törlés gombra kattint, egy utólagos visszavétel jön létre, és a rekord törlődik. Ez veszélyes lehet, mivel könnyen lehet véletlenül a rossz sor Törlés gombjára kattintani. Egy későbbi oktatóanyagban látni fogjuk, hogyan adhat hozzá ügyféloldali megerősítést egy rekord törlésekor.

Adatok szerkesztése a GridView használatával

A törlés mellett a GridView vezérlő beépített sorszintű szerkesztési támogatást is biztosít. Ha a GridView-t úgy konfigurálja, hogy támogassa a szerkesztést, a Szerkesztés gombokat tartalmazó oszlopot ad hozzá. A végfelhasználó szempontjából a sor Szerkesztés gombjára kattintva a sor szerkeszthetővé válik, a cellákat a meglévő értékeket tartalmazó szövegdobozokká alakítja, és a Szerkesztés gombot a Frissítés és a Mégse gombra cseréli. A kívánt módosítások elvégzése után a végfelhasználó a Frissítés gombra kattintva véglegesítheti a módosításokat, a Mégse gombra kattintva pedig elvetheti őket. Mindkét esetben a Frissítés vagy a Mégse gombra kattintás után a GridView visszaáll az előzetes szerkesztési állapotra.

Lapfejlesztői szempontból, amikor a végfelhasználó egy adott sor Szerkesztés gombjára kattint, megjelenik egy postback, és a GridView a következő lépéseket hajtja végre:

  1. A GridView tulajdonsága EditItemIndex annak a sornak az indexéhez van rendelve, amelyre a Szerkesztés gombra kattintott
  2. A GridView újracsatlakozik az ObjectDataSource-hoz a saját Select() metódusának meghívásával.
  3. Az egyező EditItemIndex sorindex "szerkesztési módban" jelenik meg. Ebben a módban a Szerkesztés gombot a Frissítés és a Mégse gomb váltja fel, és a False (alapértelmezett) tulajdonságú ReadOnly BoundFieldek szövegmező-webvezérlőkként jelennek meg, amelyek Text tulajdonságai az adatmezők értékeihez vannak rendelve.

Ekkor a korrektúra visszakerül a böngészőbe, így a végfelhasználó módosíthatja a sor adatait. Amikor a felhasználó a Frissítés gombra kattint, visszavétel történik, és a GridView végrehajtja a következő lépéseket:

  1. Az ObjectDataSource UpdateParameters értéke(i) a végfelhasználó által megadott értékeket rendelik a GridView szerkesztőfelületéhez
  2. A rendszer meghívja az ObjectDataSource metódusát Update() , és frissíti a megadott rekordot
  3. A GridView újracsatlakozik az ObjectDataSource-hoz a saját Select() metódusának meghívásával.

Az 1. lépésben hozzárendelt UpdateParameters elsődleges kulcsértékek a tulajdonságban DataKeyNames megadott értékekből származnak, míg a nem elsődleges kulcsértékek a szerkesztett sor Szövegdoboz webes vezérlőinek szövegéből származnak. A törléshez hasonlóan létfontosságú, hogy a GridView tulajdonsága DataKeyNames helyesen legyen beállítva. Ha hiányzik, akkor az UpdateParameters elsődleges kulcsnak egy null érték lesz hozzárendelve az 1. lépés során, ami viszont nem eredményezi, hogy a 2. lépésben bármilyen rekordokat frissítünk.

A szerkesztési funkció aktiválásához egyszerűen jelölje be a Szerkesztés engedélyezése jelölőnégyzetet a GridView intelligens címkéjében.

Jelölje be a Szerkesztés engedélyezése jelölőnégyzetet

15. ábra: A Szerkesztés engedélyezése jelölőnégyzet ellenőrzése

Ha bejelöli a szerkesztés engedélyezése jelölőnégyzetet, szükség esetén hozzáad egy vezérlőmezőt, és beállítja annak ShowEditButton tulajdonságát true értékre. Ahogy korábban láttuk, a CommandField számos ShowXButton tulajdonságot tartalmaz, amelyek jelzik, hogy milyen gombsorozatok jelennek meg a CommandFieldben. A Szerkesztés engedélyezése jelölőnégyzet bejelölésével hozzáadja a ShowEditButton tulajdonságot a meglévő CommandFieldhez:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" />
        ... BoundFields removed for brevity ...
    </Columns>
</asp:GridView>

Ennyi az alapvető szerkesztési támogatás hozzáadásának módja. Ahogy a 16. ábrán látható, a szerkesztőfelület meglehetősen nyers, minden egyes BoundField, amelynek ReadOnly tulajdonsága false (ez az alapértelmezett), szövegdobozként jelenik meg. Ide tartoznak az olyan mezők, mint CategoryID az és SupplierID, amelyek más táblák kulcsai.

A Chai s Szerkesztés gombra kattintva a sor szerkesztési módban jelenik meg

16. ábra: A Chai szerkesztési gombra kattintva a sor szerkesztési módban jelenik meg (kattintással megtekintheti a teljes méretű képet)

Amellett, hogy arra kéri a felhasználókat, hogy közvetlenül szerkeszthessenek idegen kulcsértékeket, a szerkesztőfelület felülete hiányzik a következő módokon:

  • Ha a felhasználó beír egy CategoryID vagy SupplierID olyant, amely nem létezik az adatbázisban, a UPDATE rendszer megsért egy idegenkulcs-korlátozást, ami kivételt okoz.
  • A szerkesztőfelület nem tartalmaz érvényesítést. Ha nem ad meg kötelező értéket (például ProductName), vagy olyan sztringértéket ad meg, amelyben numerikus érték várható (például a "Túl sok!" szöveget írja be a UnitPrice szövegmezőbe), a rendszer kivételt jelez. Egy későbbi oktatóanyag megvizsgálja, hogyan adhat hozzá érvényesítési vezérlőket a szerkesztő felhasználói felülethez.
  • Jelenleg minden nem írásvédett termékmezőnek szerepelnie kell a GridView-ban. Ha eltávolítanánk egy mezőt a GridView-ból, például UnitPriceaz adatok frissítésekor a GridView nem állítaná be az UnitPriceUpdateParameters értéket, ami az adatbázisrekord UnitPriceNULL értékét módosítaná. Hasonlóképpen, ha egy kötelező mező(például ProductName) el van távolítva a GridView-ból, a frissítés ugyanazzal a "ProductName oszlop" kivétellel meghiúsul, amely nem engedélyezi a fent említett null értékeket.
  • A szerkesztőfelület formázása sok kívánnivalót hagy maga után. Ez UnitPrice négy tizedesponttal jelenik meg. Ideális esetben a CategoryID és a SupplierID értékek olyan legördülő listákat tartalmaznak, amelyek felsorolják a rendszer kategóriáit és szállítóit.

Ezek mind olyan hiányosságok, amelyekkel egyelőre együtt kell élnünk, de a jövőbeni oktatóanyagokban foglalkozunk velük.

Adatok beszúrása, szerkesztése és törlése a DetailsView használatával

Ahogy a korábbi oktatóanyagokban láttuk, a DetailsView vezérlő egyszerre egy rekordot jelenít meg, és a GridView-hoz hasonlóan lehetővé teszi a jelenleg megjelenített rekord szerkesztését és törlését. A végfelhasználó számára a DetailsView-ben elemek szerkesztése és törlése, valamint az ASP.NET-oldali munkafolyamat ugyanúgy tapasztalható, mint a GridView esetében. A DetailsView abban különbözik a GridView-tól, hogy beépített beszúrási támogatást is biztosít.

A GridView adatmódosítási képességeinek bemutatásához először adjon hozzá egy DetailsView nézetet a Basics.aspx meglévő GridView feletti laphoz, és kösse azt a meglévő ObjectDataSource-hoz a DetailsView intelligens címkéje segítségével. Ezután törölje a DetailsView Height és Width tulajdonságait, és jelölje be a Lapozás engedélyezése opciót az intelligens címkénél. A szerkesztési, beszúrási és törlési támogatás engedélyezéséhez egyszerűen jelölje be a Szerkesztés engedélyezése, a Beszúrás engedélyezése és a Törlés engedélyezése jelölőnégyzetet az intelligens címkén.

Képernyőkép a DetailsView Feladatok ablakról a Beszúrás engedélyezése, a Szerkesztés engedélyezése és a Törlés engedélyezése jelölőnégyzet bejelölésével.

17. ábra: A DetailsView konfigurálása a szerkesztés, a beszúrás és a törlés támogatásához

A GridView-hoz hasonlóan a szerkesztési, beszúrási vagy törlési támogatás hozzáadása egy CommandFieldet ad hozzá a DetailsView-hoz, ahogy az alábbi deklaratív szintaxis mutatja:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True">
    <Fields>
        <asp:BoundField DataField="ProductID"
            HeaderText="ProductID" InsertVisible="False"
            ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName"
            HeaderText="ProductName" SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
            SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit"
            HeaderText="QuantityPerUnit"
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice"
            HeaderText="UnitPrice" SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
            HeaderText="UnitsInStock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
            HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel"
            HeaderText="ReorderLevel" SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued"
            HeaderText="Discontinued" SortExpression="Discontinued" />
        <asp:BoundField DataField="CategoryName"
            HeaderText="CategoryName" ReadOnly="True"
            SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
            HeaderText="SupplierName" ReadOnly="True"
            SortExpression="SupplierName" />
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" ShowInsertButton="True" />
    </Fields>
</asp:DetailsView>

Vegye figyelembe, hogy a DetailsView esetében a CommandField alapértelmezés szerint az Oszlopok gyűjtemény végén jelenik meg. Mivel a DetailsView mezői sorokként jelennek meg, a CommandField sorként jelenik meg a DetailsView alján található Beszúrás, Szerkesztés és Törlés gombokkal.

Képernyőkép a DetailsView nézetről, amelyen a CommandField alsó sorként jelenik meg beszúrási, szerkesztési és törlési gombokkal.

18. ábra: A DetailsView konfigurálása a szerkesztés, a beszúrás és a törlés támogatásához (kattintson ide a teljes méretű kép megtekintéséhez)

A Törlés gombra kattintva ugyanaz az eseménysorozat indul el, mint a GridView: postback; ezt követően a DetailsView feltölti az ObjectDataSource DeleteParameters objektumait az DataKeyNames értékek alapján; és egy hívással befejeződött az ObjectDataSource Delete() metódusa, amely ténylegesen eltávolítja a terméket az adatbázisból. A DetailsView-ban való szerkesztés ugyanúgy működik, mint a GridView.

A beszúráshoz a végfelhasználó egy Új gombot jelenít meg, amely kattintáskor "beszúrási módban" jeleníti meg a DetailsView nézetet. A "beszúrási mód" esetében az Új gombot a Beszúrás és a Mégse gomb váltja fel, és csak azok a BoundFieldek jelennek meg, amelyek InsertVisible tulajdonsága (alapértelmezett) értékre van állítva true . Az automatikus növekményes mezőkként azonosított adatmezőknél az ProductIDInsertVisible tulajdonság értéke akkor van beállítvafalse, amikor a DetailsView-t az intelligens címkén keresztül köti az adatforráshoz.

Amikor adatforrást köt egy DetailsView-hoz az intelligens címkén keresztül, a Visual Studio csak az automatikusan növekvő mezőkre InsertVisible állítja be a false tulajdonságot. Az írásvédett mezők (például CategoryName és SupplierName) a "beszúrási mód" felhasználói felületén jelennek meg, hacsak a InsertVisible tulajdonságuk nincs kifejezetten false értékre beállítva. Szánjon egy kis időt arra, hogy a két mező InsertVisible tulajdonságait false állítsa be, akár a DetailsView deklaratív szintaxisán keresztül, akár az intelligens címke Mezők szerkesztése hivatkozásán keresztül. A 19. ábrán a InsertVisible Mezők szerkesztése hivatkozásra kattintva állíthatja be a tulajdonságokat false .

Képernyőkép a Mezők ablakról, amelyen az InsertVisible tulajdonság értéke Hamis.

19. ábra: A Northwind Traders mostantól Acme Teát kínál (kattintson a teljes méretű kép megtekintéséhez)

Miután beállította a InsertVisible tulajdonságokat, tekintse meg a Basics.aspx lapot egy böngészőben, és kattintson az Új gombra. A 20. ábra a DetailsView-t mutatja, amikor új italt, az Acme Teát ad hozzá a terméksorhoz.

Képernyőkép a Basics.aspx lap DetailsView eleméről egy webböngészőben.

20. ábra: A Northwind Traders mostantól Acme Teát kínál (kattintson a teljes méretű kép megtekintéséhez)

Miután megadta az Acme Tea részleteit, és a Beszúrás gombra kattintott, visszajelzés történik, és az új rekord hozzáadódik az Products adatbázistáblához. Mivel ez a DetailsView az adatbázistáblában szereplő termékek sorrendjében listázza a termékeket, a legutolsó termékhez kell lapoznunk, hogy megtekinthessük az új terméket.

Az Acme Tea részletei

21. ábra: Az Acme Tea részletei (Kattintson ide a teljes méretű kép megtekintéséhez)

Megjegyzés:

A DetailsView CurrentMode tulajdonsága a megjelenített felületet jelzi, és a következő értékek egyike lehet: Edit, Insertvagy ReadOnly. A DefaultMode tulajdonság azt jelzi, hogy a DetailsView milyen módba tér vissza a szerkesztés vagy a beszúrás befejezése után, és hasznos lehet egy olyan DetailsView megjelenítéséhez, amely szerkesztési vagy beszúrási módban van.

A DetailsView pont- és kattintásszúrási és szerkesztési képességei ugyanazoktól a korlátozásoktól szenvednek, mint a GridView: a felhasználónak meg kell adnia a meglévőket CategoryID és SupplierID az értékeket egy szövegmezőn keresztül; a felület nem rendelkezik érvényesítési logikával; minden olyan termékmezőt, amely nem engedélyezi NULL az értékeket, vagy nem rendelkezik az adatbázis szintjén megadott alapértelmezett értékkel, szerepelnie kell a beszúrási felületen, és így tovább.

A Jövőbeni cikkekben a GridView szerkesztőfelületének kibővítésére és továbbfejlesztésére vonatkozó technikák alkalmazhatók a DetailsView vezérlő szerkesztési és beszúrási felületére is.

A FormView használata rugalmasabb adatmódosítási felhasználói felülethez

A FormView beépített támogatást nyújt az adatok beszúrásához, szerkesztéséhez és törléséhez, de mivel mezők helyett sablonokat használ, nincs helye a BoundFields vagy a GridView és a DetailsView vezérlők által használt CommandField hozzáadásának az adatmódosítási felület biztosításához. Ehelyett ezen a felületen manuálisan kell hozzáadni a felhasználói bemenetek gyűjtésére szolgáló webes vezérlőket, valamint az Új, Szerkesztés, Törlés, Beszúrás, Frissítés és Mégse gombokat a megfelelő sablonokhoz új elem hozzáadásakor vagy meglévő elem szerkesztésekor. Szerencsére a Visual Studio automatikusan létrehozza a szükséges felületet, amikor a FormView-t egy adatforráshoz köti az intelligens címke legördülő listájában.

Ezeknek a technikáknak a szemléltetéséhez először adjon hozzá egy FormView-t a Basics.aspx laphoz, és a FormView intelligens címkéje alapján kösse azt a már létrehozott ObjectDataSource-hoz. Ez létrehoz egy EditItemTemplate, InsertItemTemplate, és ItemTemplate a FormViewhoz, amely TextBox webes vezérlőkkel gyűjti a felhasználók bemenetét, és gomb webes vezérlőket biztosít az Új, Szerkesztés, Törlés, Beszúrás, Frissítés és Mégse funkciókra. Emellett a FormView DataKeyNames tulajdonság az ObjectDataSource által visszaadott objektum elsődleges kulcsmezőjére (ProductID) van beállítva. Végül ellenőrizze a Lapozás engedélyezése lehetőséget a FormView intelligens címkéjében.

Az alábbiakban látható a FormView deklaratív jelölése ItemTemplate, miután a FormView összekapcsolva lett az ObjectDataSource-szal. Alapértelmezés szerint minden nem logikai értékű termékmező a Címke web vezérlőelem tulajdonságához van kötve Text , míg minden logikai érték mező (Discontinued) egy letiltott Jelölőnégyzet webvezérlő tulajdonságához van kötve Checked . Annak érdekében, hogy az Új, Szerkesztés és Törlés gombok kattintáskor bizonyos FormView-viselkedést indítsanak el, elengedhetetlen, hogy értékeik rendre CommandName, New, és Edit legyen.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ...
    </EditItemTemplate>
    <InsertItemTemplate>
        ...
    </InsertItemTemplate>
    <ItemTemplate>
        ProductID:
        <asp:Label ID="ProductIDLabel" runat="server"
            Text='<%# Eval("ProductID") %>'></asp:Label><br />
        ProductName:
        <asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Bind("ProductName") %>'>
        </asp:Label><br />
        SupplierID:
        <asp:Label ID="SupplierIDLabel" runat="server"
            Text='<%# Bind("SupplierID") %>'>
        </asp:Label><br />
        CategoryID:
        <asp:Label ID="CategoryIDLabel" runat="server"
            Text='<%# Bind("CategoryID") %>'>
        </asp:Label><br />
        QuantityPerUnit:
        <asp:Label ID="QuantityPerUnitLabel" runat="server"
            Text='<%# Bind("QuantityPerUnit") %>'>
        </asp:Label><br />
        UnitPrice:
        <asp:Label ID="UnitPriceLabel" runat="server"
            Text='<%# Bind("UnitPrice") %>'></asp:Label><br />
        UnitsInStock:
        <asp:Label ID="UnitsInStockLabel" runat="server"
            Text='<%# Bind("UnitsInStock") %>'>
        </asp:Label><br />
        UnitsOnOrder:
        <asp:Label ID="UnitsOnOrderLabel" runat="server"
            Text='<%# Bind("UnitsOnOrder") %>'>
        </asp:Label><br />
        ReorderLevel:
        <asp:Label ID="ReorderLevelLabel" runat="server"
            Text='<%# Bind("ReorderLevel") %>'>
        </asp:Label><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
            Checked='<%# Bind("Discontinued") %>'
            Enabled="false" /><br />
        CategoryName:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Bind("CategoryName") %>'>
        </asp:Label><br />
        SupplierName:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Bind("SupplierName") %>'>
        </asp:Label><br />
        <asp:LinkButton ID="EditButton" runat="server"
            CausesValidation="False" CommandName="Edit"
            Text="Edit">
        </asp:LinkButton>
        <asp:LinkButton ID="DeleteButton" runat="server"
            CausesValidation="False" CommandName="Delete"
            Text="Delete">
        </asp:LinkButton>
        <asp:LinkButton ID="NewButton" runat="server"
            CausesValidation="False" CommandName="New"
            Text="New">
        </asp:LinkButton>
    </ItemTemplate>
</asp:FormView>

A 22. ábra mutatja a FormView ItemTemplate-t, amikor böngészőben tekintjük meg. Az egyes termékmezők alján az Új, a Szerkesztés és a Törlés gomb látható.

A Defaut FormView ItemTemplate listázza az egyes termékmezők listáját, valamint az új, szerkesztési és törlési gombokat

22. ábra: A Defaut FormView ItemTemplate listázza az egyes termékmezők listáját az Új, a Szerkesztés és a Törlés gombokkal együtt (kattintson ide a teljes méretű kép megtekintéséhez)

A GridView-hez és a DetailsView-hoz hasonlóan a Törlés gomb vagy bármely Button, LinkButton vagy ImageButton, amelynek CommandName tulajdonsága Delete értékre van állítva, visszaküldési eseményt idéz elő, feltölti az ObjectDataSource DeleteParameters értékét a FormView DataKeyNames alapján, és meghívja az ObjectDataSource Delete() metódusát.

Amikor a Szerkesztés gombra kattintanak, egy postback történik, és az adatok újrakötődnek a EditItemTemplate-hez, amely a szerkesztőfelület megjelenítéséért felelős. Ez a felület tartalmazza az adatok szerkesztésére szolgáló webes vezérlőket, valamint a Frissítés és a Mégse gombot. A Visual Studio által létrehozott alapértelmezett EditItemTemplate érték tartalmazza az automatikus növekményes mezők címkéjét (ProductID), minden nem logikai érték mező szövegmezőjét, és minden logikai érték mező jelölőnégyzetét. Ez a viselkedés nagyon hasonló az automatikusan létrehozott BoundFieldshez a GridView és a DetailsView vezérlőkben.

Megjegyzés:

Az egyik kis probléma a FormView EditItemTemplate automatikus generálása esetén az, hogy olyan TextBox Web vezérlőket hoz létre, amelyek írásvédett mezőknek, például CategoryName és SupplierName mezőknek vannak szánva. Hamarosan látni fogjuk, hogyan kell ezt elszámolni.

A Szövegdoboz vezérlők EditItemTemplate tulajdonsága Text a megfelelő adatmező értékéhez van kötve kétirányú adatkötéssel. A kétirányú adatkapcsolat, amelyet <%# Bind("dataField") %> jelöl, adatkötést végez mind az adatok sablonhoz való kötésekor, mind pedig az ObjectDataSource paramétereinek feltöltésekor a rekordok beszúrásához vagy szerkesztéséhez. Ez azt jelzi, hogy amikor a felhasználó a Szerkesztés gombra kattint a ItemTemplatefájlból, a Bind() metódus a megadott adatmezőértéket adja vissza. Miután a felhasználó végrehajtotta a módosításokat, és a Frissítés gombra kattintott, a rendszer a megadott Bind() adatmezőknek megfelelő visszaadott értékeket alkalmazza az ObjectDataSource-ra UpdateParameters. Másik lehetőségként az egyirányú adatkötés, amelyet <%# Eval("dataField") %> jelöl, csak akkor kéri le az adatmező értékeit, amikor az adatokat a sablonhoz köti, és nem adja vissza a felhasználó által megadott értékeket az adatforrás paramétereinek a visszaküldéskor.

Az alábbi deklaratív jelölés a FormView EditItemTemplate-ját mutatja be. Vegye figyelembe, hogy a metódust Bind() itt az adatkötés szintaxisa használja, és hogy a Frissítés és a Mégse gomb webes vezérlőinek tulajdonságai ennek megfelelően vannak CommandName beállítva.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ProductID:
        <asp:Label ID="ProductIDLabel1" runat="server"
          Text="<%# Eval("ProductID") %>"></asp:Label><br />
        ProductName:
        <asp:TextBox ID="ProductNameTextBox" runat="server"
          Text="<%# Bind("ProductName") %>">
        </asp:TextBox><br />
        SupplierID:
        <asp:TextBox ID="SupplierIDTextBox" runat="server"
          Text="<%# Bind("SupplierID") %>">
        </asp:TextBox><br />
        CategoryID:
        <asp:TextBox ID="CategoryIDTextBox" runat="server"
          Text="<%# Bind("CategoryID") %>">
        </asp:TextBox><br />
        QuantityPerUnit:
        <asp:TextBox ID="QuantityPerUnitTextBox" runat="server"
           Text="<%# Bind("QuantityPerUnit") %>">
        </asp:TextBox><br />
        UnitPrice:
        <asp:TextBox ID="UnitPriceTextBox" runat="server"
           Text="<%# Bind("UnitPrice") %>">
        </asp:TextBox><br />
        UnitsInStock:
        <asp:TextBox ID="UnitsInStockTextBox" runat="server"
           Text="<%# Bind("UnitsInStock") %>">
        </asp:TextBox><br />
        UnitsOnOrder:
        <asp:TextBox ID="UnitsOnOrderTextBox" runat="server"
           Text="<%# Bind("UnitsOnOrder") %>">
        </asp:TextBox><br />
        ReorderLevel:
        <asp:TextBox ID="ReorderLevelTextBox" runat="server"
           Text="<%# Bind("ReorderLevel") %>">
        </asp:TextBox><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
            Checked="<%# Bind("Discontinued") %>" /><br />
        CategoryName:
        <asp:TextBox ID="CategoryNameTextBox" runat="server"
             Text="<%# Bind("CategoryName") %>">
        </asp:TextBox><br />
        SupplierName:
        <asp:TextBox ID="SupplierNameTextBox" runat="server"
             Text="<%# Bind("SupplierName") %>">
        </asp:TextBox><br />
        <asp:LinkButton ID="UpdateButton" runat="server"
            CausesValidation="True" CommandName="Update"
            Text="Update">
        </asp:LinkButton>
        <asp:LinkButton ID="UpdateCancelButton" runat="server"
            CausesValidation="False" CommandName="Cancel"
            Text="Cancel">
        </asp:LinkButton>
    </EditItemTemplate>
    <InsertItemTemplate>
        ...
    </InsertItemTemplate>
    <ItemTemplate>
        ...
    </ItemTemplate>
</asp:FormView>

Ebben a pontban az EditItemTemplate kivételt fog okozni, ha megpróbáljuk használni. A probléma az, hogy a CategoryName és SupplierName mezők szövegdoboz webes vezérlőként jelennek meg a EditItemTemplate. Vagy címkékké kell módosítanunk ezeket a szövegdobozokat, vagy teljesen el kell távolítani őket. Egyszerűen teljesen töröljük őket a EditItemTemplate.

A 23. ábrán a FormView látható egy böngészőben, miután a Szerkesztés gombjára kattintottak Chai esetén. Figyeljen arra, hogy a SupplierName és CategoryName mezők, amelyek a ItemTemplate-ben voltak, már nem találhatóak, mivel most eltávolítottuk őket a EditItemTemplate-ból. Amikor a Frissítés gombra kattint, a FormView a GridView és a DetailsView vezérlőkkel megegyező lépéssorozaton halad végig.

Alapértelmezés szerint az EditItemTemplate minden szerkeszthető termékmezőt szövegdobozként vagy jelölőnégyzetként jelenít meg

23. ábra: Alapértelmezés szerint az EditItemTemplate egyes szerkeszthető termékmezők szövegdobozként vagy jelölőnégyzetként láthatók (kattintással megtekintheti a teljes méretű képet)

Amikor a Beszúrás gombra kattintanak, a FormView ItemTemplate egy postback-et indít. A FormView-hoz azonban nincs adatkötés, mert új rekordot adnak hozzá. A InsertItemTemplate felület tartalmazza az új rekord hozzáadására szolgáló webes vezérlőket, valamint a Beszúrás és a Mégse gombot. A Visual Studio által létrehozott alapértelmezett InsertItemTemplate érték tartalmaz egy TextBoxot minden nem logikai érték mezőhöz, és minden logikai érték mezőhöz tartozó jelölőnégyzetet, hasonlóan az automatikusan létrehozott EditItemTemplatefelülethez. A TextBox vezérlők tulajdonsága Text a megfelelő adatmező értékéhez van kötve kétirányú adatkötéssel.

Az alábbi deklaratív jelölés a FormView InsertItemTemplate-ját mutatja be. Vegye figyelembe, hogy a Bind() metódus az adatkötés szintaxisában van használva, és hogy a Beszúrás és a Mégse gomb webvezérlőinek a tulajdonságaik ennek megfelelően vannak CommandName beállítva.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ...
    </EditItemTemplate>
    <InsertItemTemplate>
        ProductName:
        <asp:TextBox ID="ProductNameTextBox" runat="server"
           Text="<%# Bind("ProductName") %>">
        </asp:TextBox><br />
        SupplierID:
        <asp:TextBox ID="SupplierIDTextBox" runat="server"
           Text="<%# Bind("SupplierID") %>">
        </asp:TextBox><br />
        CategoryID:
        <asp:TextBox ID="CategoryIDTextBox" runat="server"
           Text="<%# Bind("CategoryID") %>">
        </asp:TextBox><br />
        QuantityPerUnit:
        <asp:TextBox ID="QuantityPerUnitTextBox" runat="server"
           Text="<%# Bind("QuantityPerUnit") %>">
        </asp:TextBox><br />
        UnitPrice:
        <asp:TextBox ID="UnitPriceTextBox" runat="server"
           Text="<%# Bind("UnitPrice") %>">
        </asp:TextBox><br />
        UnitsInStock:
        <asp:TextBox ID="UnitsInStockTextBox" runat="server"
           Text="<%# Bind("UnitsInStock") %>">
        </asp:TextBox><br />
        UnitsOnOrder:
        <asp:TextBox ID="UnitsOnOrderTextBox" runat="server"
           Text="<%# Bind("UnitsOnOrder") %>">
        </asp:TextBox><br />
        ReorderLevel:
        <asp:TextBox ID="ReorderLevelTextBox" runat="server"
           Text="<%# Bind("ReorderLevel") %>">
        </asp:TextBox><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
           Checked="<%# Bind("Discontinued") %>" /><br />
        CategoryName:
        <asp:TextBox ID="CategoryNameTextBox" runat="server"
            Text="<%# Bind("CategoryName") %>">
        </asp:TextBox><br />
        SupplierName:
        <asp:TextBox ID="SupplierNameTextBox" runat="server"
           Text="<%# Bind("SupplierName") %>">
        </asp:TextBox><br />
        <asp:LinkButton ID="InsertButton" runat="server"
            CausesValidation="True" CommandName="Insert"
            Text="Insert">
        </asp:LinkButton>
        <asp:LinkButton ID="InsertCancelButton" runat="server"
            CausesValidation="False" CommandName="Cancel"
            Text="Cancel">
        </asp:LinkButton>
    </InsertItemTemplate>
    <ItemTemplate>
        ...
    </ItemTemplate>
</asp:FormView>

Van egy árnyalatnyi részlet a FormView InsertItemTemplate automatikus generálásával kapcsolatban. A TextBox Web vezérlőket még az írásvédett mezőkhöz is létrehozzák, mint például CategoryName és SupplierName. A szövegdobozokhoz hasonlóan ezeket a EditItemTemplateszövegdobozokat is el kell távolítani a InsertItemTemplatefájlból.

A 24. ábrán a FormView látható egy böngészőben, amikor új terméket ad hozzá, az Acme Coffee-t. Vegye figyelembe, hogy a SupplierName megjelenő CategoryName mezők és ItemTemplate mezők már nem jelennek meg, mivel most távolítottuk el őket. Amikor a Beszúrás gombra kattint, a FormView a DetailsView vezérlővel megegyező lépéssorozaton halad végig, és hozzáad egy új rekordot a Products táblához. A 25. ábra az Acme Coffee termék részleteit mutatja be a FormView-ban a beszúrás után.

Az InsertItemTemplate diktálja a FormView beszúrási felületét

24. ábra: A InsertItemTemplate határozza meg a FormView beszúrási felületét (kattintson ide a teljes méretű kép megtekintéséhez)

Az új termék, az Acme Coffee részletei megjelennek a FormView-ban

25. ábra: Az új termék, az Acme Coffee részletei megjelennek a FormView-ban (kattintson ide a teljes méretű kép megtekintéséhez)

Az írásvédett, a szerkesztési és a beszúrási felületek három különálló sablonba való elválasztásával a FormView lehetővé teszi ezen felületek finomabb vezérlését, mint a DetailsView és a GridView.

Megjegyzés:

A DetailsView-hoz hasonlóan a FormView tulajdonsága CurrentMode is jelzi a megjelenített felületet, és a DefaultMode tulajdonság azt jelzi, hogy a FormView milyen módba tér vissza a szerkesztés vagy beszúrás befejezése után.

Összefoglalás

Ebben az oktatóanyagban az adatok GridView, DetailsView és FormView használatával történő beszúrásának, szerkesztésének és törlésének alapjait vizsgáltuk meg. Mindhárom vezérlő olyan beépített adatmódosítási képességeket biztosít, amelyek anélkül használhatók, hogy egyetlen kódsort írnak az ASP.NET lapon az adat webes vezérlőinek és az ObjectDataSource-nak köszönhetően. Az egyszerű pont- és kattintástechnika azonban meglehetősen törékeny és naiv adatmódosítási felhasználói felületet jelenít meg. Az ellenőrzés biztosításához programozott értékeket kell injektálnunk, a kivételeket elegánsan kezelni, testre szabni a felhasználói felületet, és így tovább, olyan technikákra kell támaszkodnunk, amelyeket a következő oktatóanyagok során fogunk megvitatni.

Boldog programozást!

Tudnivalók a szerzőről

Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Tanuld meg ASP.NET 2.0 24 óra alatt. Ő itt elérhető mitchell@4GuysFromRolla.com.