Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto kurzu vytvoříme rozhraní, které pomocí Repeateru vypíše kategorie v systému. Každá kategorie poskytuje tlačítko pro zobrazení přidružených produktů pomocí ovládacího prvku BulletedList.
Úvod
V posledních sedmnácti kurzech DataList a Repeater jsme vytvořili jak příklady pouze pro čtení, tak i příklady pro úpravy a mazání. Abychom usnadnili úpravy a odstraňování schopností v prvku DataList, přidali jsme tlačítka do objektu DataList s ItemTemplate , která po kliknutí způsobila postback a vyvolala událost DataList odpovídající vlastnosti tlačítka CommandName . Například přidání tlačítka k ItemTemplate s hodnotou vlastnosti CommandName Edit způsobí vyvolání EditCommand DataList při zpětném odeslání; ten, který má CommandName vlastnost Delete, vyvolá DeleteCommand.
Kromě tlačítek Upravit a Smazat mohou ovládací prvky DataList a Repeater obsahovat také tlačítka, odkazová tlačítka nebo obrazová tlačítka, která při kliknutí provádějí vlastní logiku na straně serveru. V tomto kurzu vytvoříme rozhraní, které pomocí repeateru vypíše kategorie v systému. Pro každou kategorii bude repeater obsahovat tlačítko pro zobrazení přidružených produktů kategorií pomocí ovládacího prvku BulletedList (viz obrázek 1).
Obrázek 1: Kliknutím na odkaz Zobrazit produkty zobrazíte produkty kategorie v seznamu s odrážkami (kliknutím zobrazíte obrázek s plnou velikostí).
Krok 1: Přidání webových stránek s návodem k vlastním tlačítkům
Než se podíváme na to, jak přidat vlastní tlačítko, zabereme chvilku, než vytvoříme ASP.NET stránky v našem projektu webu, který budeme pro tento kurz potřebovat. Začněte přidáním nové složky s názvem CustomButtonsDataListRepeater. 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.aspxCustomButtons.aspx
Obrázek 2: Přidání ASP.NET stránek pro vlastní kurzy Buttons-Related
Stejně jako v ostatních složkách, ve složce Default.aspx bude uveden seznam kurzů v této části. Vzpomeňte si, že SectionLevelTutorialListing.ascx uživatelské řízení tuto funkci poskytuje. Přidejte tento uživatelský ovládací prvek Default.aspx tak, že ho přetáhnete z Průzkumníka řešení do návrhového zobrazení 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í kód za stránkování a řazení pomocí DataList a Repeater <siteMapNode>:
<siteMapNode
url="~/CustomButtonsDataListRepeater/Default.aspx"
title="Adding Custom Buttons to the DataList and Repeater"
description="Samples of DataList and Repeater Reports that Include
Buttons for Performing Server-Side Actions">
<siteMapNode
url="~/CustomButtonsDataListRepeater/CustomButtons.aspx"
title="Using Custom Buttons in the DataList and Repeater's Templates"
description="Examines how to add custom Buttons, LinkButtons,
or ImageButtons within templates." />
</siteMapNode>
Po aktualizaci Web.sitemapsi chvíli prohlédněte web kurzů prostřednictvím prohlížeče. Nabídka vlevo 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í seznamu kategorií
Pro účely tohoto kurzu potřebujeme vytvořit Repeater, který obsahuje seznam všech kategorií spolu s odkazem Zobrazit produkty LinkButton, které po kliknutí zobrazí přidružené produkty kategorií v seznamu s odrážkami. Nejprve vytvoříme jednoduchý repeater, který zobrazí seznam kategorií v systému. Začněte otevřením CustomButtons.aspx stránky ve CustomButtonsDataListRepeater složce. Přetáhněte repeater z panelu nástrojů do Návrháře a nastavte jeho ID vlastnost na Categories. Dále vytvořte nový ovládací prvek zdroje dat z inteligentní značky Repeateru. Konkrétně vytvořte nový ovládací prvek ObjectDataSource s názvem CategoriesDataSource , který vybere jeho data z CategoriesBLL metody třídy s GetCategories() .
Obrázek 5: Konfigurace ObjectDataSource tak, aby používala metodu CategoriesBLL class s GetCategories() (kliknutím zobrazíte obrázek s plnou velikostí)
Na rozdíl od ovládacího prvku DataList, pro který Visual Studio vytvoří výchozí ItemTemplate na základě zdroje dat, musí být šablony pro Repeater definovány ručně. Šablony Repeater s musí být navíc vytvořeny a upravovány deklarativním způsobem (to znamená, že není k dispozici žádná možnost Upravit šablony v inteligentní značce Repeater s).
Klikněte na kartu Zdroj v levém dolním rohu a přidejte ItemTemplate, který zobrazuje název kategorie v <h3> prvku a jeho popis v odstavcové značce; přidejte SeparatorTemplate, který zobrazuje vodorovnou čáru (<hr />) mezi každými kategoriemi. Přidejte také LinkButton s jeho Text vlastností nastavenou na Zobrazit produkty. Po dokončení těchto kroků by deklarativní kód stránky měl vypadat takto:
<asp:Repeater ID="Categories" DataSourceID="CategoriesDataSource"
runat="server">
<ItemTemplate>
<h3><%# Eval("CategoryName") %></h3>
<p>
<%# Eval("Description") %>
[<asp:LinkButton runat="server" ID="ShowProducts">
Show Products</asp:LinkButton>]
</p>
</ItemTemplate>
<SeparatorTemplate><hr /></SeparatorTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
Obrázek 6 znázorňuje stránku při prohlížení v prohlížeči. Zobrazí se název a popis každé kategorie. Tlačítko Zobrazit produkty po kliknutí vyvolá postback, ale ještě neprovede žádnou akci.
Obrázek 6: Zobrazí se název a popis každé kategorie spolu s odkazem Zobrazit produkty (kliknutím zobrazíte obrázek v plné velikosti).
Krok 3: Spuštění logiky Server-Side při kliknutí na tlačítko pro zobrazení produktů.
Kdykoli kliknete na tlačítko, LinkButton nebo ImageButton v šabloně v objektu DataList nebo Repeater, dojde k zpětnému odeslání a událost DataList nebo Repeater s ItemCommand se aktivuje. Kromě ItemCommand události může ovládací prvek DataList také vyvolat další, konkrétnější událost, pokud je vlastnost tlačítka CommandName nastavena na jeden z rezervovaných řetězců ( Delete, Edit, Cancel, Update nebo Select ), ale ItemCommand událost je vždy aktivována.
Když je tlačítko kliknuto v ovládacím prvku DataList nebo Repeater, často potřebujeme předat to, na které tlačítko bylo kliknuto (v případě, že v ovládacím prvku může existovat více tlačítek, například tlačítko Upravit a Odstranit) a možná i některé další informace (například hodnota primárního klíče položky, jejíž tlačítko bylo kliknuto). Button, LinkButton a ImageButton poskytují dvě vlastnosti, jejichž hodnoty jsou předány obslužné rutině ItemCommand události:
-
CommandNameŘetězec obvykle používaný k identifikaci jednotlivých tlačítek v šabloně -
CommandArgumentčasto se používá k uložení hodnoty některých datových polí, jako je hodnota primárního klíče.
V tomto příkladu nastavte vlastnost ShowProducts u LinkButton s CommandName a svázat hodnotu primárního klíče aktuálního záznamu CategoryID k CommandArgument vlastnosti pomocí syntaxe vazby CategoryArgument='<%# Eval("CategoryID") %>' dat. Po zadání těchto dvou vlastností by deklarativní syntaxe LinkButton s měla vypadat takto:
<asp:LinkButton runat="server" CommandName="ShowProducts"
CommandArgument='<%# Eval("CategoryID") %>' ID="ShowProducts">
Show Products</asp:LinkButton>
Po kliknutí na tlačítko dojde k provedení postbacku a se aktivuje událost ItemCommand pro DataList nebo Repeater. Obslužná rutina události je předána tlačítku s hodnotami CommandName a CommandArgument.
Vytvořte obslužnou rutinu události pro událost Repeater s ItemCommand a poznamenejte si druhý parametr předaný do obslužné rutiny události (pojmenované e). Tento druhý parametr je typu RepeaterCommandEventArgs a má následující čtyři vlastnosti:
-
CommandArgumenthodnota vlastnosti kliknutí na tlačítko sCommandArgument -
CommandNamehodnota vlastnosti tlačítkaCommandName -
CommandSourceodkaz na ovládací prvek tlačítka, na který se kliklo -
Itemodkaz na objektRepeaterItem, který obsahuje tlačítko, na které bylo kliknuto; každý záznam navázaný na opakovač se projevuje jakoRepeaterItem
Vzhledem k tomu, že vybraná kategorie se CategoryID předává prostřednictvím CommandArgument vlastnosti, můžeme získat množinu produktů přidružených k vybrané kategorii v obslužné rutině ItemCommand události. Tyto produkty pak mohou být vázány na ovládací prvek BulletedList (který jsme ještě nepřidali) ItemTemplate. Vše, co zbývá, je přidat BulletedList, odkazovat na něj v ItemCommand obslužné rutině události a vytvořit vazbu k sadě produktů pro vybranou kategorii, kterou budeme řešit v kroku 4.
Poznámka:
Obslužné rutině události DataList je předán objekt typu ItemCommand, který nabízí stejné čtyři vlastnosti jako třída DataListCommandEventArgs.
Krok 4: Zobrazení produktů vybrané kategorie v seznamu s odrážkami
Vybrané produkty kategorií lze zobrazit v rámci Repeater s ItemTemplate pomocí libovolného počtu ovládacích prvků. Mohli bychom přidat další vnořený Repeater, DataList, DropDownList, GridView atd. Vzhledem k tomu, že chceme produkty zobrazit jako seznam s odrážkami, použijeme ovládací prvek typu BulletedList. Vraťte se na deklarativní kód stránky CustomButtons.aspx a přidejte ovládací prvek ItemTemplate BulletedList za Show Products LinkButton. Nastavte bulletedLists s ID na ProductsInCategory. BulletedList zobrazí hodnotu datového pole určeného prostřednictvím vlastnosti DataTextField. Protože tento ovládací prvek bude mít vázané informace o produktu, nastavte vlastnost DataTextField na ProductName.
<asp:BulletedList ID="ProductsInCategory" DataTextField="ProductName"
runat="server"></asp:BulletedList>
V obslužné rutině události ItemCommand odkažte pomocí e.Item.FindControl("ProductsInCategory") na tento ovládací prvek a připojte ho k sadě produktů přidružených k vybrané kategorii.
Protected Sub Categories_ItemCommand _
(source As Object, e As RepeaterCommandEventArgs) _
Handles Categories.ItemCommand
If e.CommandName = "ShowProducts" Then
' Determine the CategoryID
Dim categoryID As Integer = Convert.ToInt32(e.CommandArgument)
' Get the associated products from the ProudctsBLL and
' bind them to the BulletedList
Dim products As BulletedList = _
CType(e.Item.FindControl("ProductsInCategory"), BulletedList)
Dim productsAPI As New ProductsBLL()
products.DataSource = productsAPI.GetProductsByCategoryID(categoryID)
products.DataBind()
End If
End Sub
Před tím, než provedete jakoukoli akci v obslužné rutině události ItemCommand, je rozumné nejprve zkontrolovat hodnotu příchozí položky CommandName. Vzhledem k tomu, že obslužná ItemCommand rutina události se aktivuje při kliknutí na libovolné tlačítko, pokud je v šabloně více tlačítek, použijte CommandName hodnotu k rozlišení toho, jakou akci provést. Kontrola CommandName zde je sice nepodstatná, protože máme pouze jediné tlačítko, ale je dobré si vytvořit tento návyk. Dále se vlastnost CategoryID vybrané kategorie načte z CommandArgument. Ovládací prvek BulletedList v šabloně je následně odkazován a vázán na výsledky ProductsBLL metody třídy s GetProductsByCategoryID(categoryID) .
V předchozích kurzech, které používaly tlačítka v rámci DataListu, jako je například Přehled úpravy a mazání dat v DataListu, jsme určili hodnotu primárního klíče dané položky prostřednictvím kolekce DataKeys. I když tento přístup funguje dobře s DataList, Repeater nemá DataKeys vlastnost. Místo toho musíme použít alternativní přístup k zadání hodnoty primárního klíče, například prostřednictvím vlastnosti tlačítka CommandArgument nebo přiřazením hodnoty primárního klíče ke skrytému ovládacímu prvku Label Web v šabloně a čtením jeho hodnoty zpět v obslužné rutině ItemCommand události pomocí e.Item.FindControl("LabelID").
Po dokončení obslužné ItemCommand rutiny události si chvíli otestujte stránku v prohlížeči. Jak ukazuje obrázek 7, kliknutí na odkaz Zobrazit produkty způsobí zpětné odeslání a zobrazí produkty pro vybranou kategorii v bulletedListu. Kromě toho mějte na paměti, že tyto informace o produktu zůstávají, i když jsou kliknuty na jiné kategorie Zobrazit odkazy na produkty.
Poznámka:
Chcete-li upravit chování této sestavy tak, aby byly najednou uvedeny produkty pouze jedné kategorie, jednoduše nastavte vlastnost ovládacího prvku EnableViewState BulletedList na False.
Obrázek 7: Seznam s odrážkami slouží k zobrazení produktů vybrané kategorie (kliknutím zobrazíte obrázek v plné velikosti).
Shrnutí
Ovládací prvky DataList a Repeater můžou obsahovat libovolný počet tlačítek, tlačítek LinkButtons nebo ImageButtons v rámci svých šablon. Taková tlačítka po kliknutí způsobí obnovu stránky a vyvolají ItemCommand událost. Pokud chcete přidružit vlastní akci na straně serveru ke kliknutí na tlačítko, vytvořte pro událost obslužnou rutinu ItemCommand. V této obslužné rutině události nejprve zkontrolujte příchozí CommandName hodnotu, abyste určili, na které tlačítko bylo kliknuto. Další informace lze volitelně zadat prostřednictvím vlastnosti tlačítka CommandArgument .
Šťastné programování!
O autorovi
Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams: Nauč se ASP.NET 2.0 za 24 hodin. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .
Zvláštní díky
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavním recenzentem tohoto návodu byl Dennis Patterson. Chcete si projít nadcházející články MSDN? Pokud ano, napište mi zprávu na mitchell@4GuysFromRolla.com.