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
Megtudhatja, hogyan törölhet több adatbázisrekordot egyetlen műveletben. A felhasználói felület rétegben egy korábbi oktatóanyagban létrehozott továbbfejlesztett GridView-ra építünk. Az adatelérési rétegben egy tranzakció több törlési műveletét is körbefuttatjuk, hogy az összes törlés sikeres legyen, vagy az összes törlés vissza legyen állítva.
Bevezetés
Az előző oktatóanyag bemutatta, hogyan hozhat létre kötegelt szerkesztési felületet egy teljesen szerkeszthető GridView használatával. Azokban az esetekben, amikor a felhasználók gyakran egyszerre sok rekordot szerkesztenek, a tömeges szerkesztési felület sokkal kevesebb visszajelzést és billentyűzet-egér közötti váltást igényel, ezáltal javítva a végfelhasználó hatékonyságát. Ez a technika hasonlóan hasznos azokban az oldalakon, ahol gyakori, hogy a felhasználók egyszerre több rekordot is törölnek.
Bárki, aki online e-mail klienst használt, már ismeri az egyik leggyakoribb kötegelt törlési felületet: a rács minden sorában található jelölőnégyzetet a megfelelő Összes kijelölt elem törlése gombbal (lásd az 1. ábrát). Ez az oktatóanyag meglehetősen rövid, mert a korábbi oktatóanyagokban már minden kemény munkát elvégeztünk a webes felület és a rekordok egyetlen atomi műveletként való törlésének módszere terén. A Jelölőnégyzetek Rácsnézet oszlopának hozzáadása oktatóanyagban létrehoztunk egy GridView-t, amely jelölőnégyzeteket tartalmazó oszlopot is magában foglal. A Tranzakcióba csomagolt adatbázis-módosítások című oktatóanyagban létrehoztunk egy metódust a BLL-ben, amely tranzakciót használ az List<T>ProductID értékek törlésére. Ebben az oktatóanyagban felhasználjuk és integráljuk korábbi tapasztalatainkat, hogy létrehozzunk egy működőképes kötegelt törlési példát.
1. ábra: Minden sor tartalmaz egy jelölőnégyzetet (ide kattintva megtekintheti a teljes méretű képet)
1. lépés: A Batch törlési felületének létrehozása
Mivel már létrehoztuk a kötegelt törlési felületet a Jelölőnégyzetek Rácsnézet oszlopának hozzáadása oktatóanyagban, egyszerűen átmásolhatjuk azt BatchDelete.aspx ahelyett, hogy az alapoktól hoznánk létre. Először nyissa meg a BatchDelete.aspx lapot a BatchData mappában és a CheckBoxField.aspx lapot a EnhancedGridView mappában. A CheckBoxField.aspx lapon lépjen a Forrás nézetre, és másolja a <asp:Content> címkék közötti jelölőnyelvet, ahogy a 2. ábrán látható.
2. ábra: Másolja a deklaratív korrektúrát CheckBoxField.aspx a vágólapra (kattintson ide a teljes méretű kép megtekintéséhez)
Ezután lépjen a Forrás nézetre BatchDelete.aspx , és illessze be a vágólap tartalmát a <asp:Content> címkékbe. Másolja és illessze be a kódot a kód mögötti osztályból CheckBoxField.aspx.vb a kód mögötti osztályba BatchDelete.aspx.vb (a DeleteSelectedProducts gomb eseménykezelőjébeClick, a ToggleCheckState metódusba és a Click eseménykezelőkbe a CheckAll és UncheckAll gombok esetében). A tartalom másolása után a BatchDelete.aspx lap mögötti osztálynak a következő kódot kell tartalmaznia:
Partial Class BatchData_BatchDelete
Inherits System.Web.UI.Page
Protected Sub DeleteSelectedProducts_Click(sender As Object, e As EventArgs) _
Handles DeleteSelectedProducts.Click
Dim atLeastOneRowDeleted As Boolean = False
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing AndAlso cb.Checked Then
' Delete row! (Well, not really...)
atLeastOneRowDeleted = True
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' "Delete" the row
DeleteResults.Text &= String.Format _
("This would have deleted ProductID {0}<br />", productID)
'... To actually delete the product, use ...
' Dim productAPI As New ProductsBLL
' productAPI.DeleteProduct(productID)
'............................................
End If
Next
' Show the Label if at least one row was deleted...
DeleteResults.Visible = atLeastOneRowDeleted
End Sub
Private Sub ToggleCheckState(ByVal checkState As Boolean)
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing Then
cb.Checked = checkState
End If
Next
End Sub
Protected Sub CheckAll_Click(sender As Object, e As EventArgs) _
Handles CheckAll.Click
ToggleCheckState(True)
End Sub
Protected Sub UncheckAll_Click(sender As Object, e As EventArgs) _
Handles UncheckAll.Click
ToggleCheckState(False)
End Sub
End Class
Miután átmásolta a deklaratív jelölőnyelvet és a forráskódot, szánjon egy kis időt BatchDelete.aspx tesztelésére egy böngészőben történő megtekintéssel. Megjelenik egy GridView, amely felsorolja az első tíz terméket a GridView-ban, és minden sor tartalmazza a termék nevét, kategóriáját és árát, valamint egy jelölőnégyzetet. Három gombnak kell lennie: Az összes ellenőrzése, az Összes jelölésének törlése és a Kijelölt termékek törlése. Az Összes Ellenőrzése gombra kattintva kijelöli az összes jelölőnégyzetet, míg az Összes Törlése gomb törli minden jelölőnégyzet kijelölését. A Kijelölt termékek törlése gombra kattintva megjelenik egy üzenet, amely felsorolja a ProductID kijelölt termékek értékeit, de valójában nem törli a termékeket.
3. ábra: A felületet CheckBoxField.aspx-ról/ről áthelyezték BatchDeleting.aspx-ra/re (ide kattintva megtekintheti a teljes méretű képet)
2. lépés: A ellenőrzött termékek törlése tranzakciók használatával
A kötegelt törlési felület sikeres átmásolása BatchDeleting.aspx után már csak a kód frissítése marad hátra, hogy a Kijelölt termékek törlése gomb a DeleteProductsWithTransaction metódusával törölje az ellenőrzött termékeket a ProductsBLL osztályban. Ez a Tranzakcióban történő adatbázis-módosítások burkolása oktatóanyagban hozzáadott metódus a List(Of T) adatok ProductID értékeit fogadja bemenetként, és törli minden egyes megfelelő ProductID-t a tranzakció hatókörén belül.
A DeleteSelectedProducts Button eseménykezelője Click jelenleg a következő For Each ciklust használja az egyes GridView-sorok iterálásához:
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing AndAlso cb.Checked Then
' Delete row! (Well, not really...)
atLeastOneRowDeleted = True
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' "Delete" the row
DeleteResults.Text &= String.Format _
("This would have deleted ProductID {0}<br />", productID)
'... To actually delete the product, use ...
' Dim productAPI As New ProductsBLL
' productAPI.DeleteProduct(productID)
'............................................
End If
Next
Minden sor esetében a ProductSelector CheckBox webvezérlő programozott módon kerül hivatkozásra. Ha be van jelölve, az s ProductID sort lekérjük a DataKeys gyűjteményből, és ezzel a DeleteResults Címke Text tulajdonsága frissül, amely üzenet jelenik meg, hogy a sor törlésre lett kiválasztva.
A fenti kód valójában nem töröl rekordokat, mivel a rendszer megjegyzést fűz az ProductsBLL osztály Delete metódusához. Ha ezt a törlési logikát alkalmazná, a kód törli a termékeket, de nem egy atomi műveleten belül. Ez azt jelenti, hogy ha a sorozat első néhány törlése sikeres volt, de egy későbbi sikertelen volt (talán egy idegenkulcs-korlátozás megsértése miatt), kivételt jelentene, de a már törölt termékek továbbra is törlődnek.
Az atomiság biztosítása érdekében inkább a ProductsBLL osztály DeleteProductsWithTransaction metódusát kell használnunk. Mivel ez a metódus elfogadja a ProductID értékek listáját, először össze kell állítanunk ezt a listát a rácsból, majd ezt paraméterként kell átadnunk. Először létrehozunk egy típuspéldányt List(Of T)Integer. A For Each cikluson belül hozzá kell adnunk ehhez ProductID a kiválasztott termékek List(Of T) értékeit. A ciklus után ezt List(Of T) át kell adni az ProductsBLL osztály DeleteProductsWithTransaction metódusának. Frissítse a DeleteSelectedProducts Button eseménykezelőjét Click a következő kóddal:
Protected Sub DeleteSelectedProducts_Click(sender As Object, e As EventArgs) _
Handles DeleteSelectedProducts.Click
' Create a List to hold the ProductID values to delete
Dim productIDsToDelete As New System.Collections.Generic.List(Of Integer)
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = CType(row.FindControl("ProductSelector"), CheckBox)
If cb IsNot Nothing AndAlso cb.Checked Then
' Save the ProductID value for deletion
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' Add it to the List...
productIDsToDelete.Add(productID)
' Add a confirmation message
DeleteResults.Text &= String.Format _
("ProductID {0} has been deleted<br />", productID)
End If
Next
' Call the DeleteProductsWithTransaction method and show the Label
' if at least one row was deleted...
If productIDsToDelete.Count > 0 Then
Dim productAPI As New ProductsBLL()
productAPI.DeleteProductsWithTransaction(productIDsToDelete)
DeleteResults.Visible = True
' Rebind the data to the GridView
Products.DataBind()
End If
End Sub
A frissített kód létrehoz egy List(Of T) típusú Integer példányt (productIDsToDelete), és feltölti a ProductID értékekkel, melyeket törölni kell.
For Each A ciklus után, ha legalább egy termék van kiválasztva, a rendszer meghívja az ProductsBLL s DeleteProductsWithTransaction osztály metódust, és átadja ezt a listát. Megjelenik DeleteResults a címke is, és az adatok visszakerülnek a GridView-ba (így az újonnan törölt rekordok már nem jelennek meg sorokként a rácson).
A 4. ábrán a GridView látható, miután több sort kijelöltek törlésre. Az 5. ábra a kijelölt termékek törlése gombra kattintás után azonnal megjeleníti a képernyőt. Vegye figyelembe, hogy az 5. ábrán a ProductID törölt rekordok értékei megjelennek a GridView alatti feliratban, és ezek a sorok már nem szerepelnek a GridView-ban.
4. ábra: A kijelölt termékek törlődnek (kattintson ide a teljes méretű kép megtekintéséhez)
5. ábra: A Törölt termékek ProductID értékek a GridView alatt jelennek meg (kattintson ide a teljes méretű kép megtekintéséhez)
Megjegyzés:
A metódus atomitásának DeleteProductsWithTransaction teszteléséhez manuálisan adjon hozzá egy bejegyzést egy termékhez a Order Details táblában, majd próbálja meg törölni a terméket (másokkal együtt). Idegen kulcs megszorítás megsértése történik, amikor megpróbál törölni egy terméket, amelyhez tartozik megrendelés, de vegye észre, hogy a többi kijelölt termék törlését visszaállítják.
Összefoglalás
A kötegtörlési felület létrehozásához létre kell hozni egy GridView-t egy jelölőnégyzetek oszlopával és egy gombos webvezérlővel, amely kattintáskor egyetlen atomi műveletként törli az összes kijelölt sort. Ebben az útmutatóban egy ilyen felületet úgy hoztunk létre, hogy összeállítjuk két korábbi útmutató munkáit: Jelölőnégyzetek GridView oszlopának hozzáadása és az adatbázis módosításait tranzakcióba ágyazva. Az első oktatóanyagban létrehoztunk egy GridView-t egy jelölőnégyzetek oszlopával, az utóbbiban pedig egy olyan módszert implementáltunk a BLL-ben, amely az értékek átadásakor List(Of T)ProductID mindet törölte egy tranzakció hatókörén belül.
A következő útmutatóban létrehozunk egy felületet a kötegelt beszúrások végrehajtásához.
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 Tanuld meg ASP.NET 2.0 24 óra alatt. Ő 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 Hilton Giesenow és Teresa Murphy voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.