Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
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).
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
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.
3. ábra: A felhasználói vezérlő hozzáadása SectionLevelTutorialListing.ascx
(Default.aspx
ide 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.sitemap
utá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.
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.
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.
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.
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)
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)
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 DeleteParameters
UpdateParameters
InsertParameters
é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
ésSupplierName
mezők írásvédettként vannak megjelölve aProductsDataTable
-ban, ezért nem szabad őket frissíteni szerkesztéskor. Ennek megfelelően a BoundFields ReadOnly tulajdonsága a következőretrue
van á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:
- Az ObjectDataSource
DeleteParameters
érték(ek) hozzárendelésre kerülnek - Meghívja az ObjectDataSource metódusát
Delete()
, és törli a megadott rekordot - 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 false
a 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.
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.
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.
DeleteProduct
azonban 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.
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.
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]
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:
- A GridView tulajdonsága
EditItemIndex
annak a sornak az indexéhez van rendelve, amelyre a Szerkesztés gombra kattintott - A GridView újracsatlakozik az ObjectDataSource-hoz a saját
Select()
metódusának meghívásával. - 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, amelyekText
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:
- Az ObjectDataSource
UpdateParameters
értéke(i) a végfelhasználó által megadott értékeket rendelik a GridView szerkesztőfelületéhez - A rendszer meghívja az ObjectDataSource metódusát
Update()
, és frissíti a megadott rekordot - 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.
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.
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
vagySupplierID
olyant, amely nem létezik az adatbázisban, aUPDATE
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 aUnitPrice
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
UnitPrice
az adatok frissítésekor a GridView nem állítaná be azUnitPrice
UpdateParameters
értéket, ami az adatbázisrekordUnitPrice
NULL
értékét módosítaná. Hasonlóképpen, ha egy kötelező mező(példáulProductName
) 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 aCategoryID
és aSupplierID
é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.
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.
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 ProductID
InsertVisible 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
.
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.
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.
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
, Insert
vagy 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ó.
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 ItemTemplate
fá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.
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 EditItemTemplate
felü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 EditItemTemplate
szövegdobozokat is el kell távolítani a InsertItemTemplate
fá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.
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)
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.