Přidání tlačítek do ovládacího prvku GridView a reakce na ně (VB)

Scott Mitchell

Stáhnout PDF

V tomto kurzu se podíváme na to, jak přidat vlastní tlačítka do šablony i do polí ovládacího prvku GridView nebo DetailsView. Konkrétně vytvoříme rozhraní, které má FormView, které uživateli umožňuje stránkovat dodavatele.

Úvod

I když mnoho scénářů vytváření sestav zahrnuje přístup k datům sestavy jen pro čtení, není neobvyklé, že sestavy obsahují možnost provádět akce na základě zobrazených dat. Obvykle to zahrnovalo přidání webového ovládacího prvku Button, LinkButton nebo ImageButton s každým záznamem zobrazeným v sestavě, který po kliknutí způsobí postback a vyvolá nějaký kód na straně serveru. Nejběžnějším příkladem je úprava a odstranění dat na základě záznamu po záznamu. Ve skutečnosti, jak jsme viděli na začátku kurzu Přehled vkládání, aktualizace a odstraňování dat , úpravy a odstraňování dat jsou tak běžné, že ovládací prvky GridView, DetailsView a FormView mohou tyto funkce podporovat bez nutnosti psaní jediného řádku kódu.

Kromě tlačítek Upravit a Odstranit můžou ovládací prvky GridView, DetailsView a FormView obsahovat také Tlačítka, Tlačítka odkazu nebo ImageButtons, které po kliknutí provádějí určitou vlastní logiku na straně serveru. V tomto kurzu se podíváme na to, jak přidat vlastní tlačítka do šablony i do polí ovládacího prvku GridView nebo DetailsView. Konkrétně vytvoříme rozhraní, které má FormView, které uživateli umožňuje stránkovat dodavatele. U daného dodavatele zobrazí FormView informace o dodavateli spolu s webovým ovládacím prvku Button, který po kliknutí označí všechny přidružené produkty jako ukončené. Kromě toho GridView uvádí seznam produktů poskytovaných vybraným dodavatelem, přičemž každý řádek obsahuje tlačítka Zvýšit cenu a Slevu, která po kliknutí zvýší nebo sníží produkty UnitPrice o 10 % (viz obrázek 1).

Tlačítka FormView i GridView obsahují, která provádějí vlastní akce

Obrázek 1: Tlačítka FormView i GridView obsahují, která provádějí vlastní akce (kliknutím zobrazíte obrázek v plné velikosti)

Krok 1: Přidání webových stránek kurzu tlačítka

Než se podíváme na to, jak přidat vlastní tlačítka, 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. Začněte přidáním nové složky s názvem CustomButtons. Dále do této složky přidejte následující dvě ASP.NET stránky a nezapomeňte přidružit každou stránku ke Site.master stránce předlohy:

  • Default.aspx
  • CustomButtons.aspx

Přidání stránek ASP.NET pro kurzy vlastního Buttons-Related

Obrázek 2: Přidání ASP.NET stránek pro kurzy vlastního Buttons-Related

Stejně jako v ostatních složkách Default.aspx bude ve CustomButtons 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ě přidejte následující značku za stránkování a řazení <siteMapNode>:

<siteMapNode
    title="Adding Custom Buttons"
    description="Samples of Reports that Include Buttons for Performing
                  Server-Side Actions"
    url="~/CustomButtons/Default.aspx">
    <siteMapNode
        title="Using ButtonFields and Buttons in Templates"
        description="Examines how to add custom Buttons, LinkButtons,
                      or ImageButtons as ButtonFields or within templates."
        url="~/CustomButtons/CustomButtons.aspx" />
</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žku pro kurz Vlastních tlačítek.

Obrázek 4: Mapa webu teď obsahuje položku pro kurz vlastních tlačítek

Krok 2: Přidání objektu FormView, který Seznamy dodavatele

Pojďme začít s tímto kurzem přidáním objektu FormView, který obsahuje seznam dodavatelů. Jak je popsáno v úvodu, toto FormView umožní uživateli procházet dodavatele a zobrazit produkty poskytované dodavatelem v GridView. Kromě toho bude toto Zobrazení formuláře obsahovat tlačítko, které po kliknutí označí všechny produkty dodavatele jako ukončené. Než se začneme zabývat přidáním vlastního tlačítka do objektu FormView, pojďme nejprve vytvořit FormView, aby se zobrazily informace o dodavateli.

Začněte otevřením CustomButtons.aspx stránky ve CustomButtons složce. Přidejte formView na stránku tak, že ho přetáhnete ze sady nástrojů na Designer a nastavíte jeho ID vlastnost na Suppliers. Z inteligentní značky FormView se rozhodnete vytvořit nový ObjectDataSource s názvem SuppliersDataSource.

Vytvoření nového objektuDataSource s názvem SuppliersDataSource

Obrázek 5: Vytvoření nového objektuDataSource s názvem SuppliersDataSource (kliknutím zobrazíte obrázek v plné velikosti)

Nakonfigurujte tento nový ObjectDataSource tak, aby dotaz z SuppliersBLL metody třídy s GetSuppliers() (viz obrázek 6). Vzhledem k tomu, že toto zobrazení FormView neposkytuje rozhraní pro aktualizaci informací o dodavateli, vyberte možnost (Žádné) z rozevíracího seznamu na kartě UPDATE.

Nakonfigurujte zdroj dat tak, aby používal metodu SuppliersBLL Class s GetSuppliers()

Obrázek 6: Konfigurace zdroje dat pro použití SuppliersBLL metody Třídy s GetSuppliers() (kliknutím zobrazíte obrázek v plné velikosti)

Po konfiguraci ObjectDataSource vygeneruje InsertItemTemplateVisual Studio pro objekt FormView , EditItemTemplatea ItemTemplate . InsertItemTemplate Odeberte a EditItemTemplate upravte ItemTemplate je tak, aby zobrazoval jenom název společnosti a telefonní číslo dodavatele. Nakonec zapněte podporu stránkování pro FormView zaškrtnutím políčka Povolit stránkování u jeho inteligentní značky (nebo nastavením jeho AllowPaging vlastnosti na True). Po těchto změnách by deklarativní kód stránky měl vypadat nějak takto:

<asp:FormView ID="Suppliers" runat="server" DataKeyNames="SupplierID"
    DataSourceID="SuppliersDataSource" EnableViewState="False" AllowPaging="True">
    <ItemTemplate>
        <h3>
            <asp:Label ID="CompanyName" runat="server"
                Text='<%# Bind("CompanyName") %>' />
        </h3>
        <b>Phone:</b>
        <asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
    </ItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
</asp:ObjectDataSource>

Obrázek 7 ukazuje stránku CustomButtons.aspx při zobrazení v prohlížeči.

FormView Seznamy pole CompanyName a Phone od aktuálně vybraného dodavatele

Obrázek 7: Zobrazení formuláře Seznamy CompanyName polí a Phone od aktuálně vybraného dodavatele (kliknutím zobrazíte obrázek v plné velikosti)

Krok 3: Přidání objektu GridView, který Seznamy vybraného dodavatele produktů

Než přidáme tlačítko Ukončit všechny produkty do šablony FormView s, pojďme nejprve přidat GridView pod FormView, který obsahuje seznam produktů poskytovaných vybraným dodavatelem. Chcete-li toho dosáhnout, přidejte na stránku GridView, nastavte jeho ID vlastnost na SuppliersProductsa přidejte nový ObjectDataSource s názvem SuppliersProductsDataSource.

Vytvoření nového objektuDataSource s názvem SuppliersProductsDataSource

Obrázek 8: Vytvoření nového objektuDataSource s názvem SuppliersProductsDataSource (kliknutím zobrazíte obrázek v plné velikosti)

Nakonfigurujte tento ObjectDataSource tak, aby používal metodu ProductsBLL třídy s GetProductsBySupplierID(supplierID) (viz Obrázek 9). I když tento GridView umožní úpravu ceny produktu, nebude používat integrované úpravy nebo odstraňování funkcí z GridView. Proto můžeme nastavit rozevírací seznam na (None) pro karty ObjectDataSource s UPDATE, INSERT a DELETE.

Nakonfigurujte zdroj dat tak, aby používal metodu GetProductsBySupplierID(supplierID) třídy ProductsBLL

Obrázek 9: Konfigurace zdroje dat pro použití ProductsBLL metody Třídy s GetProductsBySupplierID(supplierID) (kliknutím zobrazíte obrázek v plné velikosti)

Vzhledem k tomu, že GetProductsBySupplierID(supplierID) metoda přijímá vstupní parametr, průvodce ObjectDataSource nás vyzve k zadání zdroje této hodnoty parametru. Pokud chcete předat SupplierID hodnotu z objektu FormView, nastavte rozevírací seznam Zdroj parametrů na Control a rozevírací seznam ControlID na Suppliers (ID objektu FormView vytvořeného v kroku 2).

Označuje, že parametr supplierID by měl pocházet z ovládacího prvku Supplier FormView

Obrázek 10: Označuje, že supplierID parametr by měl pocházet z Suppliers ovládacího prvku FormView (kliknutím zobrazíte obrázek v plné velikosti)

Po dokončení průvodce ObjectDataSource bude GridView obsahovat BoundField nebo CheckBoxField pro každé z datových polí produktu. Pojďme to oříznout, aby se spolu s Discontinued CheckBoxField zobrazovaly jenom ProductNameUnitPrice a BoundFields. Kromě toho naformátujme UnitPrice BoundField tak, aby jeho text byl naformátován jako měna. Deklarativní značky GridView a SuppliersProductsDataSource ObjectDataSource by měly vypadat podobně jako následující značky:

<asp:GridView ID="SuppliersProducts" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="SuppliersProductsDataSource"
    EnableViewState="False" runat="server">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:C}"
            HtmlEncode="False" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsBySupplierID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:ControlParameter ControlID="Suppliers" Name="supplierID"
            PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

V tomto okamžiku náš kurz zobrazí hlavní sestavu nebo sestavu podrobností, která uživateli umožňuje vybrat dodavatele z zobrazení FormView v horní části a zobrazit produkty poskytované tímto dodavatelem prostřednictvím objektu GridView v dolní části. Obrázek 11 ukazuje snímek obrazovky této stránky při výběru dodavatele Tokyo Traders z formuláře.

Vybrané produkty dodavatele jsou zobrazeny v GridView

Obrázek 11: Produkty vybraného dodavatele jsou zobrazeny v zobrazení GridView (kliknutím zobrazíte obrázek v plné velikosti).

Krok 4: Vytvoření metod DAL a BLL pro ukončení všech produktů pro dodavatele

Než můžeme přidat tlačítko do FormView, které po kliknutí ukončí všechny produkty dodavatele, musíme nejprve přidat metodu dal i BLL, která tuto akci provede. Konkrétně bude mít tato metoda název DiscontinueAllProductsForSupplier(supplierID). Po kliknutí na tlačítko FormView s vyvoláme tuto metodu ve vrstvě obchodní logiky a předáme vybranému dodavateli SupplierID. BLL pak zavolá odpovídající metodu Data Access Layer, která vydá UPDATE do databáze příkaz, který ukončí produkty určeného dodavatele.

Stejně jako v předchozích kurzech použijeme přístup zdola nahoru, počínaje vytvořením metody DAL, pak metodou BLL a nakonec implementací funkcí na stránce ASP.NET. Northwind.xsd Otevřete ve App_Code/DAL složce Typed DataSet a přidejte do této složky novou metodu ProductsTableAdapter (klikněte pravým tlačítkem myši na ProductsTableAdapter a zvolte Přidat dotaz). Tím se zobrazí průvodce konfigurace dotazu TableAdapter, který nás provede procesem přidání nové metody. Začněte tím, že označíte, že naše metoda DAL bude používat ad hoc příkaz SQL.

Vytvoření metody DAL pomocí ad hoc příkazu SQL

Obrázek 12: Vytvoření metody DAL pomocí ad hoc příkazu SQL (kliknutím zobrazíte obrázek v plné velikosti)

Dále se nás průvodce zeptá, jaký typ dotazu se má vytvořit. Vzhledem k tomu, že DiscontinueAllProductsForSupplier(supplierID) metoda bude muset aktualizovat Products tabulku databáze a nastavit Discontinued pole na hodnotu 1 pro všechny produkty poskytované zadaným supplierIDobjektem , musíme vytvořit dotaz, který aktualizuje data.

Zvolte typ dotazu UPDATE.

Obrázek 13: Volba typu dotazu UPDATE (kliknutím zobrazíte obrázek v plné velikosti)

Další obrazovka průvodce obsahuje existující UPDATE příkaz TableAdapter s, který aktualizuje všechna pole definovaná v Products tabulce DataTable. Tento text dotazu nahraďte následujícím příkazem:

UPDATE [Products] SET
   Discontinued = 1
WHERE SupplierID = @SupplierID

Po zadání tohoto dotazu a kliknutí na další se na poslední obrazovce průvodce zobrazí dotaz na název nové metody use DiscontinueAllProductsForSupplier. Dokončete průvodce kliknutím na tlačítko Dokončit. Po návratu do Designer DataSet byste měli vidět novou metodu v pojmenovaném ProductsTableAdapter .DiscontinueAllProductsForSupplier(@SupplierID)

Pojmenujte novou metodu DAL DiscontinueAllProductsForSupplier.

Obrázek 14: Pojmenování nové metody DiscontinueAllProductsForSupplier DAL (kliknutím zobrazíte obrázek v plné velikosti)

S metodou DiscontinueAllProductsForSupplier(supplierID) vytvořenou ve vrstvě přístupu k datům je naším dalším úkolem vytvořit metodu DiscontinueAllProductsForSupplier(supplierID) ve vrstvě obchodní logiky. To provedete tak, že ProductsBLL otevřete soubor třídy a přidáte následující:

Public Function DiscontinueAllProductsForSupplier(supplierID As Integer) As Integer
    Return Adapter.DiscontinueAllProductsForSupplier(supplierID)
End Function

Tato metoda jednoduše volá metodu DiscontinueAllProductsForSupplier(supplierID) v DAL a předává hodnotu zadaného supplierID parametru. Pokud by některá obchodní pravidla umožňovala ukončení poskytování dodavatelů pouze za určitých okolností, měla by být tato pravidla provedena zde, v BLL.

Poznámka

UpdateProduct Na rozdíl od přetížení ve ProductsBLL třídě DiscontinueAllProductsForSupplier(supplierID) podpis metody neobsahuje DataObjectMethodAttribute atribut (<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, Boolean)>). To vylučuje metodu DiscontinueAllProductsForSupplier(supplierID) z rozevíracího seznamu Průvodce konfigurací zdroje dat ObjectDataSource na kartě UPDATE. Tento atribut jsem vynechal, protože budeme volat metodu DiscontinueAllProductsForSupplier(supplierID) přímo z obslužné rutiny události na naší stránce ASP.NET.

Krok 5: Přidání tlačítka Ukončit všechny produkty do ovládacího prvku FormView

DiscontinueAllProductsForSupplier(supplierID) Po dokončení metody v BLL a DAL je posledním krokem pro přidání možnosti ukončit všechny produkty pro vybraného dodavatele přidání webového ovládacího prvku Button do FormView s ItemTemplate. Pojďme přidat takové Tlačítko pod telefonní číslo dodavatele s textem tlačítka Ukončit všechny produkty a ID hodnotou DiscontinueAllProductsForSuppliervlastnosti . Tento webový ovládací prvek Button (Tlačítko) můžete přidat prostřednictvím Designer kliknutím na odkaz Upravit šablony v inteligentní značce FormView (viz obrázek 15) nebo přímo prostřednictvím deklarativní syntaxe.

Přidání webového ovládacího prvku Ukončit všechny produkty Button do FormView s ItemTemplate

Obrázek 15: Přidání webového ovládacího prvku Ukončit všechny produkty Tlačítko do FormView s ItemTemplate (kliknutím zobrazíte obrázek v plné velikosti)

Při kliknutí na tlačítko uživatelem, který navštíví stránku, dojde k zpětnému odeslání a formView událostItemCommand se aktivuje. Pro spuštění vlastního kódu v reakci na kliknutí na toto tlačítko můžeme pro tuto událost vytvořit obslužnou rutinu události. Uvědomte si ale, že ItemCommand událost se aktivuje při každém kliknutí na ovládací prvek Button, LinkButton nebo ImageButton Web v zobrazení FormView. To znamená, že když se uživatel přesune z jedné stránky na jinou v objektu FormView, ItemCommand událost se aktivuje. Totéž platí, když uživatel klikne na New (Nový), Edit (Upravit) nebo Delete (Odstranit) v objektu FormView, který podporuje vložení, aktualizaci nebo odstranění.

Vzhledem k tomu, že se ItemCommand aktivuje bez ohledu na to, na jaké tlačítko se kliklo, potřebujeme v obslužné rutině události způsob, jak zjistit, jestli se kliklo na tlačítko Ukončit všechny produkty nebo jestli se jednalo o nějaké jiné tlačítko. K tomu můžeme nastavit vlastnost Webového ovládacího prvku CommandName Tlačítko na určitou identifikační hodnotu. Po kliknutí na tlačítko se tato CommandName hodnota předá ItemCommand obslužné rutině události, což nám umožní zjistit, jestli bylo kliknutím na tlačítko Ukončit všechny produkty. Vlastnost tlačítka CommandName Ukončit všechny produkty nastavte na DiscontinueProducts .

Nakonec použijeme dialogové okno potvrzení na straně klienta, abyste zajistili, že uživatel opravdu chce ukončit používání produktů vybraného dodavatele. Jak jsme viděli v kurzu Přidání potvrzení Client-Side při odstraňování , můžete toho dosáhnout s trochou JavaScriptu. Konkrétně nastavte vlastnost Webového ovládacího prvku Button s OnClientClick na return confirm('This will mark _all_ of this supplier\'s products as discontinued. Are you certain you want to do this?');

Po provedení těchto změn by deklarativní syntaxe objektu FormView měla vypadat takto:

<asp:FormView ID="Suppliers" runat="server" DataKeyNames="SupplierID"
    DataSourceID="SuppliersDataSource" EnableViewState="False"
    AllowPaging="True">
    <ItemTemplate>
        <h3><asp:Label ID="CompanyName" runat="server"
            Text='<%# Bind("CompanyName") %>'></asp:Label></h3>
        <b>Phone:</b>
        <asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
        <br />
        <asp:Button ID="DiscontinueAllProductsForSupplier" runat="server"
            CommandName="DiscontinueProducts" Text="Discontinue All Products"
            OnClientClick="return confirm('This will mark _all_ of this supplier\'s
                products as discontinued. Are you certain you want to do this?');" />
    </ItemTemplate>
</asp:FormView>

Dále vytvořte obslužnou rutinu události pro událost FormView s ItemCommand . V této obslužné rutině události musíme nejprve zjistit, jestli se kliklo na tlačítko Ukončit všechny produkty. Pokud ano, chceme vytvořit instanci ProductsBLL třídy a vyvolat její DiscontinueAllProductsForSupplier(supplierID) metodu předáním SupplierID vybraného Objektu FormView:

Protected Sub Suppliers_ItemCommand(sender As Object, e As FormViewCommandEventArgs) _
    Handles Suppliers.ItemCommand
    If e.CommandName.CompareTo("DiscontinueProducts") = 0 Then
        ' The "Discontinue All Products" Button was clicked.
        ' Invoke the ProductsBLL.DiscontinueAllProductsForSupplier(supplierID) method
        ' First, get the SupplierID selected in the FormView
        Dim supplierID As Integer = CType(Suppliers.SelectedValue, Integer)
        ' Next, create an instance of the ProductsBLL class
        Dim productInfo As New ProductsBLL()
        ' Finally, invoke the DiscontinueAllProductsForSupplier(supplierID) method
        productInfo.DiscontinueAllProductsForSupplier(supplierID)
    End If
End Sub

Všimněte si, že k SupplierID aktuálnímu vybranému dodavateli v zobrazení FormView lze přistupovat pomocí vlastnosti FormView sSelectedValue. Vlastnost SelectedValue vrátí první hodnotu klíče dat záznamu zobrazeného v zobrazení FormView. Vlastnost FormView sDataKeyNames, která označuje datová pole, ze kterých se hodnoty datových klíčů nabíjejí, byla automaticky nastavena sadou Visual Studio na SupplierID hodnotu při vytváření vazby ObjectDataSource s objektem FormView zpět v kroku 2.

Po vytvoření obslužné ItemCommand rutiny události chvíli otestujte stránku. Přejděte na dodavatele Cooperativa de Quesos Las Cabras (je to pro mě pátý dodavatel v zobrazení FormView). Tento dodavatel poskytuje dva produkty, Queso Cabrales a Queso Manchego La Pastora, které nejsou ukončeny.

Představte si, že společnost Cooperativa de Quesos "Las Cabras" skončila, a proto budou její produkty ukončeny. Klikněte na tlačítko Ukončit všechny produkty. Zobrazí se dialogové okno potvrzení na straně klienta (viz Obrázek 16).

Cooperativa de Quesos Las Cabras dodává dva aktivní produkty

Obrázek 16: Cooperativa de Quesos Las Cabras dodává dva aktivní produkty (kliknutím zobrazíte obrázek v plné velikosti)

Pokud kliknete na OK v potvrzovací dialogovém okně na straně klienta, bude odesílání formuláře pokračovat a způsobí zpětné odeslání, ve kterém se aktivuje událost FormView s ItemCommand . Obslužná rutina události, kterou jsme vytvořili, pak spustí metodu DiscontinueAllProductsForSupplier(supplierID) a vyřadí produkty Queso Cabrales a Queso Manchego La Pastora.

Pokud jste zakázali stav zobrazení GridView, gridView se při každém zpětném odeslání vrátí do podkladového úložiště dat, a proto se okamžitě aktualizuje tak, aby odrážel, že tyto dva produkty jsou nyní ukončeny (viz Obrázek 17). Pokud jste však v zobrazení GridView nezaknuli stav zobrazení, budete muset po provedení této změny ručně znovu připojit data k objektu GridView. Chcete-li toho dosáhnout, jednoduše proveďte volání GridView s DataBind() metoda okamžitě po vyvolání DiscontinueAllProductsForSupplier(supplierID) metody.

Po kliknutí na tlačítko Ukončit všechny produkty se produkty dodavatele aktualizují odpovídajícím způsobem.

Obrázek 17: Po kliknutí na tlačítko Ukončit všechny produkty se produkty dodavatele aktualizují odpovídajícím způsobem (kliknutím zobrazíte obrázek v plné velikosti).

Krok 6: Vytvoření přetížení UpdateProduct ve vrstvě obchodní logiky pro úpravu ceny produktu

Stejně jako u tlačítka Ukončit všechny produkty v zobrazení FormView, abychom mohli přidat tlačítka pro zvýšení a snížení ceny produktu v GridView, musíme nejprve přidat odpovídající metody vrstvy přístupu k datům a vrstvy obchodní logiky. Vzhledem k tomu, že již máme metodu, která aktualizuje jeden řádek produktu v DAL, můžeme takovou funkci poskytnout vytvořením nového přetížení metody UpdateProduct v BLL.

Naše předchozí UpdateProduct přetížení vzala v některých kombinacích polí produktů jako skalární vstupní hodnoty a pak aktualizovala pouze tato pole pro zadaný produkt. U tohoto přetížení se budeme mírně lišit od tohoto standardu a místo toho předáme součin ProductID a procento, o které se má upravit UnitPrice (na rozdíl od předání nového, upraveného UnitPrice samotného). Tento přístup zjednoduší kód, který potřebujeme napsat ve třídě kódu stránky ASP.NET, protože se nemusíme obtěžovat s určením aktuálního UnitPriceproduktu s .

Přetížení UpdateProduct pro tento kurz je znázorněno níže:

Public Function UpdateProduct _
    (unitPriceAdjustmentPercentage As Decimal, productID As Integer) As Boolean
    Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        ' no matching record found, return false
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    ' Adjust the UnitPrice by the specified percentage (if it's not NULL)
    If Not product.IsUnitPriceNull() Then
        product.UnitPrice *= unitPriceAdjustmentPercentage
    End If
    ' Update the product record
    Dim rowsAffected As Integer = Adapter.Update(product)
    ' Return true if precisely one row was updated, otherwise false
    Return rowsAffected = 1
End Function

Toto přetížení načte informace o zadaném produktu prostřednictvím metody DAL s GetProductByProductID(productID) . Poté zkontroluje, jestli má produkt s UnitPrice přiřazenou hodnotu databáze NULL . Pokud ano, cena zůstane nezměněná. Pokud však existuje hodnota, která neníNULLUnitPrice , aktualizuje metoda produkt s UnitPrice o zadané procento (unitPriceAdjustmentPercent).

Krok 7: Přidání tlačítek Zvětšit a Snížit do GridView

Objekty GridView (i DetailsView) se skládají z kolekce polí. Kromě BoundFields, CheckBoxFields a TemplateFields zahrnuje ASP.NET ButtonField, který, jak jeho název napovídá, vykresluje jako sloupec s Button, LinkButton nebo ImageButton pro každý řádek. Podobně jako u objektu FormView, kliknutí na libovolné tlačítko v rámci stránkovací tlačítka GridView, tlačítka Upravit nebo Odstranit, tlačítka pro řazení a tak dále způsobí zpětné odeslání a vyvolá událost GridView sRowCommand.

ButtonField má CommandName vlastnost, která přiřadí zadanou hodnotu každému z jeho Buttons CommandName vlastnosti. Stejně jako u objektu FormView CommandName se hodnota používá obslužnou rutinou RowCommand události k určení, na které tlačítko bylo kliklo.

Pojďme přidat dvě nová ButtonFields do GridView, jedno s textem tlačítka Price +10% a druhé s textem Price -10%. Pokud chcete přidat tato pole ButtonFields, klikněte na odkaz Upravit sloupce u inteligentní značky GridView, v seznamu vlevo nahoře vyberte typ pole ButtonField a klikněte na tlačítko Přidat.

Přidání dvou buttonFields do GridView

Obrázek 18: Přidání dvou buttonFields do objektu GridView

Přesuňte dvě ButtonFields tak, aby se zobrazovaly jako první dvě pole GridView. Dále nastavte Text vlastnosti těchto dvou ButtonField na Price +10% a Price -10% a CommandName vlastnosti na ZvýšitCena a SnížitCena. Ve výchozím nastavení ButtonField vykresluje svůj sloupec tlačítek jako LinkButtons. To ale můžete změnit pomocí vlastnosti ButtonField sButtonType. Nechte si tyto dvě ButtonFields vykreslit jako běžná tlačítka; Proto nastavte ButtonType vlastnost na Button. Obrázek 19 znázorňuje dialogové okno Pole po provedení těchto změn; Následující je deklarativní kód GridView.

Konfigurace vlastností ButtonFields Text, CommandName a ButtonType

Obrázek 19: Konfigurace vlastností ButtonFields Text, CommandNamea ButtonType

<asp:GridView ID="SuppliersProducts" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="SuppliersProductsDataSource"
    EnableViewState="False">
    <Columns>
        <asp:ButtonField ButtonType="Button" CommandName="IncreasePrice"
            Text="Price +10%" />
        <asp:ButtonField ButtonType="Button" CommandName="DecreasePrice"
            Text="Price -10%" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:C}"
            HtmlEncode="False" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

Po vytvoření těchto ButtonFields je posledním krokem vytvoření obslužné rutiny události pro událost GridView s RowCommand . Tato obslužná rutina události, pokud je aktivována, protože se kliklo na tlačítko Price +10% nebo Price -10%, musí určit ProductID pro řádek, na jehož tlačítko bylo kliknutí, a poté vyvolat metodu ProductsBLL třídy s UpdateProduct předáním příslušné UnitPrice procentuální úpravy spolu s ProductID. Následující kód provádí tyto úlohy:

Protected Sub SuppliersProducts_RowCommand _
    (sender As Object, e As GridViewCommandEventArgs) _
        Handles SuppliersProducts.RowCommand
    If e.CommandName.CompareTo("IncreasePrice") = 0 OrElse _
       e.CommandName.CompareTo("DecreasePrice") = 0 Then
        ' The Increase Price or Decrease Price Button has been clicked
        ' Determine the ID of the product whose price was adjusted
        Dim productID As Integer = Convert.ToInt32( _
            SuppliersProducts.DataKeys(Convert.ToInt32(e.CommandArgument)).Value)
        ' Determine how much to adjust the price
        Dim percentageAdjust As Decimal
        If e.CommandName.CompareTo("IncreasePrice") = 0 Then
            percentageAdjust = 1.1
        Else
            percentageAdjust = 0.9
        End If
        ' Adjust the price
        Dim productInfo As New ProductsBLL()
        productInfo.UpdateProduct(percentageAdjust, productID)
    End If
End Sub

Abychom mohli určit ProductID pro řádek, na jehož tlačítko Price +10% nebo Price -10% bylo kliklo, musíme se podívat na kolekci GridView.DataKeys Tato kolekce obsahuje hodnoty polí zadaných ve DataKeyNames vlastnosti pro každý řádek GridView. Vzhledem k tomu GridView s DataKeyNames vlastnost byla nastavena na ProductID v sadě Visual Studio při vazbě ObjectDataSource na GridView, DataKeys(rowIndex).Value poskytuje ProductID pro zadaný rowIndex.

ButtonField automaticky předá řádekIndex řádku, jehož tlačítko bylo klikováno prostřednictvím parametru e.CommandArgument . Proto k určení ProductID pro řádek, jehož cena +10% nebo cena -10% tlačítko bylo klikováno, použijeme: Convert.ToInt32(SuppliersProducts.DataKeys(Convert.ToInt32(e.CommandArgument)).Value).

Stejně jako u tlačítka Ukončit všechny produkty platí, že pokud jste zakázali stav zobrazení GridView, GridView se vrátí do podkladového úložiště dat při každém zpětném odeslání, a proto se okamžitě aktualizuje tak, aby odrážel změnu ceny, ke které dochází po kliknutí na některé z tlačítek. Pokud jste však v zobrazení GridView nezaknuli stav zobrazení, budete muset po provedení této změny ručně znovu připojit data k objektu GridView. Chcete-li toho dosáhnout, jednoduše proveďte volání GridView s DataBind() metoda okamžitě po vyvolání UpdateProduct metody.

Obrázek 20 znázorňuje stránku při prohlížení produktů poskytovaných babičkou Kelly's Homestead. Obrázek 21 ukazuje výsledky po kliknutí dvakrát na tlačítko Cena +10% pro Babičku Boysenberry Spread a tlačítko Price -10% jednou pro Northwoods Brusinkovou omáčku.

GridView zahrnuje tlačítka Price +10 % a Price -10 %

Obrázek 20: GridView zahrnuje tlačítka Price +10% a Price -10% (kliknutím zobrazíte obrázek v plné velikosti)

Ceny prvního a třetího produktu byly aktualizovány pomocí tlačítek Price +10% a Price -10%

Obrázek 21: Ceny prvního a třetího produktu byly aktualizovány pomocí tlačítek Price +10 % a Price -10% (Kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

Objekty GridView (a DetailsView) můžou mít také tlačítka, tlačítka LinkButtons nebo ImageButtons přidané do jejich TemplateFields. Stejně jako u BoundField, tato tlačítka, po kliknutí, vyvolat zpětné, zvýšení GridView událost.RowCommand Při přidávání tlačítek v TemplateField se ale button s CommandArgument automaticky nenastaví na index řádku, jako je tomu při použití ButtonFields. Pokud potřebujete určit index řádku tlačítka, na které jste klikli v rámci RowCommand obslužné rutiny události, budete muset ručně nastavit vlastnost Button s CommandArgument v její deklarativní syntaxi v TemplateField pomocí kódu, jako je:
<asp:Button runat="server" ... CommandArgument='<%# CType(Container, GridViewRow).RowIndex %>' />.

Souhrn

Ovládací prvky GridView, DetailsView a FormView můžou obsahovat Tlačítka, LinkButtons nebo ImageButtons. Taková tlačítka při kliknutí způsobí zpětné odeslání a vyvolá ItemCommand událost v ovládacích prvcích FormView a DetailsView a RowCommand událost v GridView. Tyto datové webové ovládací prvky mají integrované funkce pro zpracování běžných akcí souvisejících s příkazy, jako je odstranění nebo úprava záznamů. Můžeme ale také použít tlačítka, která po kliknutí reagují spuštěním vlastního kódu.

K tomu potřebujeme vytvořit obslužnou rutinu ItemCommand události pro událost nebo RowCommand . V této obslužné rutině události nejprve zkontrolujeme příchozí CommandName hodnotu, abychom zjistili, na které tlačítko se kliklo, a pak provedeme příslušnou vlastní akci. V tomto kurzu jsme viděli, jak pomocí tlačítek a ButtonFields ukončit všechny produkty pro konkrétního dodavatele nebo zvýšit nebo snížit cenu konkrétního produktu o 10 %.

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.