Přehled úprav a odstranění dat v seznamu dat (C#)

Scott Mitchell

Stáhnout PDF

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

Přidání stránek ASP.NET pro kurzy

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.

Přidání uživatelského ovládacího prvku SectionLevelTutorialListing.ascx do Default.aspx

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.sitemapse 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ů.

Mapa webu teď obsahuje položky pro kurzy úprav a odstraňování seznamu dat.

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:

  • VlastnostDataKeyField 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 zadanou DataKeyField 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:

  1. 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.
  2. 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 jeho Update() metodu.
  3. 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 s UpdateParameters a volání jeho Update() metody.
  4. 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 objektu ItemTemplate. 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 DataList UpdateCommand ). Tento přístup stále vyžaduje trochu kódu, který potřebujeme k volání vloženého objectDataSource s Update() nebo Delete() 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.

Konfigurace objektu ObjectDataSource pro použití třídy ProductsBLL

Obrázek 4: Konfigurace objektu ObjectDataSource pro použití ProductsBLL třídy (kliknutím zobrazíte obrázek v plné velikosti)

Vrácení informací o produktu pomocí metody GetProducts()

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.

Potvrďte, že Drop-Down Seznamy na kartách INSERT, UPDATE a DELETE na kartách ObjectDataSource jsou nastaveny na hodnotu (None).

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.

Názvy produktů a ceny se zobrazují v Two-Column DataList.

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.

Rozhodnout se pro práci s DataList s EditItemTemplate

Obrázek 8: Vyjádření souhlasu pro práci s sadou DataList (EditItemTemplatekliknutí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.

Přidání textového pole pro název a cenu produktu

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

Svázání datových polí ProductName a UnitPrice s vlastnostmi textu textových polí

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:

Snímek obrazovky zobrazující DataList EditItemTemplate s přidanými tlačítky Aktualizovat a Zrušit

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.

Snímek obrazovky znázorňující DataList EditItemTemplate s přidaným tlačítkem 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:

  1. Nastavte vlastnost DataList s EditItemIndex na indexDataListItem, na jehož tlačítko Upravit bylo právě klikno.
  2. 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).

Kliknutím na tlačítko Upravit nastavíte produkt jako upravitelný.

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:

  1. Nastavte vlastnost DataList s EditItemIndex na index neexistující DataListItem index. -1 je bezpečná volba, protože DataListItem indexy začínají na 0.
  2. Znovu přidružte data k seznamu DataList. Vzhledem k tomu, že žádné DataListItemItemIndex prvky neodpovídají sadě DataList s EditItemIndex, 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í:

  1. 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.
  2. Zahajte proces aktualizace voláním příslušného UpdateProduct přetížení ve ProductsBLL třídě.
  3. Nastavte vlastnost DataList s EditItemIndex na index neexistující DataListItem index. -1 je bezpečná volba, protože DataListItem indexy začínají na 0.
  4. Znovu přidružte data k seznamu DataList. Vzhledem k tomu, že žádné DataListItemItemIndex prvky neodpovídají sadě DataList s EditItemIndex, 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.

EditCommandPo dokončení obslužných rutin událostí , CancelCommanda 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.

Při první návštěvě stránky jsou všechny produkty v Read-Only režimu

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)

Pokud chcete aktualizovat název nebo cenu produktu, klikněte na tlačítko Upravit.

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

Po změně hodnoty se kliknutím na Aktualizovat vraťte do režimu Read-Only.

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:

  1. Přečte v odpovídajících produktech ProductID prostřednictvím DataKeys kolekce.
  2. Provede odstranění voláním ProductsBLL metody třídy s DeleteProduct .
  3. 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 ItemTemplatea 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 Decimalna 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.