Přehled vkládání, aktualizace a odstraňování dat (C#)
V tomto kurzu se dozvíte, jak namapovat metody Insert(), Update() a Delete() objectDataSource na metody tříd BLL a také jak nakonfigurovat ovládací prvky GridView, DetailsView a FormView tak, aby poskytovaly možnosti úprav dat.
Úvod
V posledních několika kurzech jsme prozkoumali, jak zobrazit data na ASP.NET stránce pomocí ovládacích prvků GridView, DetailsView a FormView. Tyto ovládací prvky jednoduše pracují s dodanými daty. Tyto ovládací prvky obvykle přistupují k datům pomocí ovládacího prvku zdroje dat, například ObjectDataSource. Viděli jsme, jak ObjectDataSource funguje jako proxy mezi ASP.NET stránkou a podkladovými daty. Když GridView potřebuje zobrazit data, vyvolá svoji metodu ObjectDataSource Select()
, která zase vyvolá metodu z naší vrstvy obchodní logiky (BLL), která volá metodu v příslušném objektu TableAdapter vrstvy SELECT
přístupu k datům (DAL), který pak odešle dotaz do databáze Northwind.
Připomeňme si, že když jsme v prvním kurzu vytvořili objekty TableAdapter v dal, Sada Visual Studio automaticky přidala metody pro vkládání, aktualizaci a odstraňování dat z podkladové databázové tabulky. Kromě toho jsme v části Vytvoření vrstvy obchodní logiky navrhli metody v BLL, které do těchto metod DAL pro úpravu dat volaly.
Kromě své Select()
metody má Insert()
ObjectDataSource také metody , Update()
a Delete()
. Stejně jako metoda Select()
lze tyto tři metody mapovat na metody v podkladovém objektu. Při konfiguraci vkládání, aktualizace nebo odstraňování dat poskytují ovládací prvky GridView, DetailsView a FormView uživatelské rozhraní pro úpravu podkladových dat. Toto uživatelské rozhraní volá Insert()
metody , Update()
a Delete()
objektu ObjectDataSource, které pak vyvolá metody přidružené k příslušnému objektu (viz obrázek 1).
Obrázek 1: Metody ObjectDataSource Insert()
, Update()
a Delete()
slouží jako proxy do BLL (kliknutím zobrazíte obrázek v plné velikosti)
V tomto kurzu se dozvíte, jak mapovat metody ObjectDataSource Insert()
, Update()
a Delete()
na metody tříd v BLL a jak nakonfigurovat ovládací prvky GridView, DetailsView a FormView tak, aby poskytovaly možnosti úprav dat.
Krok 1: Vytvoření webových stránek s kurzy vložení, aktualizace a odstranění
Než začneme zkoumat, jak vkládat, aktualizovat a odstraňovat data, pojďme nejprve chvíli vytvořit ASP.NET stránky v našem webovém projektu, které budeme potřebovat pro tento kurz a několik dalších. Začněte přidáním nové složky s názvem EditInsertDelete
. Dále do této složky přidejte následující ASP.NET stránky a nezapomeňte přidružit každou stránku ke Site.master
stránce předlohy:
Default.aspx
Basics.aspx
DataModificationEvents.aspx
ErrorHandling.aspx
UIValidation.aspx
CustomizedUI.aspx
OptimisticConcurrency.aspx
ConfirmationOnDelete.aspx
UserLevelAccess.aspx
Obrázek 2: Přidání stránek ASP.NET pro kurzy Modification-Related dat
Stejně jako v ostatních složkách Default.aspx
bude ve EditInsertDelete
složce seznam kurzů ve své části. Vzpomeňte si SectionLevelTutorialListing.ascx
, že tuto funkci poskytuje uživatelský ovládací prvek. Proto přidejte tento uživatelský ovládací prvek do Default.aspx
tak, že ho přetáhnete z Průzkumník řešení do zobrazení Návrh stránky.
Obrázek 3: Přidání SectionLevelTutorialListing.ascx
uživatelského ovládacího prvku do Default.aspx
(kliknutím zobrazíte obrázek v plné velikosti)
Nakonec přidejte stránky jako položky do Web.sitemap
souboru. Konkrétně za vlastní formátování <siteMapNode>
přidejte následující značku:
<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>
Po aktualizaci Web.sitemap
si chvíli prohlédněte web kurzů v prohlížeči. Nabídka na levé straně teď obsahuje položky pro úpravy, vkládání a odstraňování kurzů.
Obrázek 4: Mapa webu teď obsahuje položky pro kurzy úprav, vkládání a odstraňování
Krok 2: Přidání a konfigurace ovládacího prvku ObjectDataSource
Vzhledem k tomu, že se objekty GridView, DetailsView a FormView liší v možnostech a rozloženích úprav dat, pojďme se podívat na každou z nich jednotlivě. Místo toho, aby každý ovládací prvek používal vlastní ObjectDataSource, ale pojďme vytvořit jeden ObjectDataSource, který může sdílet všechny tři příklady ovládacích prvků.
Basics.aspx
Otevřete stránku, přetáhněte objekt ObjectDataSource z panelu nástrojů do Designer a klikněte na odkaz Konfigurovat zdroj dat z jeho inteligentní značky. Vzhledem k tomu, že ProductsBLL
je jedinou třídou BLL, která poskytuje metody úprav, vkládání a odstraňování, nakonfigurujte ObjectDataSource pro použití této třídy.
Obrázek 5: Konfigurace objektu ObjectDataSource pro použití ProductsBLL
třídy (kliknutím zobrazíte obrázek v plné velikosti)
Na další obrazovce můžeme určit, jaké metody ProductsBLL
třídy jsou mapovány na objekty ObjectDataSource Select()
, Insert()
, Update()
a Delete()
výběrem příslušné karty a zvolením metody z rozevíracího seznamu. Obrázek 6, který by teď měl vypadat povědomě, mapuje metodu ObjectDataSource Select()
na metodu ProductsBLL
třídy GetProducts()
. Metody Insert()
, Update()
a Delete()
lze nakonfigurovat tak, že v seznamu nahoře vyberete příslušnou kartu.
Obrázek 6: Nechte objekt ObjectDataSource vrátit všechny produkty (kliknutím zobrazíte obrázek v plné velikosti)
Na obrázcích 7, 8 a 9 jsou karty UPDATE, INSERT a DELETE objektu ObjectDataSource. Nakonfigurujte tyto karty tak, aby Insert()
metody , Update()
a Delete()
vyvolaly ProductsBLL
metody třídy UpdateProduct
, AddProduct
a DeleteProduct
.
Obrázek 7: Mapování metody ObjectDataSource Update()
na metodu ProductBLL
třídy UpdateProduct
(kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 8: Namapujte metodu ObjectDataSource Insert()
na metodu ProductBLL
Add Product
třídy (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 9: Mapování metody ObjectDataSource Delete()
na metodu ProductBLL
třídy DeleteProduct
(kliknutím zobrazíte obrázek v plné velikosti)
Možná jste si všimli, že v rozevíracích seznamech na kartách UPDATE, INSERT a DELETE už byly tyto metody vybrané. To je díky našemu DataObjectMethodAttribute
použití, které zdobí metody ProductsBLL
. Například metoda DeleteProduct má následující podpis:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Delete, true)]
public bool DeleteProduct(int productID)
{
...
}
Atribut DataObjectMethodAttribute
označuje účel každé metody, zda je určena k výběru, vložení, aktualizaci nebo odstranění a jestli se jedná o výchozí hodnotu. Pokud jste tyto atributy při vytváření tříd BLL vynechali, budete muset ručně vybrat metody na kartách UPDATE, INSERT a DELETE.
Po zajištění, že jsou příslušné ProductsBLL
metody mapovány na metody ObjectDataSource Insert()
, Update()
a Delete()
, kliknutím na Dokončit dokončete průvodce.
Zkoumání značek ObjectDataSource
Po konfiguraci objektu ObjectDataSource prostřednictvím průvodce přejděte do zobrazení Zdroj a prozkoumejte vygenerované deklarativní značky. Značka <asp:ObjectDataSource>
určuje základní objekt a metody, které se mají vyvolat. Kromě toho existují , a, které se mapují na vstupní parametry pro ProductsBLL
AddProduct
metody třídy , UpdateProduct
, aDeleteProduct
:InsertParameters
UpdateParameters
DeleteParameters
<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>
ObjectDataSource obsahuje parametr pro každý ze vstupních parametrů pro jeho přidružené metody, stejně jako seznam SelectParameter
s je k dispozici, když ObjectDataSource je nakonfigurována pro volání metody select, která očekává vstupní parametr (například GetProductsByCategoryID(categoryID)
). Jak uvidíme za chvíli, hodnoty pro tyto DeleteParameters
, UpdateParameters
a InsertParameters
jsou automaticky nastaveny objekty GridView, DetailsView a FormView před vyvoláním metody ObjectDataSource Update()
, Insert()
neboDelete()
. Tyto hodnoty je také možné podle potřeby nastavit programově, jak si probereme v dalším kurzu.
Jedním z vedlejších účinků použití průvodce ke konfiguraci na ObjectDataSource je, že Visual Studio nastaví OldValuesParameterFormatString vlastnost na original_{0}
. Tato hodnota vlastnosti se používá k zahrnutí původních hodnot upravovaných dat a je užitečná ve dvou scénářích:
- Pokud při úpravách záznamu můžou uživatelé změnit hodnotu primárního klíče. V tomto případě je nutné zadat novou hodnotu primárního klíče i hodnotu původního primárního klíče, aby bylo možné najít záznam s původní hodnotou primárního klíče a odpovídajícím způsobem aktualizovat jeho hodnotu.
- Při použití optimistické souběžnosti. Optimistická souběžnost je technika, která zajistí, že dva souběžní uživatelé nebudou vzájemně přepisovat změny, a je tématem pro budoucí kurz.
Vlastnost OldValuesParameterFormatString
označuje název vstupních parametrů v metodách aktualizace a odstranění podkladového objektu pro původní hodnoty. O této vlastnosti a jejím účelu se podrobněji podíváme, až prozkoumáme optimistickou souběžnost. Nyní to ale přináším, protože naše metody BLL neočekávají původní hodnoty, a proto je důležité, abychom tuto vlastnost odstranili. OldValuesParameterFormatString
Ponechání vlastnosti nastaveno na cokoli jiného než výchozí ({0}
) způsobí chybu, když se datový webový ovládací prvek pokusí vyvolat metody ObjectDataSource Update()
neboDelete()
, protože ObjectDataSource se pokusí předat jak UpdateParameters
zadané parametry, DeleteParameters
tak i původní hodnoty.
Pokud to není v tomto okamžiku úplně jasné, nemějte obavy, tuto vlastnost a její nástroj prozkoumáme v budoucím kurzu. Prozatím se ujistěte, že buď tuto deklaraci vlastnosti zcela odeberete z deklarativní syntaxe, nebo nastavíte hodnotu na výchozí hodnotu ({0}).
Poznámka
Pokud jednoduše vymažete OldValuesParameterFormatString
hodnotu vlastnosti z okno Vlastnosti v návrhovém zobrazení, bude vlastnost stále existovat v deklarativní syntaxi, ale bude nastavena na prázdný řetězec. To bohužel bude mít stále za následek stejný problém, který je popsán výše. Proto buď úplně odeberte vlastnost z deklarativní syntaxe, nebo z okno Vlastnosti nastavte hodnotu na výchozí hodnotu {0}
.
Krok 3: Přidání ovládacího prvku datového webu a jeho konfigurace pro úpravu dat
Jakmile je objekt ObjectDataSource přidán na stránku a nakonfigurován, jsme připraveni na stránku přidat webové ovládací prvky dat, aby se data zobrazila a poskytla možnost, aby je koncový uživatel upravil. Na GridView, DetailsView a FormView se podíváme samostatně, protože se tyto ovládací prvky webu dat liší v možnostech a konfiguraci úprav dat.
Jak uvidíme ve zbývající části tohoto článku, přidání velmi základní úpravy, vkládání a odstraňování podpory prostřednictvím ovládacích prvků GridView, DetailsView a FormView je opravdu stejně jednoduché jako zaškrtnutí několika zaškrtávacích políček. V reálném světě existuje mnoho drobných a hraničních případů, díky kterým je poskytování takových funkcí více zapojené než pouhé ukazovátku a kliknutí. Tento kurz se ale zaměřuje výhradně na prokazování možností zjednodušené úpravy dat. Budoucí kurzy budou zkoumat obavy, které nepochybně vyvstanou v reálném prostředí.
Odstranění dat z objektu GridView
Začněte přetažením objektu GridView z panelu nástrojů do Designer. Dále vytvořte vazbu ObjectDataSource na GridView tak, že ho vyberete z rozevíracího seznamu v inteligentní značce GridView. V tomto okamžiku bude deklarativní značka GridView:
<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>
Vazba Objektu GridView na ObjectDataSource prostřednictvím jeho inteligentní značky má dvě výhody:
- BoundFields a CheckBoxFields jsou automaticky vytvořeny pro každé z polí vrácených ObjectDataSource. Vlastnosti BoundField a CheckBoxField jsou navíc nastaveny na základě metadat podkladového pole. Například
ProductID
pole ,CategoryName
aSupplierName
jsou vProductsDataTable
souboru označená jako jen pro čtení, a proto by při úpravách neměla být aktualizovatelná. Za tímto účelem jsou vlastnosti ReadOnly těchto polí BoundFields nastaveny natrue
hodnotu . - Vlastnost DataKeyNames je přiřazena k polím primárního klíče podkladového objektu. To je nezbytné při použití objektu GridView pro úpravu nebo odstranění dat, protože tato vlastnost označuje pole (nebo sadu polí), která jedinečným způsobem identifikuje každý záznam. Další informace o
DataKeyNames
vlastnosti najdete v kurzu Master/Detail Using a Selectable Master GridView with a Details DetailView .
Zatímco GridView může být vázán na ObjectDataSource prostřednictvím okno Vlastnosti nebo deklarativní syntaxe, vyžaduje, abyste ručně přidali příslušné BoundField a DataKeyNames
značky.
Ovládací prvek GridView poskytuje integrovanou podporu pro úpravy a odstraňování na úrovni řádků. Konfigurace objektu GridView pro podporu odstraňování přidá sloupec tlačítek Odstranit. Když koncový uživatel klikne na tlačítko Odstranit pro konkrétní řádek, následuje postback a GridView provede následující kroky:
- Jsou přiřazeny
DeleteParameters
hodnoty ObjectDataSource. - Vyvolá se metoda ObjectDataSource
Delete()
, která odstraní zadaný záznam. - GridView se znovu připojí k ObjectDataSource vyvoláním jeho
Select()
metody.
Hodnoty přiřazené jsou DeleteParameters
hodnoty DataKeyNames
polí pro řádek, na který bylo klikno na tlačítko Odstranit. Proto je důležité, aby vlastnost GridView byla správně nastavena DataKeyNames
. Pokud chybí, DeleteParameters
přiřadí se null
mu hodnota v kroku 1, což pak nebude mít za následek žádné odstraněné záznamy v kroku 2.
Poznámka
Kolekce DataKeys
je uložena ve stavu ovládacího prvku GridView s, což znamená, že hodnoty budou zapamatovány napříč postbackem i v případě, že DataKeys
je stav zobrazení GridView s zakázán. Je však velmi důležité, aby stav zobrazení zůstal povolený pro objekty GridViews, které podporují úpravy nebo odstraňování (výchozí chování). Pokud nastavíte vlastnost GridView s EnableViewState
na false
, bude chování při úpravách a odstraňování fungovat dobře pro jednoho uživatele, ale pokud existují souběžní uživatelé odstraňující data, existuje možnost, že tito souběžní uživatelé mohou omylem odstranit nebo upravit záznamy, které nezamýšleli.
Stejné upozornění platí také pro DetailsViews a FormViews.
Pokud chcete do objektu GridView přidat možnosti odstraňování, jednoduše přejděte na jeho inteligentní značku a zaškrtněte políčko Povolit odstranění.
Obrázek 10: Zaškrtněte políčko Povolit odstranění.
Zaškrtnutím políčka Povolit odstranění u inteligentní značky přidáte pole CommandField do objektu GridView. CommandField vykreslí sloupec v zobrazení GridView s tlačítky pro provádění jedné nebo více následujících úloh: výběr záznamu, úprava záznamu a odstranění záznamu. Dříve jsme viděli commandfield v akci s výběrem záznamů v kurzu Master/Detail Using a Selectable Master GridView with a Details DetailView .
CommandField obsahuje řadu ShowXButton
vlastností, které označují, jaké řady tlačítek jsou zobrazeny v CommandField. Zaškrtnutím políčka Povolit odstranění pole CommandField, jehož ShowDeleteButton
vlastnost je true
přidána do kolekce Columns objektu GridView.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
<Columns>
<asp:CommandField ShowDeleteButton="True" />
... BoundFields removed for brevity ...
</Columns>
</asp:GridView>
V tomto okamžiku, věřte nebo ne, jsme hotovi s přidáním podpory odstraňování do GridView! Jak ukazuje obrázek 11, při návštěvě této stránky v prohlížeči je k dispozici sloupec tlačítek Odstranit.
Obrázek 11: CommandField přidá sloupec tlačítek pro odstranění (kliknutím zobrazíte obrázek v plné velikosti)
Pokud jste tento kurz vytvářeli od základů sami, při testování této stránky kliknutím na tlačítko Odstranit vyvoláte výjimku. Pokračujte ve čtení a zjistěte, proč byly tyto výjimky vyvolány a jak je opravit.
Poznámka
Pokud používáte soubor ke stažení provázející tento kurz, tyto problémy už byly zohledněny. Doporučujeme vám však, abyste si přečetli níže uvedené podrobnosti, které vám pomůžou identifikovat problémy, které mohou nastat, a vhodná alternativní řešení.
Pokud při pokusu o odstranění produktu dojde k výjimce, jejíž zpráva se podobá zprávě ObjectDataSource ObjectDataSource1 nemohl najít negenerovou metodu DeleteProduct s parametry: productID, original_ProductID, pravděpodobně jste zapomněli odebrat OldValuesParameterFormatString
vlastnost z ObjectDataSource. Se zadanou OldValuesParameterFormatString
vlastností ObjectDataSource se pokusí předat vstupní parametry DeleteProduct
i productID
original_ProductID
do metody. DeleteProduct
, ale přijímá pouze jeden vstupní parametr, a proto výjimku. Odebrání vlastnosti OldValuesParameterFormatString
(nebo její nastavení na {0}
) dává objektu ObjectDataSource pokyn, aby se nepokoušel předat původní vstupní parametr.
Obrázek 12: Ujistěte se, že OldValuesParameterFormatString
byla vlastnost vymazána (kliknutím zobrazíte obrázek v plné velikosti)
I když jste vlastnost odebrali OldValuesParameterFormatString
, stále se zobrazí výjimka při pokusu o odstranění produktu se zprávou: "Příkaz DELETE byl v konfliktu s omezením REFERENCE 'FK_Order_Details_Products'." Databáze Northwind obsahuje omezení cizího klíče mezi Order Details
tabulkou a Products
, což znamená, že produkt nelze ze systému odstranit, pokud je v Order Details
tabulce jeden nebo více záznamů. Vzhledem k tomu, že každý produkt v databázi Northwind má v Order Details
systému alespoň jeden záznam, nemůžeme odstranit žádné produkty, dokud nejprve neodstraníme záznamy podrobností objednávky přidružené k produktu.
Obrázek 13: Omezení cizího klíče zakazuje odstranění produktů (kliknutím zobrazíte obrázek v plné velikosti)
V našem kurzu jednoduše odstraníme všechny záznamy z Order Details
tabulky. V reálné aplikaci bychom potřebovali:
- Další obrazovka pro správu podrobností objednávky
DeleteProduct
Rozšíření metody o logiku pro odstranění podrobností objednávky zadaného produktu- Upravte dotaz SQL používaný objektem TableAdapter tak, aby zahrnoval odstranění podrobností objednávky zadaného produktu.
Pojďme jednoduše odstranit všechny záznamy z tabulky, Order Details
abychom obešli omezení cizího klíče. V sadě Visual Studio přejděte do Průzkumníka serveru, klikněte pravým tlačítkem myši na NORTHWND.MDF
uzel a zvolte Nový dotaz. Pak v okně dotazu spusťte následující příkaz SQL: DELETE FROM [Order Details]
Obrázek 14: Odstranění všech záznamů z Order Details
tabulky (kliknutím zobrazíte obrázek v plné velikosti)
Po vymazání Order Details
tabulky kliknutím na tlačítko Odstranit se produkt odstraní bez chyby. Pokud kliknutím na tlačítko Odstranit produkt neodstraníte, zkontrolujte, jestli je vlastnost GridView DataKeyNames
nastavená na pole primárního klíče (ProductID
).
Poznámka
Když kliknete na tlačítko Odstranit, následuje postback a záznam se odstraní. To může být nebezpečné, protože je snadné omylem kliknout na tlačítko Odstranit na nesprávném řádku. V dalším kurzu se dozvíte, jak při odstranění záznamu přidat potvrzení na straně klienta.
Úprava dat pomocí objektu GridView
Kromě odstranění poskytuje ovládací prvek GridView také integrovanou podporu úprav na úrovni řádků. Konfigurace objektu GridView pro podporu úprav přidá sloupec tlačítek pro úpravy. Z pohledu koncového uživatele kliknutím na tlačítko Upravit na řádku se řádek změní na upravitelný, změní se buňky na textová pole obsahující existující hodnoty a tlačítko Upravit nahradíte tlačítky Aktualizovat a Zrušit. Po provedení požadovaných změn může koncový uživatel kliknout na tlačítko Aktualizovat a potvrdit změny nebo je zrušit tlačítkem Zrušit. V obou případech se po kliknutí na Aktualizovat nebo Zrušit GridView vrátí do stavu předběžné úpravy.
Z našeho pohledu jako vývojáře stránky, když koncový uživatel klikne na tlačítko Upravit pro konkrétní řádek, následuje postback a GridView provede následující kroky:
- Vlastnost GridView
EditItemIndex
je přiřazena k indexu řádku, jehož tlačítko Upravit bylo klikno. - GridView se znovu připojí k ObjectDataSource vyvoláním jeho
Select()
metody. - Index řádku, který odpovídá hodnotě
EditItemIndex
, se vykreslí v režimu úprav. V tomto režimu je tlačítko Upravit nahrazeno tlačítky Update a Cancel a BoundFields, jejichžReadOnly
vlastnosti jsou False (výchozí) jsou vykresleny jako webové ovládací prvky TextBox, jejichžText
vlastnosti jsou přiřazeny k hodnotám datových polí.
V tomto okamžiku se revize vrátí do prohlížeče, což koncovému uživateli umožní provádět jakékoli změny dat řádku. Když uživatel klikne na tlačítko Aktualizovat, dojde k zpětnému odeslání a GridView provede následující kroky:
- Hodnoty ObjectDataSource
UpdateParameters
jsou přiřazeny hodnoty zadané koncovým uživatelem do rozhraní pro úpravy GridView - Vyvolá se metoda ObjectDataSource
Update()
, která aktualizuje zadaný záznam. - GridView se znovu připojí k ObjectDataSource vyvoláním jeho
Select()
metody.
Hodnoty primárního klíče přiřazené v UpdateParameters
kroku 1 pocházejí z hodnot zadaných ve DataKeyNames
vlastnosti, zatímco hodnoty jiného než primárního klíče pocházejí z textu v ovládacích prvcích TextBox web pro upravený řádek. Stejně jako při odstraňování je důležité, aby vlastnost GridView byla správně nastavena DataKeyNames
. Pokud hodnota primárního UpdateParameters
klíče chybí, bude přiřazena null
hodnota v kroku 1, což zase nebude mít za následek žádné aktualizované záznamy v kroku 2.
Funkce úprav lze aktivovat jednoduše zaškrtnutím políčka Povolit úpravy v inteligentní značce GridView.
Obrázek 15: Zaškrtněte políčko Povolit úpravy.
Zaškrtnutím políčka Povolit úpravy přidáte pole CommandField (v případě potřeby) a nastavíte jeho ShowEditButton
vlastnost na true
. Jak jsme viděli dříve, CommandField obsahuje řadu ShowXButton
vlastností, které označují, jaké řady tlačítek jsou zobrazeny v CommandField. Zaškrtnutím políčka Povolit úpravy přidáte ShowEditButton
vlastnost do existujícího pole CommandField:
<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>
To je vše, co je k dispozici pro přidání základní podpory úprav. Jak ukazuje obrázek 16, rozhraní pro úpravy je poměrně hrubé, každý BoundField, jehož ReadOnly
vlastnost je nastavena na false
(výchozí) je vykreslen jako TextBox. To zahrnuje pole jako CategoryID
a SupplierID
, což jsou klíče k jiným tabulkám.
Obrázek 16: Kliknutí na tlačítko Upravit zobrazí řádek v režimu úprav (kliknutím zobrazíte obrázek v plné velikosti).
Kromě toho, že žádáte uživatele, aby upravili hodnoty cizího klíče přímo, rozhraní pro úpravy chybí následujícími způsoby:
- Pokud uživatel zadá
CategoryID
neboSupplierID
, který v databázi neexistuje,UPDATE
dojde k porušení omezení cizího klíče, což způsobí vyvolání výjimky. - Rozhraní pro úpravy neobsahuje žádné ověření. Pokud nezadáte požadovanou hodnotu (například
ProductName
) nebo zadáte řetězcovou hodnotu, ve které se očekává číselná hodnota (například zadáte "Příliš mnoho!" do textovéhoUnitPrice
pole), vyvolá se výjimka. V dalším kurzu se dozvíte, jak přidat ovládací prvky ověřování do uživatelského rozhraní pro úpravy. - V současné době musí být všechna pole produktů, která nejsou jen pro čtení, zahrnuta v zobrazení GridView. Pokud bychom odebrali pole z objektu GridView, řekněme , při
UnitPrice
aktualizaci dat by objekt GridView nenastavilUnitPrice
UpdateParameters
hodnotu, což by změnilo hodnotu záznamuUnitPrice
NULL
databáze na hodnotu. Podobně, pokud je povinné pole, napříkladProductName
, odebráno z objektu GridView, aktualizace selže se stejnou výjimkou Sloupec ProductName nepovoluje hodnoty null uvedenou výše. - Formátování rozhraní pro úpravy nechává spoustu požadovaných. Zobrazí se
UnitPrice
se čtyřmi desetinnými čárkami. V ideálnímCategoryID
případě by hodnoty aSupplierID
obsahovaly rozevírací seznamy, které obsahují seznam kategorií a dodavatelů v systému.
To všechno jsou nedostatky, se kterými budeme prozatím muset žít, ale budeme je řešit v budoucích kurzech.
Vkládání, úpravy a odstraňování dat pomocí prvku DetailsView
Jak jsme viděli v předchozích kurzech, ovládací prvek DetailsView zobrazuje najednou jeden záznam a stejně jako GridView umožňuje úpravy a odstranění aktuálně zobrazeného záznamu. Prostředí koncového uživatele s úpravou a odstraňováním položek z DetailsView a pracovní postup z ASP.NET strany je identické s gridview. Kde DetailsView se liší od GridView je, že poskytuje také integrovanou podporu vkládání.
Chcete-li předvést možnosti úprav dat GridView, začněte přidáním DetailsView na Basics.aspx
stránku nad existující GridView a svázte jej s existující ObjectDataSource prostřednictvím inteligentní značky DetailsView. Dále vymažte vlastnosti a Width
DetailsView Height
a zaškrtněte možnost Povolit stránkování z inteligentní značky. Pokud chcete povolit podporu úprav, vkládání a odstraňování, jednoduše zaškrtněte políčka Povolit úpravy, Povolit vkládání a Povolit odstranění v inteligentní značce.
Obrázek 17: Konfigurace zobrazení DetailsView pro podporu úprav, vkládání a odstraňování
Stejně jako u objektu GridView, přidání úpravy, vkládání nebo odstranění podpory přidá CommandField do DetailsView, jak ukazuje následující deklarativní syntaxe:
<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>
Všimněte si, že pro DetailsView CommandField se zobrazí na konci kolekce Sloupce ve výchozím nastavení. Vzhledem k tomu, že pole DetailsView jsou vykresleny jako řádky, CommandField se zobrazí jako řádek s tlačítky Vložit, Upravit a Odstranit v dolní části DetailsView.
Obrázek 18: Konfigurace doplňku DetailsView pro podporu úprav, vkládání a odstraňování (kliknutím zobrazíte obrázek v plné velikosti)
Kliknutí na tlačítko Odstranit spustí stejnou posloupnost událostí jako u GridView: postback; Následuje DetailsView vyplňující své ObjectDataSource DeleteParameters
na DataKeyNames
základě hodnot; a dokončeno voláním jeho ObjectDataSource Delete()
metoda, která ve skutečnosti odebere produkt z databáze. Úpravy v DetailsView také fungují způsobem, který je stejný jako GridView.
Při vkládání se koncovému uživateli zobrazí tlačítko Nový, které po kliknutí vykreslí DetailsView v režimu vložení. V režimu vložení je tlačítko New nahrazeno tlačítky Vložit a Zrušit a zobrazí se pouze boundfields, jejichž InsertVisible
vlastnost je nastavena na true
(výchozí). Tato datová pole identifikovaná jako pole s automatickým přírůstkem, například ProductID
, mají vlastnost InsertVisible nastavenou na hodnotu false
při vytváření vazby DetailsView se zdrojem dat prostřednictvím inteligentní značky.
Při vazbě zdroje dat na DetailsView prostřednictvím inteligentní značky sada Visual Studio nastaví InsertVisible
vlastnost na false
pouze pro pole automatického inkrementace. Pole jen pro čtení, například CategoryName
a SupplierName
, se zobrazí v uživatelském rozhraní režimu vložení, pokud jejich InsertVisible
vlastnost není explicitně nastavená na false
hodnotu . Nastavte vlastnosti těchto dvou polí InsertVisible
na false
hodnotu , a to buď prostřednictvím deklarativní syntaxe DetailsView, nebo prostřednictvím odkazu Upravit pole v inteligentní značce. Obrázek 19 ukazuje nastavení InsertVisible
vlastností na false
kliknutím na odkaz Upravit pole.
Obrázek 19: Northwind Traders nyní nabízí Acme Tea (kliknutím zobrazíte obrázek v plné velikosti)
Po nastavení InsertVisible
vlastností zobrazte Basics.aspx
stránku v prohlížeči a klikněte na tlačítko Nový. Obrázek 20 znázorňuje zobrazení DetailsView při přidávání nového nápoje Acme Tea do naší produktové řady.
Obrázek 20: Northwind Traders nyní nabízí Acme Tea (kliknutím zobrazíte obrázek v plné velikosti)
Po zadání podrobností pro Acme Tea a kliknutí na tlačítko Vložit se vytvoří postback a nový záznam se přidá do Products
databázové tabulky. Vzhledem k tomu, že toto zobrazení Podrobností uvádí seznam produktů v pořadí, ve kterém existují v databázové tabulce, musíme přejít na poslední produkt, abychom viděli nový produkt.
Obrázek 21: Podrobnosti o Acme Tea (kliknutím zobrazíte obrázek v plné velikosti)
Poznámka
Vlastnost CurrentMode prvku DetailsView označuje zobrazené rozhraní a může mít jednu z následujících hodnot: Edit
, Insert
nebo ReadOnly
. DefaultMode Vlastnost označuje režim DetailsView vrátí po dokončení úpravy nebo vložení a je užitečné pro zobrazení DetailsView, který je trvale v režimu úprav nebo vložení.
Možnosti vložení a úpravy typu point a kliknutí v prvku DetailsView trpí stejnými omezeními jako GridView: uživatel musí zadat existující CategoryID
hodnoty a SupplierID
hodnoty prostřednictvím textového pole; rozhraní neobsahuje jakoukoli logiku ověřování; všechna pole produktů, která neumožňují NULL
hodnoty nebo nemají výchozí hodnotu zadanou na úrovni databáze, musí být zahrnuta v rozhraní pro vkládání, a tak dále.
Techniky, které prozkoumáme pro rozšíření a vylepšení rozhraní pro úpravy GridView v budoucích článcích, lze použít i pro úpravy a vkládání rozhraní ovládacího prvku DetailsView.
Použití ovládacího prvku FormView pro flexibilnější uživatelské rozhraní pro úpravy dat
FormView nabízí integrovanou podporu pro vkládání, úpravy a odstraňování dat, ale protože používá šablony místo polí, není místo pro přidání BoundFields nebo CommandField používaných ovládacími prvky GridView a DetailsView k poskytnutí rozhraní pro úpravy dat. Místo toho musí toto rozhraní webové ovládací prvky pro shromažďování uživatelských vstupů při přidávání nové položky nebo úpravě existující položky spolu s tlačítky Nová, Upravit, Odstranit, Vložit, Aktualizovat a Zrušit přidat ručně do příslušných šablon. Visual Studio naštěstí automaticky vytvoří potřebné rozhraní při vazbě Objekt FormView na zdroj dat prostřednictvím rozevíracího seznamu v jeho inteligentní značce.
Chcete-li si tyto techniky ilustrovat, začněte přidáním objektu FormView na Basics.aspx
stránku a z inteligentní značky FormView vytvořte vazbu na objectDataSource již vytvořený. Tím se vygenerují EditItemTemplate
, InsertItemTemplate
a ItemTemplate
pro FormView s ovládacími prvky TextBox Web pro shromažďování vstupu uživatele a button web ovládací prvky pro tlačítka New, Edit, Delete, Insert, Update a Cancel. Vlastnost FormView DataKeyNames
je navíc nastavena na pole primárního klíče (ProductID
) objektu vráceného ObjectDataSource. Nakonec zaškrtněte možnost Enable Paging (Povolit stránkování) v inteligentní značce objektu FormView.
Následující ukazuje deklarativní kód pro FormView ItemTemplate
po FormView byl vázán na ObjectDataSource. Ve výchozím nastavení je každé jiné než logické pole produktu svázáno s Text
vlastností ovládacího prvku Label Web, zatímco každé pole logické hodnoty (Discontinued
) je vázáno na Checked
vlastnost zakázaného ovládacího prvku CheckBox Web. Aby tlačítka New, Edit, a Delete aktivovala určité chování FormView při kliknutí, je nutné, aby jejich CommandName
hodnoty byly nastaveny na New
, Edit
a Delete
, v uvedeném pořadí.
<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>
Obrázek 22 znázorňuje zobrazení FormView ItemTemplate
při prohlížení v prohlížeči. Každé pole produktu je uvedené s tlačítky Nový, Upravit a Odstranit v dolní části.
Obrázek 22: Defaut FormView ItemTemplate
Seznamy pole každého produktu spolu s tlačítky Nový, Upravit a Odstranit (kliknutím zobrazíte obrázek v plné velikosti)
Stejně jako u GridView a DetailsView, kliknutí na tlačítko Odstranit nebo jakékoli Button, LinkButton nebo ImageButton, jehož CommandName
vlastnost je nastavena na Delete způsobí postback, naplní ObjectDataSource DeleteParameters
na základě hodnoty FormView DataKeyNames
a vyvolá ObjectDataSource Delete()
metody.
Po kliknutí na tlačítko Upravit dojde k následnému zpětnému odeslání a data se odskočí do objektu EditItemTemplate
, který je zodpovědný za vykreslení rozhraní pro úpravy. Toto rozhraní obsahuje webové ovládací prvky pro úpravu dat spolu s tlačítky Aktualizovat a Zrušit. Výchozí hodnota EditItemTemplate
generovaná sadou Visual Studio obsahuje popisek pro všechna pole automatického zvýšení (ProductID
), textové pole pro každé pole s nelogická hodnotou a zaškrtávací políčko pro každé pole s logickou hodnotou. Toto chování je velmi podobné automaticky generované BoundFields v GridView a DetailsView ovládací prvky.
Poznámka
Jedním z malých problémů s automatickou generování objektu EditItemTemplate
FormView je, že vykresluje ovládací prvky TextBox Web pro pole, která jsou jen pro čtení, například CategoryName
a SupplierName
. Brzy se podíváme, jak to vyřešit.
TextBox ovládací prvky v EditItemTemplate
mají jejich Text
vlastnost svázaná s hodnotou odpovídajícího datového pole pomocí obousměrné datové vazby. Obousměrná vazba dat, označená , <%# Bind("dataField") %>
provádí vazby dat při vytváření vazby dat k šabloně i při naplnění parametrů ObjectDataSource pro vkládání nebo úpravy záznamů. To znamená, že když uživatel klikne na tlačítko Upravit z ItemTemplate
, Bind()
metoda vrátí zadanou hodnotu datového pole. Jakmile uživatel provede změny a klikne na Aktualizovat, hodnoty odeslané zpět, které odpovídají datovým polím zadaným pomocí Bind()
, se použijí na objectDataSource objektu UpdateParameters
. Alternativně jednosměrná vazba dat označená parametrem <%# Eval("dataField") %>
načte hodnoty datových polí pouze při vytváření vazby dat se šablonou a nevrací uživatelem zadané hodnoty parametrům zdroje dat při zpětném odeslání.
Následující deklarativní kód ukazuje FormView .EditItemTemplate
Všimněte si Bind()
, že metoda se zde používá v syntaxi vazby dat a že webové ovládací prvky Update a Cancel Button mají své CommandName
vlastnosti nastavené odpovídajícím způsobem.
<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>
Náš EditItemTemplate
soubor v tomto okamžiku způsobí vyvolá výjimku, pokud se ji pokusíme použít. Problém je v tomCategoryName
, že pole a SupplierName
jsou vykresleny jako webové ovládací prvky TextBox v .EditItemTemplate
Buď musíme tato textová pole změnit na Popisky, nebo je úplně odebrat. Pojďme je jednoduše úplně odstranit z objektu EditItemTemplate
.
Obrázek 23 znázorňuje zobrazení Formuláře v prohlížeči po kliknutí na tlačítko Upravit pro Chai. Všimněte si SupplierName
, že pole a CategoryName
zobrazená v objektu ItemTemplate
už nejsou k dispozici, protože jsme je právě odebrali z objektu EditItemTemplate
. Při kliknutí na tlačítko Aktualizovat FormView pokračuje stejným pořadím kroků jako GridView a DetailsView ovládací prvky.
Obrázek 23: Ve výchozím nastavení EditItemTemplate
pole Zobrazuje každý upravitelný produkt jako textové pole nebo zaškrtávací políčko (kliknutím zobrazíte obrázek v plné velikosti)
Po kliknutí na tlačítko Vložit se zobrazí zpětná vazba FormView ItemTemplate
. Žádná data však nejsou vázána na FormView, protože je přidán nový záznam. Rozhraní InsertItemTemplate
obsahuje webové ovládací prvky pro přidání nového záznamu spolu s tlačítky Vložit a Zrušit. Výchozí InsertItemTemplate
hodnota vygenerovaná sadou Visual Studio obsahuje textové pole pro každé pole nelogická hodnota a zaškrtávací políčko pro každé pole logické hodnoty, podobně jako u automaticky generovaného EditItemTemplate
rozhraní. Ovládací prvky TextBox mají svou Text
vlastnost svázanou s hodnotou odpovídajícího datového pole pomocí obousměrné datové vazby.
Následující deklarativní kód ukazuje FormView .InsertItemTemplate
Všimněte si Bind()
, že metoda se zde používá v syntaxi datové vazby a že webové ovládací prvky Vložit a Zrušit tlačítko mají své CommandName
vlastnosti nastaveny odpovídajícím způsobem.
<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>
Automatické generování InsertItemTemplate
objektu FormView je jemné. Konkrétně jsou webové ovládací prvky TextBox vytvořeny i pro pole, která jsou jen pro čtení, například CategoryName
a SupplierName
. Stejně jako u EditItemTemplate
nástroje musíme tato textová pole odebrat z objektu InsertItemTemplate
.
Obrázek 24 ukazuje FormView v prohlížeči při přidávání nového produktu Acme Coffee. Všimněte si SupplierName
, že pole a CategoryName
zobrazená ItemTemplate
v poli už nejsou k dispozici, protože jsme je právě odebrali. Při kliknutí na tlačítko Vložit FormView pokračuje stejným pořadím kroků jako Ovládací prvek DetailsView a přidá do Products
tabulky nový záznam. Obrázek 25 znázorňuje podrobnosti o produktu Acme Coffee v zobrazení FormView po jeho vložení.
Obrázek 24: InsertItemTemplate
Diktuje rozhraní pro vkládání formview (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 25: Podrobnosti o novém produktu Acme Coffee jsou zobrazeny v zobrazení FormView (kliknutím zobrazíte obrázek v plné velikosti).
Oddělením jen pro čtení, úpravy a vkládání rozhraní do tří samostatných šablon, FormView umožňuje jemnější stupeň kontroly nad těmito rozhraními než DetailsView a GridView.
Poznámka
Stejně jako DetailsView, FormView CurrentMode
vlastnost indikuje rozhraní je zobrazena a jeho DefaultMode
vlastnost označuje režim FormView vrátí po dokončení úpravy nebo vložení.
Souhrn
V tomto kurzu jsme prozkoumali základy vkládání, úprav a odstraňování dat pomocí objektů GridView, DetailsView a FormView. Všechny tři z těchto ovládacích prvků poskytují určitou úroveň předdefinovaných možností úprav dat, které lze využít bez napsání jediného řádku kódu na stránce ASP.NET díky datovým webovým ovládacím prvkům a ObjectDataSource. Jednoduché techniky point a click však vykreslují poměrně křehké a naivní úpravy dat uživatelské rozhraní. Abychom mohli zajistit ověřování, vkládání programových hodnot, řádné zpracování výjimek, přizpůsobení uživatelského rozhraní atd., budeme se muset spolehnout na řadu technik, které budeme probírat v několika dalších kurzech.
Všechno nejlepší na programování!
O autorovi
Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro