Přidání tlačítek do ovládacího prvku GridView a reakce na ně (VB)
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).
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
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.
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.sitemap
si chvíli prohlédněte web kurzů v prohlížeči. Nabídka na levé straně teď obsahuje položky pro úpravy, vkládání a odstraňování kurzů.
Obrázek 4: Mapa webu teď obsahuje polož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
.
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.
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 InsertItemTemplate
Visual Studio pro objekt FormView , EditItemTemplate
a 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.
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 SuppliersProducts
a přidejte nový ObjectDataSource 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.
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).
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 ProductName
UnitPrice
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.
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.
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 supplierID
objektem , musíme vytvořit dotaz, který aktualizuje data.
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)
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 DiscontinueAllProductsForSupplier
vlastnosti . 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.
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).
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.
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 UnitPrice
produktu 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íNULL
UnitPrice
, 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.
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.
Obrázek 19: Konfigurace vlastností ButtonFields Text
, CommandName
a 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.
Obrázek 20: GridView zahrnuje tlačítka Price +10% a Price -10% (kliknutím zobrazíte obrázek v plné velikosti)
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.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro