Megosztás a következőn keresztül:


Csoportos törlés (VB)

által Scott Mitchell

PDF letöltése

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.

Minden sor tartalmaz egy jelölőnégyzetet

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ó.

A CheckBoxField.aspx deklaratív jelölés másolása a vágólapra

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.

A

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.

A kijelölt termékek törlődnek

4. ábra: A kijelölt termékek törlődnek (kattintson ide a teljes méretű kép megtekintéséhez)

A Törölt termékek termékazonosító értékei a GridView alatt jelennek meg

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.