Přehled úprav a odstranění dat v seznamu dat (C#)
DataList sice nemá integrované možnosti úprav a odstraňování, ale v tomto kurzu se podíváme na to, jak vytvořit seznam dat, který podporuje úpravy a odstranění podkladových dat.
Úvod
V kurzu Přehled vložení, aktualizace a odstranění dat jsme se podívali na to, jak vložit, aktualizovat a odstranit data pomocí architektury aplikace, objektu ObjectDataSource a ovládacích prvků GridView, DetailsView a FormView. S ObjectDataSource a těmito třemi datovými webovými ovládacími prvky byla implementace jednoduchých rozhraní pro úpravu dat hračkou a zahrnovala pouze zaškrtnutí políčka z inteligentní značky. Není nutné psát žádný kód.
DataList bohužel nemá integrované možnosti úprav a odstraňování, které jsou součástí ovládacího prvku GridView. Tato chybějící funkce je částečně způsobená skutečností, že dataList je relikt z předchozí verze ASP.NET, kdy byly nedostupné deklarativní ovládací prvky zdroje dat a stránky pro úpravu dat bez kódu. I když DataList v ASP.NET 2.0 nenabízí stejné možnosti úprav dat jako GridView, můžeme použít techniky ASP.NET 1.x zahrnout takové funkce. Tento přístup vyžaduje trochu kódu, ale jak uvidíme v tomto kurzu, dataList má k tomuto procesu několik událostí a vlastností.
V tomto kurzu se dozvíte, jak vytvořit Seznam dat, který podporuje úpravy a odstranění podkladových dat. V budoucích kurzech se budeme zabývat pokročilejšími scénáři úprav a odstraňování, včetně ověřování vstupních polí, řádného zpracování výjimek vyvolaných z vrstvy přístupu k datům nebo vrstvy obchodní logiky atd.
Poznámka
Podobně jako u prvku DataList chybí ovládacímu prvku Repeater funkce pro vložení, aktualizaci nebo odstranění. I když je možné takovou funkci přidat, dataList obsahuje vlastnosti a události, které nebyly nalezeny v repeateru, což zjednodušuje přidávání takových funkcí. Proto se tento kurz a budoucí kurzy, které se zaměřují na úpravy a odstraňování, se zaměří výhradně na DataList.
Krok 1: Vytvoření webových stránek s úpravami a odstraňováním kurzů
Než začneme zkoumat, jak aktualizovat a odstranit data z datového seznamu, udělejme si nejdřív chvilku a vytvořte 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 EditDeleteDataList
. Dále do této složky přidejte následující ASP.NET stránky a nezapomeňte každou stránku přidružit ke Site.master
stránce předlohy:
Default.aspx
Basics.aspx
BatchUpdate.aspx
ErrorHandling.aspx
UIValidation.aspx
CustomizedUI.aspx
OptimisticConcurrency.aspx
ConfirmationOnDelete.aspx
UserLevelAccess.aspx
Obrázek 1: Přidání stránek ASP.NET pro kurzy
Stejně jako v ostatních složkách i Default.aspx
v této EditDeleteDataList
složce jsou uvedené kurzy 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
přetažením z Průzkumník řešení do zobrazení Návrh stránky.
Obrázek 2: 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ě přidejte následující kód za hlavní/podrobné sestavy s DataList a Repeater <siteMapNode>
:
<siteMapNode
title="Editing and Deleting with the DataList"
description="Samples of Reports that Provide Editing and Deleting Capabilities"
url="~/EditDeleteDataList/Default.aspx" >
<siteMapNode
title="Basics"
description="Examines the basics of editing and deleting with the
DataList control."
url="~/EditDeleteDataList/Basics.aspx" />
<siteMapNode
title="Batch Update"
description="Examines how to update multiple records at once in a
fully-editable DataList."
url="~/EditDeleteDataList/BatchUpdate.aspx" />
<siteMapNode
title="Error Handling"
description="Learn how to gracefully handle exceptions raised during the
data modification workflow."
url="~/EditDeleteDataList/ErrorHandling.aspx" />
<siteMapNode
title="Adding Data Entry Validation"
description="Help prevent data entry errors by providing validation."
url="~/EditDeleteDataList/UIValidation.aspx" />
<siteMapNode
title="Customize the User Interface"
description="Customize the editing user interfaces."
url="~/EditDeleteDataList/CustomizedUI.aspx" />
<siteMapNode
title="Optimistic Concurrency"
description="Learn how to help prevent simultaneous users from
overwritting one another s changes."
url="~/EditDeleteDataList/OptimisticConcurrency.aspx" />
<siteMapNode
title="Confirm On Delete"
description="Prompt a user for confirmation when deleting a record."
url="~/EditDeleteDataList/ConfirmationOnDelete.aspx" />
<siteMapNode
title="Limit Capabilities Based on User"
description="Learn how to limit the data modification functionality
based on the user s role or permissions."
url="~/EditDeleteDataList/UserLevelAccess.aspx" />
</siteMapNode>
Po aktualizaci Web.sitemap
se chvíli podívejte na web kurzů prostřednictvím prohlížeče. Nabídka na levé straně teď obsahuje položky pro kurzy úprav a odstraňování datových seznamů.
Obrázek 3: Mapa webu teď obsahuje položky pro kurzy úprav a odstraňování seznamu dat
Krok 2: Zkoumání technik pro aktualizaci a odstranění dat
Úpravy a odstraňování dat pomocí GridView je tak snadné, protože pod kryty, GridView a ObjectDataSource fungují společně. Jak je popsáno v kurzu Zkoumání událostí spojených s vkládáním, aktualizace a odstraňování , při kliknutí na tlačítko Update řádku GridView automaticky přiřadí svá pole, která používala obousměrné datové vazby ke UpdateParameters
kolekci jeho ObjectDataSource a pak vyvolá metodu ObjectDataSource s Update()
.
DataList bohužel neposkytuje žádnou z těchto integrovaných funkcí. Je naší zodpovědností zajistit, aby hodnoty uživatele byly přiřazeny k parametrům ObjectDataSource a aby byla volána jeho Update()
metoda. DataList nám v tomto úsilí pomáhá s následujícími vlastnostmi a událostmi:
- Vlastnost
DataKeyField
při aktualizaci nebo odstraňování musí být schopná jednoznačně identifikovat každou položku v seznamu DataList. Tuto vlastnost nastavte na pole primárního klíče zobrazených dat. Tím se kolekce DataList naplníDataKeys
zadanouDataKeyField
hodnotou pro každou položku DataList. - Událost se
EditCommand
aktivuje při kliknutí na Tlačítko, LinkButton nebo ImageButton, jehožCommandName
vlastnost je nastavena na Edit. - Událost se
CancelCommand
aktivuje při kliknutí na Tlačítko, LinkButton nebo ImageButton, jehožCommandName
vlastnost je nastavena na Zrušit. - Událost se
UpdateCommand
aktivuje při kliknutí na Button, LinkButton nebo ImageButton, jehožCommandName
vlastnost je nastavena na Update. - Událost se
DeleteCommand
aktivuje při kliknutí na Tlačítko, LinkButton nebo ImageButton, jehožCommandName
vlastnost je nastavena na Delete.
Pomocí těchto vlastností a událostí existují čtyři přístupy, které můžeme použít k aktualizaci a odstranění dat ze seznamu DataList:
- Pomocí ASP.NET 1.x Techniques existoval Seznam dat před ASP.NET 2.0 a ObjectDataSources a byl schopen aktualizovat a odstranit data zcela programově. Tato technika zcela odstraní objekt ObjectDataSource a vyžaduje, abychom svázali data s objektem DataList přímo z vrstvy obchodní logiky, a to jak při načítání dat k zobrazení, tak při aktualizaci nebo odstranění záznamu.
- Při použití ovládacího prvku Single ObjectDataSource na stránce pro výběr, aktualizaci a odstranění , zatímco dataList chybí funkce gridView pro úpravy a odstraňování, neexistuje žádný důvod, proč bychom je nemohli přidat sami. Při tomto přístupu používáme ObjectDataSource stejně jako v příkladech GridView, ale musíme vytvořit obslužnou rutinu události pro Událost DataList,
UpdateCommand
kde nastavíme parametry ObjectDataSource a zavoláme jehoUpdate()
metodu. - Při použití ovládacího prvku ObjectDataSource pro výběr, ale při aktualizaci a odstranění přímo na BLL při použití možnosti 2 potřebujeme napsat trochu kódu v
UpdateCommand
události, přiřadit hodnoty parametrů atd. Místo toho můžeme k výběru použít ObjectDataSource, ale aktualizovat a odstranit volání přímo na BLL (jako u možnosti 1). Podle mého názoru aktualizace dat propojením přímo s BLL vede k čitelnějšímu kódu než přiřazení ObjectDataSource sUpdateParameters
a volání jehoUpdate()
metody. - Použití deklarativních prostředků prostřednictvím více objectDataSources vyžadují všechny předchozí tři přístupy trochu kódu. Pokud chcete raději používat co nejvíce deklarativní syntaxe, poslední možností je zahrnout na stránce více objectDataSources. První ObjectDataSource načte data z BLL a vytvoří jejich vazbu na DataList. Pro aktualizaci se přidá další ObjectDataSource, ale přímo v rámci objektu DataList s
EditItemTemplate
. Pokud chcete zahrnout podporu odstranění, bude potřeba ještě další ObjectDataSource v objektuItemTemplate
. Při tomto přístupu se tyto vložené objekty ObjectDataSource používajíControlParameters
k deklarativně svázání parametrů ObjectDataSource s ovládacími prvky uživatelského vstupu (místo toho, abyste je museli programově zadávat v obslužné rutině události DataListUpdateCommand
). Tento přístup stále vyžaduje trochu kódu, který potřebujeme k volání vloženého objectDataSource sUpdate()
neboDelete()
příkazu, ale vyžaduje mnohem méně než u ostatních tří přístupů. Nevýhodou je, že více objektů ObjectDataSources je na stránce nepřehledné, a to snižuje celkovou čitelnost.
Pokud byste byli nuceni použít pouze jeden z těchto přístupů, zvolil bych možnost 1, protože poskytuje největší flexibilitu a protože dataList byla původně navržena tak, aby vyhovovala tomuto vzoru. Zatímco DataList byl rozšířen o práci s ovládacími prvky zdroje dat ASP.NET 2.0, nemá všechny rozšiřitelné body nebo funkce oficiální ASP.NET 2.0 data web ovládací prvky (GridView, DetailsView a FormView). Možnosti 2 až 4 však nejsou bezdůvodné.
Tento a budoucí kurzy úprav a odstraňování budou používat ObjectDataSource pro načtení dat k zobrazení a směrování volání BLL k aktualizaci a odstranění dat (možnost 3).
Krok 3: Přidání objektu DataList a konfigurace jeho objektu ObjectDataSource
V tomto kurzu vytvoříme DataList, který obsahuje informace o produktech a pro každý produkt poskytne uživateli možnost upravit název a cenu a produkt úplně odstranit. Konkrétně načteme záznamy, které se mají zobrazit, pomocí objektu ObjectDataSource, ale provedeme akce aktualizace a odstranění propojením přímo s BLL. Než se začneme zabývat implementací možností úprav a odstranění do seznamu dat, pojďme nejprve získat stránku, která zobrazí produkty v rozhraní jen pro čtení. Vzhledem k tomu, že jsme tyto kroky prozkoumali v předchozích kurzech, budu je rychle procházet.
Začněte otevřením Basics.aspx
stránky ve EditDeleteDataList
složce a v návrhovém zobrazení přidejte na stránku seznam dat. Dále z inteligentní značky DataList vytvořte nový ObjectDataSource. Vzhledem k tomu, že pracujeme s daty o produktech, nakonfigurujte je tak, aby používala ProductsBLL
třídu . Pokud chcete načíst všechny produkty, zvolte metodu GetProducts()
na kartě SELECT.
Obrázek 4: Konfigurace objektu ObjectDataSource pro použití ProductsBLL
třídy (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 5: Vrácení informací o produktu pomocí GetProducts()
metody (kliknutím zobrazíte obrázek v plné velikosti)
DataList, stejně jako GridView, není určen pro vkládání nových dat; proto vyberte možnost (Žádný) z rozevíracího seznamu na kartě VLOŽENÍ. Pro karty UPDATE a DELETE také zvolte (Žádné), protože aktualizace a odstranění se budou provádět programově prostřednictvím BLL.
Obrázek 6: Potvrďte, že Drop-Down Seznamy na kartách INSERT, UPDATE a DELETE na kartách ObjectDataSource jsou nastaveny na (Žádné) (kliknutím zobrazíte obrázek v plné velikosti).
Po nakonfigurování objektu ObjectDataSource klikněte na Dokončit a vraťte se do Designer. Jak jsme viděli v předchozích příkladech, při dokončení konfigurace ObjectDataSource visual Studio automaticky vytvoří ItemTemplate
pro DropDownList, který zobrazí všechna datová pole. ItemTemplate
Nahraďte ho tím, který zobrazuje jenom název a cenu produktu. Nastavte RepeatColumns
také vlastnost na hodnotu 2.
Poznámka
Jak je popsáno v kurzu Přehled vložení, aktualizace a odstranění dat , při úpravě dat pomocí ObjectDataSource naše architektura vyžaduje, abychom vlastnost odebrali OldValuesParameterFormatString
z deklarativního kódu ObjectDataSource (nebo ji resetovali na výchozí hodnotu , {0}
). V tomto kurzu ale používáme ObjectDataSource pouze k načítání dat. Proto nemusíme upravovat hodnotu vlastnosti ObjectDataSource s OldValuesParameterFormatString
(i když to neuškodí).
Po nahrazení výchozího datového seznamu ItemTemplate
přizpůsobeným kódem by deklarativní kód na stránce měl vypadat nějak takto:
<asp:DataList ID="DataList1" runat="server" DataKeyField="ProductID"
DataSourceID="ObjectDataSource1" RepeatColumns="2">
<ItemTemplate>
<h5>
<asp:Label runat="server" ID="ProductNameLabel"
Text='<%# Eval("ProductName") %>'></asp:Label>
</h5>
Price: <asp:Label runat="server" ID="Label1"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
<br />
<br />
</ItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL"
OldValuesParameterFormatString="original_{0}">
</asp:ObjectDataSource>
Podívejte se na průběh v prohlížeči. Jak ukazuje obrázek 7, dataList zobrazuje název produktu a jednotkovou cenu každého produktu ve dvou sloupcích.
Obrázek 7: Názvy a ceny produktů se zobrazují v Two-Column DataList (kliknutím zobrazíte obrázek v plné velikosti).
Poznámka
DataList má řadu vlastností, které jsou vyžadovány pro proces aktualizace a odstraňování, a tyto hodnoty jsou uloženy ve stavu zobrazení. Proto je při vytváření seznamu DataList, který podporuje úpravy nebo odstraňování dat, nezbytné, aby byl stav zobrazení DataList s povolen.
Chytří čtenáři si možná vzpomenou, že se nám podařilo zakázat stav zobrazení při vytváření upravitelných zobrazení GridViews, DetailsViews a FormViews. Důvodem je to, že webové ovládací prvky ASP.NET 2.0 můžou obsahovat stav ovládacího prvku, který je trvale zachován napříč zpětnými operacemi, jako je stav zobrazení, ale považuje se za nezbytný.
Zakázáním stavu zobrazení v objektu GridView se pouze vynechávají triviální informace o stavu, ale zachová se stav ovládacího prvku (který zahrnuje stav potřebný pro úpravy a odstranění). Seznam dat vytvořený v časovém rámci ASP.NET 1.x nevyužívá stav řízení, a proto musí mít povolený stav zobrazení. Další informace o účelu stavu řízení a o tom, jak se liší od stavu zobrazení, najdete v tématu Stav ovládacího prvku vs. Zobrazit stav.
Krok 4: Přidání uživatelského rozhraní pro úpravy
Ovládací prvek GridView se skládá z kolekce polí (BoundFields, CheckBoxFields, TemplateFields atd.). Tato pole můžou upravit své vykreslené značky v závislosti na jejich režimu. Například v režimu jen pro čtení zobrazí BoundField hodnotu datového pole jako text; v režimu úprav vykreslí ovládací prvek TextBox web, jehož Text
vlastnost je přiřazena hodnota datového pole.
Naproti tomu DataList vykresluje své položky pomocí šablon. Položky jen pro čtení se vykreslují pomocí ItemTemplate
příkazu , zatímco položky v režimu úprav se vykreslují přes EditItemTemplate
. V tomto okamžiku má náš seznam DataList pouze .ItemTemplate
Abychom mohli podporovat funkce úprav na úrovni položek, musíme přidat EditItemTemplate
kód, který obsahuje značky, které se mají zobrazit pro upravitelnou položku. V tomto kurzu použijeme webové ovládací prvky TextBox k úpravě názvu produktu a jednotkové ceny.
Objekt EditItemTemplate
lze vytvořit buď deklarativně, nebo prostřednictvím Designer (výběrem možnosti Upravit šablony z inteligentní značky DataList s). Pokud chcete použít možnost Upravit šablony, klikněte nejprve na odkaz Upravit šablony v inteligentní značce a pak vyberte EditItemTemplate
položku z rozevíracího seznamu.
Obrázek 8: Vyjádření souhlasu pro práci s sadou DataList (EditItemTemplate
kliknutím zobrazíte obrázek v plné velikosti)
Dále zadejte Název produktu: a Price: a přetáhněte dva ovládací prvky TextBox z panelu EditItemTemplate
nástrojů do rozhraní na Designer. Nastavte vlastnosti TextBoxes ID
na ProductName
a UnitPrice
.
Obrázek 9: Přidání textového pole pro název a cenu produktu (kliknutím zobrazíte obrázek v plné velikosti)
Potřebujeme vytvořit vazbu odpovídajících hodnot datových polí produktu s Text
vlastnostmi dvou textových polí. V inteligentních značkách TextBoxes klikněte na odkaz Upravit vazby dat a přidružte příslušné datové pole k Text
vlastnosti, jak je znázorněno na obrázku 10.
Poznámka
Při vazbě datového UnitPrice
pole s polem TextBox s Text
s cenou ho můžete naformátovat jako hodnotu měny ({0:C}
), obecné číslo ({0:N}
) nebo ho nechat neformátované.
Obrázek 10: Vytvoření vazby ProductName
datových polí a UnitPrice
k vlastnostem Text
textových polí
Všimněte si, že dialogové okno Upravit vazby dat na obrázku 10 neobsahuje zaškrtávací políčko Obousměrné vazby dat, které je k dispozici při úpravě Pole šablony v zobrazení GridView nebo DetailsView nebo šablony v objektu FormView. Obousměrná funkce vazby dat umožňovala, aby se hodnota zadaná do vstupního webového ovládacího prvku automaticky přiřadila odpovídajícím objektům InsertParameters
ObjectDataSource nebo UpdateParameters
při vkládání nebo aktualizaci dat. DataList nepodporuje obousměrné vazby dat, jak uvidíme později v tomto kurzu, jakmile uživatel provede změny a bude připraven data aktualizovat, budeme muset programově přistupovat k těmto vlastnostem textových polí Text
a předávat jejich hodnoty příslušné UpdateProduct
metodě ve ProductsBLL
třídě.
Nakonec musíme přidat tlačítka Update (Aktualizovat) a Cancel (Zrušit) do EditItemTemplate
. Jak jsme viděli v kurzu Master/Detail Using a Bulleted List of Master Records with a Details DataList , při kliknutí na Tlačítko, LinkButton nebo ImageButton, jehož CommandName
vlastnost je nastavena, je vyvolána událost Repeater nebo DataList s ItemCommand
. Pokud je vlastnost nastavena na určitou hodnotu pro DataList CommandName
, může být vyvolána také další událost. Mezi speciální CommandName
hodnoty vlastností patří mimo jiné:
- Zrušit vyvolá událost.
CancelCommand
- Upravit vyvolá událost.
EditCommand
- Aktualizace vyvolá událost.
UpdateCommand
Mějte na paměti, že tyto události jsou vyvolány společně s událostí ItemCommand
.
Přidejte do dvou EditItemTemplate
webových ovládacích prvků Tlačítko, jeden, jehož CommandName
je nastavená na Aktualizovat a druhý na Zrušit. Po přidání těchto dvou ovládacích prvků Button Web by měl Designer vypadat nějak takto:
Obrázek 11: Přidání tlačítek Aktualizace a Zrušit do EditItemTemplate
(kliknutím zobrazíte obrázek v plné velikosti)
Po dokončení EditItemTemplate
by deklarativní značka DataList měla vypadat nějak takto:
<asp:DataList ID="DataList1" runat="server" DataKeyField="ProductID"
DataSourceID="ObjectDataSource1" RepeatColumns="2">
<ItemTemplate>
<h5>
<asp:Label runat="server" ID="ProductNameLabel"
Text='<%# Eval("ProductName") %>' />
</h5>
Price: <asp:Label runat="server" ID="Label1"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
<br />
<br />
</ItemTemplate>
<EditItemTemplate>
Product name:
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Eval("ProductName") %>' /><br />
Price:
<asp:TextBox ID="UnitPrice" runat="server"
Text='<%# Eval("UnitPrice", "{0:C}") %>' /><br />
<br />
<asp:Button ID="UpdateProduct" runat="server"
CommandName="Update" Text="Update" />
<asp:Button ID="CancelUpdate" runat="server"
CommandName="Cancel" Text="Cancel" />
</EditItemTemplate>
</asp:DataList>
Krok 5: Přidání instalatérství do režimu úprav
V tomto okamžiku má náš DataList rozhraní pro úpravy definované prostřednictvím své EditItemTemplate
; ale v současné době neexistuje způsob, jak uživatel, který navštíví naši stránku, označit, že chce upravit informace o produktu. Ke každému produktu musíme přidat tlačítko Upravit, které po kliknutí vykreslí položku DataList v režimu úprav. Začněte přidáním tlačítka Upravit do objektu ItemTemplate
, a to buď prostřednictvím Designer, nebo deklarativně. Ujistěte se, že jste vlastnost tlačítka CommandName
Upravit nastavili na Upravit .
Jakmile přidáte toto tlačítko Upravit, chvíli si stránku prohlédněte v prohlížeči. S tímto doplňkem by každý výpis produktů měl obsahovat tlačítko Upravit.
Obrázek 12: Přidání tlačítek Aktualizace a Zrušit do EditItemTemplate
(kliknutím zobrazíte obrázek v plné velikosti)
Kliknutí na tlačítko způsobí zpětné odeslání, ale nepřenese výpis produktu do režimu úprav. Aby bylo možné produkt upravovat, musíme:
- Nastavte vlastnost DataList s
EditItemIndex
na indexDataListItem
, na jehož tlačítko Upravit bylo právě klikno. - Znovu přidružte data k seznamu DataList. Při opětovném vykreslení datalistu
DataListItem
se objekt, jehožItemIndex
hodnota odpovídá sadě DataList,EditItemIndex
vykresluje pomocí .EditItemTemplate
Vzhledem k tomu, že událost DataList s EditCommand
se aktivuje po kliknutí na tlačítko Upravit, vytvořte obslužnou rutinu EditCommand
události s následujícím kódem:
protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
{
// Set the DataList's EditItemIndex property to the
// index of the DataListItem that was clicked
DataList1.EditItemIndex = e.Item.ItemIndex;
// Rebind the data to the DataList
DataList1.DataBind();
}
Obslužná rutina EditCommand
události je předána v objektu typu DataListCommandEventArgs
jako jeho druhý vstupní parametr, který zahrnuje odkaz na DataListItem
tlačítko Upravit, jehož tlačítko bylo kliknutí (e.Item
). Obslužná rutina události nejprve nastaví DataList s EditItemIndex
na upravitelné DataListItem
a pak znovu připojí data na DataList voláním metody DataList s DataBind()
ItemIndex
.
Po přidání této obslužné rutiny události znovu přejděte na stránku v prohlížeči. Kliknutím na tlačítko Upravit teď bude možné upravit klikaný produkt (viz obrázek 13).
Obrázek 13: Kliknutím na tlačítko Upravit lze produkt upravit (kliknutím zobrazíte obrázek v plné velikosti)
Krok 6: Uložení změn uživatele
Kliknutí na upravená tlačítka Aktualizovat nebo Zrušit v tomto okamžiku nic neudělá; k přidání této funkce potřebujeme vytvořit obslužné rutiny událostí pro dataList s UpdateCommand
a CancelCommand
události. Začněte vytvořením CancelCommand
obslužné rutiny události, která se spustí, když kliknete na upravené tlačítko Zrušit produktu a má za úkol vrátit dataList do stavu předběžné úpravy.
Pokud chcete, aby DataList vykreslovaly všechny své položky v režimu jen pro čtení, musíme:
- Nastavte vlastnost DataList s
EditItemIndex
na index neexistujícíDataListItem
index.-1
je bezpečná volba, protožeDataListItem
indexy začínají na0
. - Znovu přidružte data k seznamu DataList. Vzhledem k tomu, že žádné
DataListItem
ItemIndex
prvky neodpovídají sadě DataList sEditItemIndex
, celý seznam DataList se vykreslí v režimu jen pro čtení.
Tyto kroky lze provést pomocí následujícího kódu obslužné rutiny události:
protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e)
{
// Set the DataList's EditItemIndex property to -1
DataList1.EditItemIndex = -1;
// Rebind the data to the DataList
DataList1.DataBind();
}
Po kliknutí na tlačítko Zrušit se vrátí dataList do stavu předběžné úpravy.
Poslední obslužnou rutinou události, která musíme dokončit, je obslužná rutina UpdateCommand
události. Tato obslužná rutina události musí:
- Přístup k názvu a ceně produktu zadanému uživatelem prostřednictvím kódu programu a také k upravenému produktu
ProductID
. - Zahajte proces aktualizace voláním příslušného
UpdateProduct
přetížení veProductsBLL
třídě. - Nastavte vlastnost DataList s
EditItemIndex
na index neexistujícíDataListItem
index.-1
je bezpečná volba, protožeDataListItem
indexy začínají na0
. - Znovu přidružte data k seznamu DataList. Vzhledem k tomu, že žádné
DataListItem
ItemIndex
prvky neodpovídají sadě DataList sEditItemIndex
, celý seznam DataList se vykreslí v režimu jen pro čtení.
Kroky 1 a 2 zodpovídají za uložení změn uživatele. Kroky 3 a 4 vrátí dataList do stavu předběžné úpravy po uložení změn a jsou stejné jako kroky provedené v obslužné rutině CancelCommand
události.
Abychom získali aktualizovaný název produktu a cenu, musíme použít metodu FindControl
pro programové odkazy na webové ovládací prvky TextBox v rámci EditItemTemplate
. Potřebujeme také získat upravenou hodnotu produktu ProductID
. Při počáteční vazbě ObjectDataSource na DataList přiřadil Visual Studio vlastnost DataList s DataKeyField
hodnotě primárního klíče ze zdroje dat (ProductID
). Tuto hodnotu pak můžete načíst z kolekce DataList s DataKeys
. Chvíli se ujistěte, že DataKeyField
je vlastnost skutečně nastavená na ProductID
.
Následující kód implementuje čtyři kroky:
protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e)
{
// Read in the ProductID from the DataKeys collection
int productID = Convert.ToInt32(DataList1.DataKeys[e.Item.ItemIndex]);
// Read in the product name and price values
TextBox productName = (TextBox)e.Item.FindControl("ProductName");
TextBox unitPrice = (TextBox)e.Item.FindControl("UnitPrice");
string productNameValue = null;
if (productName.Text.Trim().Length > 0)
productNameValue = productName.Text.Trim();
decimal? unitPriceValue = null;
if (unitPrice.Text.Trim().Length > 0)
unitPriceValue = Decimal.Parse(unitPrice.Text.Trim(),
System.Globalization.NumberStyles.Currency);
// Call the ProductsBLL's UpdateProduct method...
ProductsBLL productsAPI = new ProductsBLL();
productsAPI.UpdateProduct(productNameValue, unitPriceValue, productID);
// Revert the DataList back to its pre-editing state
DataList1.EditItemIndex = -1;
DataList1.DataBind();
}
Obslužná rutina události začíná čtením v upravených produktech ProductID
z DataKeys
kolekce. Dále jsou odkazována na dvě textová pole v objektu EditItemTemplate
a jejich Text
vlastnosti uložené v místních proměnných productNameValue
a unitPriceValue
. Metodu Decimal.Parse()
používáme ke čtení hodnoty z textového UnitPrice
pole, aby pokud má zadaná hodnota symbol měny, bylo možné ji stále správně převést na Decimal
hodnotu.
Poznámka
Hodnoty z ProductName
textových polí a UnitPrice
jsou přiřazeny pouze k proměnným productNameValue a unitPriceValue, pokud textová pole vlastnosti mají zadanou hodnotu. V opačném případě se pro proměnné použije hodnota Nothing
, což má za následek aktualizaci dat pomocí hodnoty databáze NULL
. To znamená, že náš kód zpracovává převádí prázdné řetězce na databázové NULL
hodnoty, což je výchozí chování rozhraní pro úpravy v ovládacích prvcích GridView, DetailsView a FormView.
Po přečtení hodnot ProductsBLL
se volá metoda třídy s UpdateProduct
, která předá název produktu, cenu a ProductID
. Obslužná rutina události se dokončí vrácením dataList do stavu před úpravami pomocí naprosto stejné logiky jako v obslužné rutině CancelCommand
události.
EditCommand
Po dokončení obslužných rutin událostí , CancelCommand
a UpdateCommand
může návštěvník upravit název a cenu produktu. Na obrázcích 14 až 16 je tento pracovní postup úprav v praxi.
Obrázek 14: Při první návštěvě stránky jsou všechny produkty v režimu Read-Only (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 15: Pokud chcete aktualizovat název nebo cenu produktu, klikněte na tlačítko Upravit (kliknutím zobrazíte obrázek v plné velikosti).
Obrázek 16: Po změně hodnoty se kliknutím na Aktualizovat vraťte do režimu Read-Only (kliknutím zobrazíte obrázek v plné velikosti)
Krok 7: Přidání možností odstranění
Postup přidání možností odstranění do objektu DataList je podobný jako postup pro přidání možností úprav. Stručně řečeno, musíme k ItemTemplate
němu při kliknutí přidat tlačítko Odstranit:
- Přečte v odpovídajících produktech
ProductID
prostřednictvímDataKeys
kolekce. - Provede odstranění voláním
ProductsBLL
metody třídy sDeleteProduct
. - Znovu přidružuje data k sadě DataList.
Začněme přidáním tlačítka Odstranit do ItemTemplate
.
Po kliknutí vyvolá tlačítko CommandName
Upravit, Aktualizovat nebo Zrušit událost DataList ItemCommand
spolu s další událostí (například při použití možnosti Upravit EditCommand
událost). Podobně jakýkoliv Button, LinkButton nebo ImageButton v objektu DataList, jehož CommandName
vlastnost je nastavená DeleteCommand
na Hodnotu Delete, způsobí vyvolání události (spolu s ItemCommand
).
Přidejte tlačítko Odstranit vedle tlačítka Upravit v ItemTemplate
a jeho vlastnost na hodnotu CommandName
Odstranit. Po přidání tohoto ovládacího prvku Button by deklarativní syntaxe DataList ItemTemplate
měla vypadat takto:
<ItemTemplate>
<h5>
<asp:Label runat="server" ID="ProductNameLabel"
Text='<%# Eval("ProductName") %>' />
</h5>
Price: <asp:Label runat="server" ID="Label1"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
<br />
<asp:Button runat="server" id="EditProduct" CommandName="Edit"
Text="Edit" />
<asp:Button runat="server" id="DeleteProduct" CommandName="Delete"
Text="Delete" />
<br />
<br />
</ItemTemplate>
Dále pomocí následujícího kódu vytvořte obslužnou rutinu události pro událost DataList s DeleteCommand
:
protected void DataList1_DeleteCommand(object source, DataListCommandEventArgs e)
{
// Read in the ProductID from the DataKeys collection
int productID = Convert.ToInt32(DataList1.DataKeys[e.Item.ItemIndex]);
// Delete the data
ProductsBLL productsAPI = new ProductsBLL();
productsAPI.DeleteProduct(productID);
// Rebind the data to the DataList
DataList1.DataBind();
}
Kliknutí na tlačítko Odstranit způsobí zpětné odeslání a aktivuje událost DataList s DeleteCommand
. V obslužné rutině události se klepaná hodnota produktu ProductID
přistupuje z DataKeys
kolekce. Dále je produkt odstraněn voláním ProductsBLL
metody třídy s DeleteProduct
.
Po odstranění produktu je důležité znovu připojit data k sadě DataList (DataList1.DataBind()
), jinak se v seznamu DataList bude dál zobrazovat produkt, který byl právě odstraněn.
Souhrn
Zatímco DataList chybí point a kliknutí úpravy a odstranění podpory GridView, s krátkým kouskem kódu může být rozšířena o tyto funkce. V tomto kurzu jsme viděli, jak vytvořit seznam produktů se dvěma sloupci, které by bylo možné odstranit a jejichž název a cenu bylo možné upravit. Přidání podpory úprav a odstranění je otázkou zahrnutí příslušných webových ovládacích prvků do ItemTemplate
a EditItemTemplate
, vytvoření odpovídajících obslužných rutin událostí, čtení hodnot zadaných uživatelem a primárních klíčů a propojení s vrstvou obchodní logiky.
I když jsme do seznamu DataList přidali základní možnosti úprav a odstraňování, chybí mu pokročilejší funkce. Například neexistuje ověření vstupního pole – pokud uživatel zadá cenu Příliš drahá, vyvolá se při pokusu Decimal.Parse
o převod příliš drahých Decimal
na výjimku . Podobně pokud dojde k problému při aktualizaci dat ve vrstvě obchodní logiky nebo přístupu k datům, zobrazí se uživateli standardní chybová obrazovka. Bez jakéhokoliv potvrzení na tlačítku Odstranit je náhodné odstranění produktu příliš pravděpodobné.
V budoucích kurzech se dozvíme, jak vylepšit uživatelské prostředí pro úpravy.
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.
Zvláštní poděkování
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byli Zack Jones, Ken Pespisa a Randy Schmidt. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.
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