Přehled vkládání, aktualizace a odstraňování dat (C#)

Scott Mitchell

Stáhnout PDF

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

Metody Insert(), Update() a Delete() objectDataSource slouží jako proxy do BLL.

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

Přidání stránek ASP.NET pro kurzy datového Modification-Related

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.

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

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

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

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.

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

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.

Nechte ObjectDataSource vrátit všechny produkty.

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, AddProducta DeleteProduct .

Namapujte metodu Update() třídy ObjectDataSource na metodu UpdateProduct třídy ProductBLL.

Obrázek 7: Mapování metody ObjectDataSource Update() na metodu ProductBLL třídy UpdateProduct (kliknutím zobrazíte obrázek v plné velikosti)

Namapujte metodu Insert() objectDataSource na metodu AddProduct třídy ProductBLL.

Obrázek 8: Namapujte metodu ObjectDataSource Insert() na metodu ProductBLL Add Product třídy (kliknutím zobrazíte obrázek v plné velikosti)

Namapujte metodu Delete() objectDataSource na metodu DeleteProduct třídy ProductBLL.

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 ProductsBLLAddProductmetody třídy , UpdateProduct, aDeleteProduct:InsertParametersUpdateParametersDeleteParameters

<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, UpdateParametersa 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 ProductIDpole , CategoryNamea SupplierName jsou v ProductsDataTable 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 na truehodnotu .
  • 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:

  1. Jsou přiřazeny DeleteParameters hodnoty ObjectDataSource.
  2. Vyvolá se metoda ObjectDataSource Delete() , která odstraní zadaný záznam.
  3. 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í.

Zaškrtněte políčko Povolit odstraňová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.

CommandField přidá sloupec tlačítek pro odstranění.

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

Ujistěte se, že byla vymazána vlastnost OldValuesParameterFormatString.

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 Detailssystému alespoň jeden záznam, nemůžeme odstranit žádné produkty, dokud nejprve neodstraníme záznamy podrobností objednávky přidružené k produktu.

Omezení cizího klíče zakazuje odstranění produktů.

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]

Odstranit všechny záznamy z tabulky Podrobnosti objednávky

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:

  1. Vlastnost GridView EditItemIndex je přiřazena k indexu řádku, jehož tlačítko Upravit bylo klikno.
  2. GridView se znovu připojí k ObjectDataSource vyvoláním jeho Select() metody.
  3. 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:

  1. Hodnoty ObjectDataSource UpdateParameters jsou přiřazeny hodnoty zadané koncovým uživatelem do rozhraní pro úpravy GridView
  2. Vyvolá se metoda ObjectDataSource Update() , která aktualizuje zadaný záznam.
  3. 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.

Zaškrtněte políčko Povolit úpravy.

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.

Kliknutím na tlačítko Upravit zobrazíte řádek v režimu úprav.

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 nebo SupplierID , 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ého UnitPrice 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 UnitPriceaktualizaci dat by objekt GridView nenastavil UnitPriceUpdateParameters hodnotu, což by změnilo hodnotu záznamu UnitPriceNULL databáze na hodnotu. Podobně, pokud je povinné pole, například ProductName, 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ím CategoryID případě by hodnoty a SupplierID 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.

Snímek obrazovky s oknem Úlohy DetailsView se zaškrtnutými zaškrtávacími políčky Povolit vkládání, Povolit úpravy a Povolit odstranění

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.

Snímek obrazovky zobrazení DetailsView s příkazovým polem zobrazeným jako dolním řádkem s tlačítky Vložit, Upravit a Odstranit

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 falsehodnotu . Nastavte vlastnosti těchto dvou polí InsertVisible na falsehodnotu , 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.

Snímek obrazovky s oknem Pole s vlastností InsertVisible nastavenou na False

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.

Snímek obrazovky zobrazující Zobrazení podrobností stránky Basics.aspx ve webovém prohlížeči

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.

Podrobnosti o Acme Tea

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, Insertnebo 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, InsertItemTemplatea 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, Edita 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.

Defaut FormView ItemTemplate Seznamy pole každého produktu spolu s tlačítky Nový, Upravit a Odstranit

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áš EditItemTemplatesoubor 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.

Ve výchozím nastavení EditItemTemplate zobrazuje každé upravitelné pole produktu jako textové pole nebo zaškrtávací políčko.

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 EditItemTemplaterozhraní. 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í InsertItemTemplateobjektu 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 EditItemTemplatená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í.

InsertItemTemplate určuje Rozhraní Pro vkládání FormView

Obrázek 24: InsertItemTemplate Diktuje rozhraní pro vkládání formview (kliknutím zobrazíte obrázek v plné velikosti)

Podrobnosti o novém produktu Acme Coffee se zobrazí v zobrazení FormView.

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.