Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
Ebben az oktatóanyagban példákat mutatunk be arra, hogyan formázzuk a DataList és az Repeater vezérlők megjelenését a sablonok formázási függvényeivel vagy a DataBound-esemény kezelésével.
Bevezetés
Ahogy az előző oktatóanyagban láttuk, a DataList számos stílussal kapcsolatos tulajdonságot kínál, amelyek befolyásolják a megjelenését. Különösen azt láttuk, hogyan rendelhet alapértelmezett CSS-osztályokat a DataList s HeaderStyle
, ItemStyle
, , AlternatingItemStyle
és SelectedItemStyle
tulajdonságokhoz. A négy tulajdonság mellett a DataList számos más stílussal kapcsolatos tulajdonságot is tartalmaz, például Font
ForeColor
BackColor
, , és BorderWidth
, hogy néhányat említsünk. Az Ismétlő vezérlőelem stílussal kapcsolatos tulajdonságokat nem tartalmaz. Az ilyen stílusbeállításokat közvetlenül az Repeater-sablonok korrektúrán belül kell megadni.
Az adatok formázásának menete azonban gyakran magától az adatoktól függ. A termékek felsorolásakor például előfordulhat, hogy a termékinformációkat világosszürke betűszínben szeretnénk megjeleníteni, ha az már megszűnt, vagy ha nulla, akkor érdemes kiemelni az UnitsInStock
értéket. Ahogy az előző oktatóanyagokban láttuk, a GridView, a DetailsView és a FormView kétféle módon formázhatja a megjelenésüket az adataik alapján:
-
Az
DataBound
esemény létrehoz egy eseménykezelőt a megfelelőDataBound
eseményhez, amely az adatok minden elemhez való kötése után aktiválódik (a GridView esetében ez volt azRowDataBound
esemény; a DataList és az Repeater esetében ez azItemDataBound
esemény). Ebben az eseménykezelőben az éppen kötött adatok megvizsgálhatók, és formázási döntéseket hozhatnak. Ezt a technikát az Egyéni formázás adatok alapján oktatóanyagban vizsgáltuk meg. - Formázási függvények a sablonokban , amikor a DetailsView vagy a GridView vezérlők TemplateFields elemét, illetve a FormView vezérlőben lévő sablont használják, formázási függvényt adhatunk hozzá a ASP.NET lap kód mögötti osztályához, az Üzleti logikai réteghez vagy bármely más, a webalkalmazásból elérhető osztálytárhoz. Ez a formázási függvény tetszőleges számú bemeneti paramétert elfogadhat, de vissza kell adnia a HTML-t a sablonban való megjelenítéshez. A formázási függvényeket először a GridView vezérlő sablonmezők használata című oktatóanyagban vizsgáltuk meg.
Mindkét formázási technika elérhető a DataList és az Repeater vezérlőkkel. Ebben az oktatóanyagban példákat mutatunk be, amelyek mindkét vezérlőhöz mindkét technikát használják.
AzItemDataBound
Eseménykezelő használata
Ha az adatok adatlistához vannak kötve, akár adatforrás-vezérlőből, akár a vezérlő DataSource
tulajdonságához programozott módon hozzárendelt adatokkal, és meghívják annak metódusát DataBind()
, a DataList DataBinding
eseménye kigyullad, az adatforrás enumerálódik, és minden adatrekord a DataListhez van kötve. Az adatforrás minden rekordja esetében a DataList létrehoz egy DataListItem
objektumot, amely ezután az aktuális rekordhoz van kötve. A folyamat során a DataList két eseményt vet fel:
-
ItemCreated
a létrehozás utánDataListItem
aktiválódik -
ItemDataBound
akkor aktiválódik, miután az aktuális rekordot hozzákapcsolták aDataListItem
-hez.
Az alábbi lépések a DataList-vezérlő adatkötési folyamatát ismertetik.
A DataList
DataBinding
eseménye aktiválódikAz adatok a DataListhez kötődnek
Az adatforrás minden rekordja esetében
-
DataListItem
Objektum létrehozása - Az esemény kilövése
ItemCreated
- A rekordot kötni a
DataListItem
-hoz - Az esemény kilövése
ItemDataBound
- Adja hozzá a
DataListItem
-t aItems
gyűjteményhez
-
Amikor adatokat köt az Repeater vezérlőhöz, az pontosan ugyanazon lépéssorozaton halad végig. Az egyetlen különbség az, hogy DataListItem
példányok létrehozása helyett a Repeater RepeaterItem
-eket használ.
Megjegyzés:
A ravasz olvasó némi anomáliát észlelhetett a lépések sorozata között, amelyek akkor következnek be, amikor a DataList és a Repeater adathoz van kötve, szemben azzal, ha a GridView adathoz van kötve. Az adatkötési folyamat végén a GridView létrehoz egy DataBound
eseményt, azonban sem a DataList, sem az Repeater vezérlő nem rendelkezik ilyen eseménysel. Ennek az az oka, hogy a DataList és az Repeater vezérlők az ASP.NET 1.x időkeretben lettek létrehozva, mielőtt az eseménykezelő minta általánossá vált volna.
A GridView-hoz hasonlóan az adatokon alapuló formázás egyik lehetősége egy eseménykezelő létrehozása az ItemDataBound
eseményhez. Ez az eseménykezelő megvizsgálná azokat az adatokat, amelyek éppen a DataListItem
vagy a RepeaterItem
vezérlőhöz voltak kötve, és szükség szerint befolyásolná a vezérlő formázását.
Az Adatlista vezérlőelem esetében a teljes elem formázásának módosításai a stílushoz kapcsolódó tulajdonságok, mint a DataListItem
, Font
, ForeColor
, BackColor
, CssClass
stb., használatával implementálhatók. Ahhoz, hogy befolyásolhassuk a DataList-sablon egyes webes vezérlőinek formázását, programozott módon kell elérnünk és módosítani a webvezérlők stílusát. Láthattuk, hogyan érhetjük el ezt az Egyéni formázás adatok alapján oktatóanyagban. Az Repeater vezérlőhöz hasonlóan az RepeaterItem
osztálynak sincsenek stílushoz kapcsolódó tulajdonságai; ezért az RepeaterItem
eseménykezelőben végrehajtott összes stílusmódosítást programozott módon, a sablonon belüli webes vezérlők elérésével és frissítésével kell végezni ItemDataBound
segítségével.
Mivel a ItemDataBound
DataList és az Repeater formázási technikája gyakorlatilag azonos, a példánk a DataList használatára összpontosít.
1. lépés: Termékadatok megjelenítése a DataListben
Mielőtt aggódnánk a formázás miatt, először hozzunk létre egy oldalt, amely egy DataList használatával jeleníti meg a termékinformációkat. Az előző oktatóanyagban létrehoztunk egy DataListet, amely ItemTemplate
megjeleníti az egyes termékek nevét, kategóriáját, szállítóját, egységenkénti mennyiségét és árát. Ismételje meg ezt a funkciót ebben az oktatóanyagban. Ehhez létrehozhatja újra a DataListet és annak ObjectDataSource-t az alapoktól kezdve, vagy átmásolhatja ezeket a vezérlőket az előző oktatóanyagban () létrehozott lapról,Basics.aspx
és beillesztheti őket az oktatóanyag (Formatting.aspx
) lapjára.
Miután replikálta a DataList és az ObjectDataSource funkciót a Basics.aspx
-ből a Formatting.aspx
-be, szánjon egy kis időt, hogy a DataList tulajdonságát ID
DataList1
-ról egy leíróbb ItemDataBoundFormattingExample
-re módosítsa. Ezután tekintse meg a DataListet egy böngészőben. Ahogy az 1. ábrán látható, az egyetlen formázási különbség az egyes termékek között az, hogy a háttérszín váltakozik.
1. ábra: A termékek az Adatlista vezérlőelemben vannak felsorolva (kattintson ide a teljes méretű kép megtekintéséhez)
Ebben az oktatóanyagban formázzuk a DataList-et úgy, hogy a 20,00 usd-nél kisebb árú termékek neve és egységára is sárga színű legyen.
2. lépés: Az Adatok értékének programozott meghatározása az ItemDataBound eseménykezelőben
Mivel csak a 20,00 USD alatti árú termékekre vonatkozik az egyéni formázás, minden egyes termék árát meg kell határoznunk. Amikor adatokat köt egy DataListhez, a DataList felsorolja az adatforrás rekordjait, és minden rekordhoz létrehoz egy DataListItem
példányt, amelyre az adatforrásrekordot köti a DataListItem
. Miután az adott rekord adatai az aktuális DataListItem
objektumhoz lettek kötve, a DataList-esemény ItemDataBound
aktiválódik. Létrehozhatunk egy eseménykezelőt az eseményhez az aktuális DataListItem
adatértékek vizsgálatához, és ezen értékek alapján elvégezhetjük a szükséges formázási módosításokat.
Hozzon létre egy eseményt ItemDataBound
a DataListhez, és adja hozzá a következő kódot:
Protected Sub ItemDataBoundFormattingExample_ItemDataBound _
(sender As Object, e As DataListItemEventArgs) _
Handles ItemDataBoundFormattingExample.ItemDataBound
If e.Item.ItemType = ListItemType.Item OrElse _
e.Item.ItemType = ListItemType.AlternatingItem Then
' Programmatically reference the ProductsRow instance
' bound to this DataListItem
Dim product As Northwind.ProductsRow = _
CType(CType(e.Item.DataItem, System.Data.DataRowView).Row, _
Northwind.ProductsRow)
' See if the UnitPrice is not NULL and less than $20.00
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 20 Then
' TODO: Highlight the product's name and price
End If
End If
End Sub
Bár a DataList eseménykezelőjének koncepciója ItemDataBound
RowDataBound
és szemantikája megegyezik a GridView-eseménykezelő által az Egyéni formázás adatok alapján oktatóanyagban használtakkal, a szintaxis kissé eltér. Amikor az ItemDataBound
esemény bekövetkezik, az adatokhoz frissen kapcsolt DataListItem
a megfelelő eseménykezelőbe kerül továbbításra e.Item
útján (nem pedig e.Row
-val/vel, ahogy a GridView RowDataBound
eseménykezelője esetén). A DataList eseménykezelője ItemDataBound
minden, a DataListhez hozzáadott sorhoz aktiválódik, beleértve az élőfejsorokat, az élőlábsorokat és az elválasztó sorokat. A termékinformációk azonban csak az adatsorhoz kötöttek. Ezért amikor az eseményt a ItemDataBound
DataListhez kötött adatok vizsgálatára használja, először meg kell győződnünk arról, hogy egy adatelemen dolgozunk. Ez az DataListItem
s ItemType
tulajdonság ellenőrzésével érhető el, amely a következő nyolc érték egyikével rendelkezhet:
AlternatingItem
EditItem
Footer
Header
Item
Pager
SelectedItem
Separator
A DataList adat elemeit mindkettő, Item
és AlternatingItem``DataListItem
, alkotja. Feltéve, hogy egy Item
-val vagy AlternatingItem
-val dolgozunk, hozzáférünk az aktuális ProductsRow
-hoz kötött tényleges DataListItem
példányhoz. Az DataListItem
s DataItem
tulajdonság az objektumra DataRowView
mutató hivatkozást tartalmaz, amelynek Row
tulajdonsága a tényleges ProductsRow
objektumra mutató hivatkozást tartalmaz.
Ezután ellenőrizzük a példány ProductsRow
UnitPrice
tulajdonságát. Mivel a Termékek tábla s mezője UnitPrice
lehetővé teszi NULL
az értékeket, mielőtt megpróbálnánk elérni a UnitPrice
tulajdonságot, először ellenőriznünk kell, hogy van-e NULL
értéke a IsUnitPriceNull()
metódussal. Ha az UnitPrice
érték nem NULL
, akkor ellenőrizzük, hogy 20,00 dollárnál kisebb-e. Ha valóban 20,00 usd alatt van, akkor az egyéni formázást kell alkalmaznunk.
3. lépés: A termék nevének és árának kiemelése
Ha már tudjuk, hogy egy termék ára kevesebb, mint 20,00 usd, csak az marad, hogy kiemeljük a nevét és árát. Ehhez először programozott módon kell hivatkoznunk a címkevezérlőkre, ItemTemplate
amelyek a termék nevét és árát jelenítik meg. Következő lépésként sárga hátteret kell megjeleníteniük. Ez a formázási információ a Címkék BackColor
tulajdonságok (LabelID.BackColor = Color.Yellow
) közvetlen módosításával alkalmazható; ideális esetben azonban minden megjelenítéssel kapcsolatos dolgot kaszkádolt stíluslapokkal kell kifejezni. Valójában már rendelkezünk egy stíluslaplal, amely megadja a kívánt formázást Styles.css
- AffordablePriceEmphasis
, amelyet az Egyéni formázás az adatok alapján oktatóanyagban hozott létre és tárgyalt.
A formázás alkalmazásához egyszerűen állítsa be a két címke webvezérlő CssClass
tulajdonságát AffordablePriceEmphasis
a következő kódban látható módon.
' Highlight the product name and unit price Labels
' First, get a reference to the two Label Web controls
Dim ProductNameLabel As Label = CType(e.Item.FindControl("ProductNameLabel"), Label)
Dim UnitPriceLabel As Label = CType(e.Item.FindControl("UnitPriceLabel"), Label)
' Next, set their CssClass properties
If ProductNameLabel IsNot Nothing Then
ProductNameLabel.CssClass = "AffordablePriceEmphasis"
End If
If UnitPriceLabel IsNot Nothing Then
UnitPriceLabel.CssClass = "AffordablePriceEmphasis"
End If
Ha az ItemDataBound
eseménykezelő befejeződött, nyissa meg újra a Formatting.aspx
lapot egy böngészőben. A 2. ábrán látható, hogy azok a termékek, amelyek ára 20,00 USD alatt van, mind a nevük, mind az áruk kiemelve van.
2. ábra: A 20,00 usd-nél kisebb termékek kiemeltek (ide kattintva megtekintheti a teljes méretű képet)
Megjegyzés:
Mivel a DataList HTML-ként <table>
jelenik meg, a DataListItem
példányai stílushoz kapcsolódó tulajdonságokkal rendelkeznek, amelyek beállíthatók, hogy egy adott stílust alkalmazzanak a teljes elemre. Ha például a teljes tételt sárga színnel szeretnénk kiemelni, ha az ára 20,00 USD-nél kisebb volt, lecserélhettük volna a címkékre hivatkozó kódot, és a tulajdonságokat a következő kódsorra állíthattuk CssClass
volna be: e.Item.CssClass = "AffordablePriceEmphasis"
(lásd a 3. ábrát).
Az RepeaterItem
elemek, amelyek az Ismétlés vezérlőt alkotják, azonban nem rendelkeznek ilyen stílusszintű tulajdonságokkal. Ezért az egyéni formázás alkalmazása az Ismétlő esetén megköveteli, hogy a stílustulajdonságokat az Ismétlő sablonjaiban található webes vezérlőkre is alkalmazzuk, ahogyan azt a 2. ábrán tettük.
3. ábra: A teljes termékelem ki van emelve a 20,00 usd alatti termékekhez (ide kattintva megtekintheti a teljes méretű képet)
Formázási függvények használata a sablonból
A GridView Control oktatóanyag Sablonmezők használata című oktatóanyagában láthattuk, hogyan alkalmazhat egyéni formázást a GridView-sorokhoz kötött adatok alapján a GridView TemplateFielden belüli formázási függvényekkel. A formázási függvény olyan metódus, amely egy sablonból hívható meg, és a helyén kibocsátandó HTML-t adja vissza. A formázási függvények a ASP.NET lap kód mögötti osztályában találhatók, vagy a mappában App_Code
vagy egy külön Osztálytár projektben lévő osztályfájlokba központosíthatók. A formázási függvény áthelyezése az ASP.NET oldal kód mögötti osztályából ideális, ha ugyanazt a formázási függvényt több ASP.NET oldalon vagy más ASP.NET webalkalmazásban szeretné használni.
A formázási függvények bemutatásához adja meg, hogy a termékinformációk tartalmazzák-e a termék neve melletti [MEGSZŰNT] szöveget, ha az már megszűnt. Azt is tegyük fel, hogy az ár sárga színnel van kiemelve, ha kisebb, mint 20,00 USD (ahogy az eseménykezelő példájában ItemDataBound
is). Ha az ár 20,00 USD vagy magasabb, akkor ne a tényleges árat jelenítsük meg, hanem a szöveget, Kérjük, kérjen árajánlatot. A 4. ábrán az alábbi formázási szabályokkal rendelkező termékek listáját ábrázoló képernyőkép látható.
4. ábra: Drága termékek esetén az ár a szövegre cserélődik. Kérjen árajánlatot (Kattintson ide a teljes méretű kép megtekintéséhez)
1. lépés: A formázási függvények létrehozása
Ebben a példában két formázási függvényre van szükség, az egyikben a termék neve és a [MEGSZŰNT] szöveg szerepel, ha szükséges, a másik pedig a kiemelt árat jeleníti meg, ha az 20,00 usd-nél kisebb, vagy a szöveget, kérjük, kérjen másként árajánlatot. Hozzuk létre ezeket a függvényeket a ASP.NET lap kód mögötti osztályában, és nevezzük el őket DisplayProductNameAndDiscontinuedStatus
és DisplayPrice
. Mindkét metódusnak sztringként való megjelenítéshez vissza kell adnia a HTML-t, és mindkettőt meg kell jelölni Protected
(vagy Public
) a ASP.NET lap deklaratív szintaxisrészéből való meghíváshoz. A két módszer kódja a következő:
Protected Function DisplayProductNameAndDiscontinuedStatus _
(productName As String, discontinued As Boolean) As String
' Return just the productName if discontinued is false
If Not discontinued Then
Return productName
Else
' otherwise, return the productName appended with the text "[DISCONTINUED]"
Return String.Concat(productName, " [DISCONTINUED]")
End If
End Function
Protected Function DisplayPrice(product As Northwind.ProductsRow) As String
' If price is less than $20.00, return the price, highlighted
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 20 Then
Return String.Concat("<span class="AffordablePriceEmphasis">", _
product.UnitPrice.ToString("C"), "</span>")
Else
' Otherwise return the text, "Please call for a price quote"
Return "<span>Please call for a price quote</span>"
End If
End Function
Vegye figyelembe, hogy a DisplayProductNameAndDiscontinuedStatus
metódus skaláris értékként fogadja el a productName
és discontinued
adatmezők értékeit, míg a DisplayPrice
metódus egy ProductsRow
példányt fogad el (nem egy unitPrice
skaláris értéket). Bármelyik megközelítés működni fog; ha azonban a formázási függvény olyan skaláris értékekkel dolgozik, amelyek tartalmazhatnak adatbázis-értékeket (mint például NULL
; sem UnitPrice
sem ProductName
nem engedélyezik a Discontinued
értékeket), különös figyelmet kell fordítani ezekre a skaláris bemenetekre.
A bemeneti paraméternek különösen típusnak Object
kell lennie, mivel a bejövő érték lehet egy DBNull
példány a várt adattípus helyett. Emellett ellenőrizni kell, hogy a bejövő érték adatbázis-érték-e NULL
. Vagyis ha azt szeretnénk, hogy a DisplayPrice
metódus skaláris értékként fogadja el az árat, akkor a következő kódot kell használnunk:
Protected Function DisplayPrice(ByVal unitPrice As Object) As String
' If price is less than $20.00, return the price, highlighted
If Not Convert.IsDBNull(unitPrice) AndAlso CType(unitPrice, Decimal) < 20 Then
Return String.Concat("<span class="AffordablePriceEmphasis">", _
CType(unitPrice, Decimal).ToString("C"), "</span>")
Else
' Otherwise return the text, "Please call for a price quote"
Return "<span>Please call for a price quote</span>"
End If
End Function
Vegye figyelembe, hogy a unitPrice
bemeneti paraméter típusa Object
, és hogy a feltételes utasítás módosítva lett azért, hogy megállapítsa, unitPrice
DBNull
-e vagy sem. Továbbá, mivel a unitPrice
bemeneti paramétert a rendszer decimális értékként Object
adja át, a paramétert decimális értékre kell leadni.
2. lépés: A Formázás függvény meghívása a DataList s ItemTemplate-ból
A ASP.NET lap kód mögötti osztályához hozzáadott formázási függvényekkel csak a DataList s ItemTemplate
fájlból hívhatja meg ezeket a formázási függvényeket. Ha formázási függvényt szeretne meghívni egy sablonból, helyezze a függvényhívást a databinding szintaxisba:
<%# MethodName(inputParameter1, inputParameter2, ...) %>
A DataList ItemTemplate
vezérlőelemben a ProductNameLabel
Címke webvezérlő jelenleg a termék nevét jeleníti meg, a Text
tulajdonságának <%# Eval("ProductName") %>
eredménye hozzárendelésével. Annak érdekében, hogy megjelenítse a nevet plusz a [MEGSZÜNTETVE] szöveget, ha szükséges, frissítse a deklaratív szintaxist úgy, hogy a Text
tulajdonságnak a DisplayProductNameAndDiscontinuedStatus
metódus értékét adja. Ennek során a szintaxis használatával Eval("columnName")
meg kell adnunk a termék nevét és a megszüntetett értékeket.
Eval
típusértéket Object
ad vissza, de a metódus típus DisplayProductNameAndDiscontinuedStatus
típusú bemeneti paramétereket String
Boolean
vár, ezért a Eval
metódus által visszaadott értékeket a várt bemeneti paramétertípusokra kell vetnünk, például:
<h4>
<asp:Label ID="ProductNameLabel" runat="server"
Text='<%# DisplayProductNameAndDiscontinuedStatus((string) Eval("ProductName"),
(bool) Eval("Discontinued")) %>'>
</asp:Label>
</h4>
Az ár megjelenítéséhez egyszerűen beállíthatjuk a UnitPriceLabel
Címke tulajdonságot Text
a metódus által DisplayPrice
visszaadott értékre, ugyanúgy, mint a termék nevének és a [MEGSZŰNT] szövegnek a megjelenítéséhez. Ahelyett azonban, hogy skaláris UnitPrice
bemeneti paraméterként adnánk át, inkább a teljes ProductsRow
példányt adjuk át:
<asp:Label ID="UnitPriceLabel" runat="server"
Text='<%# DisplayPrice((Northwind.ProductsRow)
((System.Data.DataRowView) Container.DataItem).Row) %>'>
</asp:Label>
A formázási függvények hívásainak elhelyezése után szánjon egy kis időt arra, hogy előrehaladásunkat megtekintse egy böngészőben. A képernyőnek az 5. ábrához hasonlóan kell kinéznie. A megszűnt termékek mellett szerepel a [MEGSZŰNT] szöveg, és azoknál a termékeknél, amelyek több mint 20,00 dollárba kerülnek, az ár helyett a következő szöveg jelenik meg: Kérjük, kérjen árajánlatot.
5. ábra: Drága termékek esetén az ár a szövegre cserélődik. Kérjen árajánlatot (Kattintson ide a teljes méretű kép megtekintéséhez)
Összefoglalás
A DataList vagy az Repeater vezérlő tartalmának az adatok alapján történő formázása két módszerrel végezhető el. Az első módszer az, hogy létrehozunk egy eseménykezelőt az ItemDataBound
eseményhez, amely akkor aktiválódik, amikor az adatforrás minden rekordja egy új DataListItem
vagy RepeaterItem
elemhez kötődik. Az eseménykezelőben ItemDataBound
az aktuális elem adatai megvizsgálhatók, majd a formázás alkalmazható a sablon tartalmára vagy s esetén DataListItem
a teljes elemre.
Másik lehetőségként az egyéni formázás formázási függvényekkel is megvalósítható. A formázási függvények olyan metódusok, amelyek a DataList vagy Repeater sablonjaiból hívhatók meg, és visszaadják a HTML-t, amit a helyükön kibocsátanak. A formázási függvény által visszaadott HTML-t gyakran az aktuális elemhez kötött értékek határozzák meg. Ezek az értékek átadhatók a formázási függvénynek akár skaláris értékként, akár úgy, hogy a teljes objektumot, amely az elemhez van kötve (mint például a ProductsRow
példány esetében), átadjuk.
Boldog programozást!
Tudnivalók a szerzőről
Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Teach Yourself ASP.NET 2.0 24 Óra Alatt című. Ő itt elérhető mitchell@4GuysFromRolla.com.
Külön köszönet
Ezt az oktatóanyag-sorozatot sok hasznos véleményező áttekintette. Az oktatóanyag vezető véleményezői Yaakov Ellis, Randy Schmidt és Liz Shulok voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.