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 se podíváme na to, jak přizpůsobit rozhraní upravitelného objektu GridView nahrazením standardních ovládacích prvků TextBox a CheckBox alternativními vstupními webovými ovládacími prvky.
Úvod
Ovládací prvky BoundFields a CheckBoxFields používané v rámci GridView a DetailsView zjednodušují proces úprav dat díky schopnosti vykreslovat rozhraní, která jsou jen pro čtení, editovatelná a vložitelná. Tato rozhraní je možné vykreslit bez nutnosti přidávat jakékoli další deklarativní značky nebo kód. Rozhraní BoundField a CheckBoxField však nemají v reálných scénářích často potřebnou přizpůsobitelnost. Aby bylo možné přizpůsobit upravitelné nebo vložitelné rozhraní v GridView nebo DetailsView, musíme místo toho použít TemplateField.
V předchozím kurzu jsme viděli, jak přizpůsobit rozhraní pro úpravy dat přidáním ověřovacích webových ovládacích prvků. V tomto kurzu se podíváme na to, jak přizpůsobit existující webové ovládací prvky pro shromažďování dat, přičemž standardní ovládací prvky BoundField a CheckBoxField nahradíme alternativními webovými ovládacími prvky pro vstupní data. Konkrétně vytvoříme upravitelný Objekt GridView, který umožňuje aktualizaci názvu, kategorie, dodavatele a ukončeného stavu produktu. Při úpravě konkrétního řádku se pole kategorií a dodavatelů zobrazí jako rozevírací seznamy obsahující sadu dostupných kategorií a dodavatelů, ze kterých si můžete vybrat. Kromě toho nahradíme výchozí zaškrtávací políčko prvku CheckBoxField ovládacím prvkem RadioButtonList, který nabízí dvě možnosti: "Aktivní" a "Ukončeno".
Obrázek 1: Rozhraní pro úpravy objektu GridView obsahuje rozevírací seznamy a přepínače (kliknutím zobrazíte obrázek v plné velikosti).
Krok 1: Vytvoření vhodnéhoUpdateProductpřetížení
V tomto kurzu vytvoříme upravitelný Objekt GridView, který umožňuje úpravy názvu, kategorie, dodavatele a ukončeného stavu produktu. Proto potřebujeme UpdateProduct přetížení, které přijímá pět vstupních parametrů, a to hodnoty těchto čtyř produktů plus ProductID. Stejně jako v předchozích přetíženích bude toto:
- Načti informace o produktu z databáze pro zadaný
ProductID. - Aktualizujte pole
ProductName,CategoryID,SupplierIDaDiscontinued - Odešlete požadavek na aktualizaci k DAL prostřednictvím metody TableAdapteru
Update().
Pro stručnost jsme pro toto konkrétní přetížení vynechali kontrolu obchodního pravidla, která zajišťuje, že produkt označený jako ukončený není jediným produktem nabízeným jeho dodavatelem. Můžete ho přidat, pokud chcete, nebo v ideálním případě refaktorovat logiku na samostatnou metodu.
Následující kód ukazuje nové UpdateProduct přetížení ve ProductsBLL třídě:
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, int? categoryID,
int? supplierID, bool discontinued, int productID)
{
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
if (products.Count == 0)
// no matching record found, return false
return false;
Northwind.ProductsRow product = products[0];
product.ProductName = productName;
if (supplierID == null) product.SetSupplierIDNull();
else product.SupplierID = supplierID.Value;
if (categoryID == null) product.SetCategoryIDNull();
else product.CategoryID = categoryID.Value;
product.Discontinued = discontinued;
// Update the product record
int rowsAffected = Adapter.Update(product);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
Krok 2: Vytvoření upravitelného objektu GridView
S přidaným UpdateProduct přetížením jsme připraveni vytvořit upravitelné GridView.
CustomizedUI.aspx Otevřete stránku ve EditInsertDelete složce a přidejte do Návrháře ovládací prvek GridView. Dále vytvořte nový ObjectDataSource z inteligentní značky GridView. Nakonfigurujte ObjectDataSource tak, aby načítal informace o produktu metodou ProductBLL třídy GetProducts() a aktualizoval data produktu pomocí právě vytvořeného přetížení UpdateProduct. Na kartách INSERT a DELETE vyberte v rozevíracích seznamech možnost (Žádné).
Obrázek 2: Konfigurace ObjectDataSource pro použití právě vytvořené přetížení UpdateProduct (kliknutím zobrazíte obrázek s plnou velikostí)
Jak jsme viděli ve výukových lekcích úpravy dat, deklarativní syntaxe pro ObjectDataSource vytvořené Visual Studiem přiřadí OldValuesParameterFormatString vlastnost original_{0}. To samozřejmě nebude fungovat s naší vrstvou obchodní logiky, protože naše metody neočekávají předání původní ProductID hodnoty. Proto, jak jsme to udělali v předchozích kurzech, si udělejte čas na odebrání přiřazení této vlastnosti z deklarativní syntaxy, či místo toho nastavte tuto vlastnost na {0}.
Po této změně by deklarativní kód ObjectDataSource měl vypadat takto:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL"
UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="categoryID" Type="Int32" />
<asp:Parameter Name="supplierID" Type="Int32" />
<asp:Parameter Name="discontinued" Type="Boolean" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Všimněte si, že OldValuesParameterFormatString vlastnost byla odebrána a že v kolekci UpdateParameters je Parameter pro každý vstupní parametr očekávaný naším přetížením UpdateProduct.
I když je ObjektDataSource nakonfigurovaný tak, aby aktualizoval pouze podmnožinu hodnot produktu, GridView aktuálně zobrazuje všechna pole produktu. Upravte GridView tak, aby:
- Zahrnuje pouze
ProductName,SupplierName,CategoryNameBoundFields aDiscontinuedCheckBoxField. - Pole
CategoryNameaSupplierName, která se mají zobrazit před (vlevo od)DiscontinuedCheckBoxField - Vlastnosti
CategoryNameaSupplierNameBoundFields mají nastaveno na "Category" a "Supplier", v uvedeném pořadí. - Podpora úprav je povolená (zaškrtněte políčko Povolit úpravy v inteligentní značce GridView).
Po těchto změnách bude Návrhář vypadat podobně jako na obrázku 3 s deklarativní syntaxí GridView zobrazenou níže.
Obrázek 3: Odebrání nepotřebných polí z objektu GridView (kliknutím zobrazíte obrázek v plné velikosti)
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
<Columns>
<asp:BoundField DataField="ProductName"
HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True"
SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="Supplier"
ReadOnly="True"
SortExpression="SupplierName" />
<asp:CheckBoxField DataField="Discontinued"
HeaderText="Discontinued" SortExpression="Discontinued" />
</Columns>
</asp:GridView>
V tomto okamžiku je chování GridView jen pro čtení dokončeno. Při prohlížení dat se každý produkt zobrazí jako řádek v Objektu GridView, který zobrazuje název produktu, kategorii, dodavatele a ukončený stav.
Obrázek 4: Rozhraní GridView jen pro čtení je dokončeno (kliknutím zobrazíte obrázek s plnou velikostí)
Poznámka:
Jak je popsáno v kurzu Vložení, aktualizace a odstranění dat, je důležité, aby byl stav zobrazení GridView povolen (výchozí chování). Pokud nastavíte vlastnost EnableViewState GridView na false, riskujete, že souběžní uživatelé neúmyslně odstraní nebo upraví záznamy.
Krok 3: Použití rozevíracího seznamu pro rozhraní pro úpravy kategorií a dodavatelů
Vzpomeňte si, že ProductsRow objekt obsahuje CategoryID, CategoryName, SupplierIDa SupplierName vlastnosti, které poskytují skutečné hodnoty ID cizího klíče v Products tabulce databáze a odpovídající Name hodnoty v Categories tabulkách a Suppliers tabulkách.
ProductRow's CategoryID a SupplierID lze do nich číst i zapisovat, zatímco vlastnosti CategoryName a SupplierName jsou označeny jako pouze pro čtení.
Vzhledem k tomu, že vlastnosti CategoryName a SupplierName jsou ve stavu pouze pro čtení, mají odpovídající BoundFields nastavenou vlastnost ReadOnly na true, což brání úpravě těchto hodnot při editaci řádku. I když můžeme nastavit vlastnost ReadOnly na false, takže se během úprav vykreslí CategoryName a SupplierName jako textová pole, takový přístup způsobí výjimku, když se uživatel pokusí aktualizovat produkt, protože neexistuje přetížení UpdateProduct, které by přijalo vstupy CategoryName a SupplierName. Ve skutečnosti nechceme vytvořit takové přetížení ze dvou důvodů:
- Tabulka
ProductsneobsahujeSupplierNameaniCategoryNamepole, aleSupplierIDaCategoryID. Proto chceme, aby byla naše metoda předána těmto konkrétním hodnotám ID, nikoli jejich hodnot vyhledávacích tabulek. - Vyžadování, aby uživatel zadal název dodavatele nebo kategorie, je menší než ideální, protože vyžaduje, aby uživatel znal dostupné kategorie a dodavatele a jejich správné pravopisy.
Pole dodavatelů a kategorií by měla zobrazovat názvy kategorií a dodavatelů v režimu jen pro čtení (stejně jako teď) a rozevírací seznam použitelných možností při úpravách. Pomocí rozevíracího seznamu může koncový uživatel rychle zjistit, jaké kategorie a dodavatelé si můžou vybrat a snadněji vybrat.
Abychom toto chování poskytli, musíme převést pole BoundFields SupplierName a CategoryName na TemplateFields. V rámci těchto TemplateFields pak ItemTemplate generuje hodnoty SupplierName a CategoryName, zatímco pomocí ovládacího prvku DropDownList v EditItemTemplate jsou uvedeny dostupné kategorie a dodavatelé.
CategoriesPřidání rozevíracích seznamůSuppliers
Začněte převodem polí SupplierName a CategoryName BoundFields na TemplateFields kliknutím na odkaz Upravit sloupce z inteligentní značky GridView, výběrem BoundField ze seznamu vlevo dole a kliknutím na odkaz Převést toto pole na TemplateField. Proces převodu vytvoří TemplateField s ItemTemplate a EditItemTemplate, jak je znázorněno v deklarativní syntaxi níže:
<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Eval("CategoryName") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("CategoryName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Vzhledem k tomu, že BoundField byl označen jako jen pro čtení, obsahují jak ItemTemplate, tak EditItemTemplate ovládací prvek Label Web, jehož Text vlastnost je vázána k příslušnému datovému poli (CategoryName, ve výše uvedené syntaxi). Potřebujeme upravit EditItemTemplate tím, že nahradíme webový ovládací prvek Label ovládacím prvkem DropDownList.
Jak jsme viděli v předchozích kurzech, můžete šablonu upravit pomocí Návrháře nebo přímo z deklarativní syntaxe. Chcete-li to upravit pomocí Návrháře, klikněte na odkaz Upravit šablony u smart tagu GridView a vyberte si práci s polem EditItemTemplateKategorie. Odeberte ovládací prvek Label Web a nahraďte ho ovládacím prvkem DropDownList a nastavte vlastnost ID rozevíracího seznamu na hodnotu Categories.
Obrázek 5: Odstraňte TextBox a přidejte rozevírací seznam do EditItemTemplate (Kliknutím zobrazit obrázek v plné velikosti)
Dále musíme rozevírací seznam naplnit dostupnými kategoriemi. Klikněte na odkaz Zvolit zdroj dat z inteligentní značky DropDownList a zvolte možnost vytvořit nový ObjectDataSource s názvem CategoriesDataSource.
Obrázek 6: Vytvoření nového ovládacího prvku ObjectDataSource s názvem CategoriesDataSource (kliknutím zobrazíte obrázek v plné velikosti)
Chcete-li tento ObjectDataSource vrátit všechny kategorie, vytvořte vazbu na metodu CategoriesBLLGetCategories() třídy.
Obrázek 7: Vytvoření vazby ObjectDataSource k CategoriesBLLmetodě 's GetCategories() (Kliknutím zobrazíte obrázek s plnou velikostí)
Nakonec nakonfigurujte nastavení rozevíracího seznamu tak, aby se pole CategoryName zobrazovalo v každém rozevíracím seznamu ListItem s polem CategoryID použitým jako hodnota.
Obrázek 8: Zobrazí se CategoryName pole a CategoryID použije se jako hodnota (kliknutím zobrazíte obrázek v plné velikosti).
Po provedení těchto změn deklarativní kód pro EditItemTemplate pole CategoryName TemplateField bude obsahovat dropDownList i ObjectDataSource:
<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
<EditItemTemplate>
<asp:DropDownList ID="Categories" runat="server"
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName" DataValueField="CategoryID">
</asp:DropDownList>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("CategoryName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Poznámka:
Rozevírací seznam v EditItemTemplate musí mít povolený stav zobrazení. Brzy přidáme syntaxi vázání dat do deklarativní syntaxe DropDownListu a příkazy pro vázání dat jako Eval() a Bind() se mohou zobrazit pouze v ovládacích prvcích, které mají povolený stav zobrazení.
Opakujte tyto kroky a přidejte rozbalovací seznam pojmenovaný Suppliers do Pole šablony SupplierNameEditItemTemplate. To bude zahrnovat přidání DropDownList do EditItemTemplate a vytvoření další ObjectDataSource. ObjektDataSource prvku Suppliers DropDownList by však měl být nakonfigurován tak, aby volal metodu GetSuppliers() třídy SuppliersBLL. Kromě toho nakonfigurujte Suppliers DropDownList tak, aby zobrazoval pole CompanyName a použil pole SupplierID jako hodnotu pro své ListItem.
Po přidání rozevíracích seznamů do těchto dvou EditItemTemplate s načtěte stránku v prohlížeči a klikněte na tlačítko Upravit pro produkt Chef Anton's Cajun Seasoning. Jak ukazuje obrázek 9, sloupce kategorií produktů a dodavatelů se vykreslují jako rozevírací seznamy obsahující dostupné kategorie a dodavatele, ze kterých si můžete vybrat. Všimněte si však, že první položky v obou rozevíracích seznamech jsou ve výchozím nastavení vybrány (Nápoje jako kategorie a Exotic Liquids jako dodavatel), i když Chef Anton's Cajun Seasoning je koření dodávané společností New Orleans Cajun Delights.
Obrázek 9: Ve výchozím nastavení je vybrána první položka v rozevíracích seznamech (kliknutím zobrazíte obrázek v plné velikosti).
Pokud kliknete na tlačítko Aktualizovat, zjistíte, že hodnoty produktu CategoryID a SupplierID jsou nastaveny na NULL. Obě tato nežádoucí chování jsou způsobena tím, že rozevírací seznamy v sadách EditItemTemplate nejsou vázány na žádná datová pole z podkladových dat produktu.
Vytvoření vazby rozevíracích seznamů naCategoryIDaSupplierIDdatová pole
Aby byla upravená kategorie produktu a rozevírací seznamy dodavatelů nastaveny na příslušné hodnoty a aby se tyto hodnoty po kliknutí na tlačítko Update odeslaly zpět do metody BLL UpdateProduct , musíme svázat vlastnosti DropDownLists SelectedValue s CategoryIDSupplierID datovými poli pomocí obousměrné vazby dat. Chcete-li toho dosáhnout pomocí rozevíracího Categories seznamu, můžete přidat SelectedValue='<%# Bind("CategoryID") %>' přímo do deklarativní syntaxe.
Alternativně můžete nastavit datové vazby DropDownListu úpravou šablony prostřednictvím Návrháře a kliknutím na odkaz Upravit datové vazby ze smart tagu DropDownListu. Dále uveďte, že SelectedValue vlastnost by měla být svázaná s CategoryID polem pomocí obousměrné vazby dat (viz obrázek 10). Opakujte buď deklarativní proces, nebo proces Designeru, abyste vytvořili vazbu pole dat SupplierID na rozevírací seznam Suppliers.
Obrázek 10: Vytvoření vazby CategoryID na vlastnost DropDownList SelectedValue pomocí obousměrné vazby dat (kliknutím zobrazíte obrázek s plnou velikostí)
Jakmile budou vazby použity na SelectedValue vlastnosti dvou rozevíracích seznamů, upravená kategorie produktu a sloupce dodavatelů se ve výchozím nastavení nastaví na hodnoty aktuálního produktu. Po kliknutí na Tlačítko Aktualizovat CategoryID a SupplierID hodnoty vybrané položky rozevíracího seznamu budou předány metodě UpdateProduct . Obrázek 11 ukazuje kurz po přidání příkazů pro vazbu dat; všimněte si, že vybrané položky rozevíracího seznamu pro Chef Anton's Cajun Seasoning jsou správně Koření a New Orleans Cajun Delights.
Obrázek 11: Ve výchozím nastavení jsou vybrané hodnoty aktuální kategorie a dodavatele upraveného produktu (kliknutím zobrazíte obrázek v plné velikosti).
ZpracováníNULLhodnot
Sloupce CategoryID a SupplierID v Products tabulce mohou být NULL, ale DropDownLists v EditItemTemplate neobsahují položku seznamu představující hodnotu NULL. To má dva důsledky:
- Uživatel nemůže použít naše rozhraní ke změně kategorie nebo dodavatele produktu z hodnoty, která není
NULL, na hodnotuNULL. - Pokud má nějaký produkt
NULLCategoryIDneboSupplierID, kliknutím na tlačítko Upravit dojde k výjimce. Důvodem je to, žeNULLhodnota vrácenáCategoryID(neboSupplierID) vBind()příkazu nemapuje na hodnotu v rozevíracím seznamu (DropDownList vyvolá výjimku, pokud je jehoSelectedValuevlastnost nastavena na hodnotu , která není v jeho kolekci položek seznamu).
Abychom mohli podporovat NULLCategoryID a SupplierID hodnoty, musíme do každého rozevíracího seznamu přidat další ListItem k reprezentaci NULL hodnoty.
V kurzu Master/Detail Filtering With a DropDownList jsme viděli, jak přidat další ListItem do databound DropDownListu, což zahrnovalo nastavení vlastnosti DropDownListu AppendDataBoundItems na true a ruční přidání ListItem. V tomto předchozím kurzu jsme však přidali ListItem s Value-1. Logika vazby dat v ASP.NET ale automaticky převede prázdný řetězec na NULL hodnotu a naopak. Proto chceme, aby ListItem's Value byl v tomto kurzu prázdný řetězec.
Začněte tím, že nastavíte vlastnost DropDownLists na hodnotu AppendDataBoundItemstrue. Dále přidejte NULLListItem přidáním následujícího prvku <asp:ListItem> do každého prvku DropDownList tak, aby deklarativní značení vypadalo takto:
<asp:DropDownList ID="Categories" runat="server"
DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
AppendDataBoundItems="True">
<asp:ListItem Value="">(None)</asp:ListItem>
</asp:DropDownList>
Rozhodl jsem se jako textovou hodnotu ListItempoužít "(None)", ale pokud chcete, můžete ji změnit tak, aby byla také prázdným řetězcem.
Poznámka:
Jak jsme viděli v tutoriálu Master/Detail Filtering With a DropDownList, s mohou být přidány do DropDownList pomocí Návrháře kliknutím na vlastnost DropDownList v okně Vlastností (které zobrazí ListItem Editor kolekcí). Nezapomeňte však přidat NULLListItem pro tento kurz pomocí deklarativní syntaxí. Pokud použijete ListItem Editor kolekcí, vygenerovaná deklarativní syntaxe úplně vynechá nastavení Value při přiřazení prázdného řetězce, což vytvoří deklarativní značku jako: <asp:ListItem>(None)</asp:ListItem>. I když to může vypadat neškodně, chybějící Hodnota způsobí, že DropDownList použije Text hodnotu vlastnosti na svém místě. To znamená, že pokud je tato NULLListItem možnost vybrána, hodnota "(None)" se pokusí přiřadit k objektu CategoryID, což způsobí výjimku. Explicitním nastavením Value="" bude hodnota NULL přiřazena CategoryID, když je vybrán NULLListItem.
Opakujte tento postup pro rozevírací seznam dodavatelů.
Pomocí tohoto dalšího ListItem může rozhraní pro úpravy nyní přiřadit NULL hodnoty k polím produktu CategoryID a SupplierID, jak je znázorněno na obrázku 12.
Obrázek 12: Zvolte (Žádné) a přiřaďte NULL hodnotu pro kategorii nebo dodavatele produktu (kliknutím zobrazíte obrázek v plné velikosti).
Krok 4: Použití přepínačů pro neaktivní stav
V současné době se datové pole produktů Discontinued vyjadřuje pomocí CheckBoxField, které vykreslí zakázané zaškrtávací políčko pro řádky jen pro čtení a povolené zaškrtávací políčko pro upravovaný řádek. I když je toto uživatelské rozhraní často vhodné, můžeme ho v případě potřeby přizpůsobit pomocí TemplateField. Pro účely tohoto kurzu změníme CheckBoxField na TemplateField, který používá ovládací prvek RadioButtonList se dvěma možnostmi "Aktivní" a "Ukončeno", ze kterých může uživatel zadat hodnotu produktu Discontinued .
Začněte převodem Discontinued CheckBoxField na TemplateField, což vytvoří TemplateField obsahující ItemTemplate a EditItemTemplate. Obě šablony zahrnují prvek CheckBox s vlastností Checked svázanou s datovým polem Discontinued. Jediným rozdílem mezi nimi je, že vlastnost Enabled u prvek ItemTemplate CheckBox je nastavena na false.
Nahraďte CheckBox v obou ovládacích prvcích ItemTemplate a EditItemTemplate ovládacím prvkem RadioButtonList a nastavte vlastnosti obou RadioButtonListů ID na DiscontinuedChoice. Dále uveďte, že radioButtonLists by měly obsahovat dvě přepínače, jedna označená jako "Aktivní" s hodnotou "False" a jedna označená jako "Ukončeno" s hodnotou "True". K tomu můžete buď zadat elementy <asp:ListItem> přímo prostřednictvím deklarativní syntaxe, nebo použít ListItem Editor kolekcí z Návrháře. Obrázek 13 zobrazuje ListItem Editor kolekcí poté, co byly zadány dvě možnosti rádiových tlačítek.
Obrázek 13: Přidání možností Aktivní a Ukončeno do přepínače RadioButtonList (kliknutím zobrazíte obrázek s plnou velikostí)
Vzhledem k tomu, že RadioButtonList v ItemTemplate neměl by být upravitelný, nastavte jeho Enabled vlastnost na false, ponechte jeho vlastnost Enabled na true (výchozí) pro RadioButtonList v EditItemTemplate. Tím se přepínače v neupraveném řádku nastaví jako jen pro čtení, ale umožní uživateli změnit hodnoty RadioButton pro upravený řádek.
Stále musíme nastavit vlastnosti ovládacích prvků SelectedValue RadioButtonList, aby byl vybrán příslušný přepínač na základě pole Discontinued dat produktu. Stejně jako u rozevíracích seznamů, které jsme prozkoumali dříve v tomto kurzu, lze tuto syntaxi datových vazeb přidat buď přímo do deklarativního kódu, nebo prostřednictvím odkazu Edit DataBindings v inteligentních značkách RadioButtonLists.
Po přidání dvou prvků RadioButtonList a jejich konfiguraci by deklarativní kód TemplateField měl vypadat takto:
<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
<ItemTemplate>
<asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
Enabled="False" SelectedValue='<%# Bind("Discontinued") %>'>
<asp:ListItem Value="False">Active</asp:ListItem>
<asp:ListItem Value="True">Discontinued</asp:ListItem>
</asp:RadioButtonList>
</ItemTemplate>
<EditItemTemplate>
<asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
SelectedValue='<%# Bind("Discontinued") %>'>
<asp:ListItem Value="False">Active</asp:ListItem>
<asp:ListItem Value="True">Discontinued</asp:ListItem>
</asp:RadioButtonList>
</EditItemTemplate>
</asp:TemplateField>
Při těchto změnách Discontinued byl sloupec transformován ze seznamu zaškrtávacích políček na seznam dvojic přepínačů (viz obrázek 14). Při úpravě produktu je vybrán příslušný přepínač a stav ukončení produktu lze aktualizovat výběrem druhého přepínače a kliknutím na tlačítko Aktualizovat.
Obrázek 14: Ukončená zaškrtávací políčka byla nahrazena dvojicemi přepínačů (kliknutím zobrazíte obrázek v plné velikosti).
Poznámka:
Discontinued Vzhledem k tomu, že sloupec v Products databázi nemůže obsahovat NULL hodnoty, nemusíme se starat o zachycení NULL informací v rozhraní. Pokud by ale sloupec mohl obsahovat Discontinued hodnoty, NULL chtěli bychom do seznamu přidat třetí přepínač s nastaveným Value prázdným řetězcem (Value=""stejně jako u kategorií a rozevíracích seznamů dodavatelů).
Shrnutí
I když BoundField a CheckBoxField automaticky vykreslují rozhraní jen pro čtení, úpravy a vkládání, nemají možnost přizpůsobení. Často ale budeme muset upravit nebo vložit rozhraní, například přidat ověřovací ovládací prvky (jak jsme viděli v předchozím kurzu) nebo přizpůsobit uživatelské rozhraní pro shromažďování dat (jak jsme viděli v tomto kurzu). Přizpůsobení rozhraní pomocí TemplateField lze sečíst v následujících krocích:
- Přidejte TemplateField nebo převeďte existující BoundField či CheckBoxField na TemplateField
- Podle potřeby rozšiřte rozhraní.
- Vytvoření vazby příslušných datových polí k nově přidaným webovým ovládacím prvkům pomocí obousměrné vazby dat
Kromě použití předdefinovaných webových ovládacích prvků ASP.NET můžete také přizpůsobit šablony pole TemplateField vlastními, kompilovanými ovládacími prvky serveru a uživatelskými ovládacími prvky.
Šť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 Teach Yourself ASP.NET 2.0 za 24 hodin. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .