Úkol Drag and Drop
| Sitio: | Moodle ZČU |
| Curso: | BP Luboš Dokulil Sada rozšiřujících úloh v Blazor pro předmět Programování 2 |
| Libro: | Úkol Drag and Drop |
| Imprimido por: | Invitado |
| Día: | domingo, 18 de octubre de 2026, 09:58 |
Descripción
V zadání najdete jednoduchý úkol, který objasňuje principy Drag and Drop.
1. Zadání
Co je cílem zadání?
- Vytvoření datové třídy Úkol, která obsahuje vlastnost pro uložení názvu.
- Inicializace dvou oddělených kolekcí pro sledování stavu úkolů a vytvoření pomocné proměnné pro uchování právě taženého prvku.
- Příprava uživatelského rozhraní se dvěma vizuálně odlišenými oblastmi, které fungují jako aktivní zóny pro vkládání položek.
- Implementace interaktivity pomocí událostí Drag & Drop umožňující uživateli myší chytit, táhnout a upustit jednotlivé prvky na obrazovce.
Zadání
Nejprve definujte třídu Ukol, která bude reprezentovat konkrétní pracovní úkol a bude obsahovat textovou vlastnost Nazev.
V Razor komponentě si připravte dvě nezávislé kolekce List<Ukol> pro sloupce „K vyřízení“ a „Hotovo“ a k tomu jednu privátní proměnnou pro dočasné uchování právě přenášeného objektu. První kolekci rovnou naplňte alespoň třemi výchozími úkoly, druhou ponechte prázdnou.
Vytvořte uživatelské rozhraní se dvěma vizuálně oddělenými zónami a vypište do nich úkoly s aktivním atributem draggable="true". Pomocí událostí @ondragstart, ondragover (s potlačením výchozího chování) a @ondrop naprogramujte logiku pro obousměrné přesouvání myší. Samotný přesun realizujte přidáním objektu do cílové kolekce a jeho současným smazáním z té původní.
Příklad, jak by mohla stránka vypadat:
Pokud se okno nenačetlo, klikněte zde.
2. Grafická nápověda
Logika aplikace

Po uchopení se objekt uloží do pomocné proměnné tahanyPrvek. Následně se vyhodnocuje podmínka, zda uživatel prvek pustil nad platným cílem.
Pokud prvek skončí mimo cíl, operace se bez změny dat ukončí. Při úspěšném umístění do cílové oblasti se objekt nejprve odstraní z původní kolekce zavoláním metody Remove() a vzápětí se vloží do nového seznamu pomocí metody Add(). Proces je zakončen resetováním proměnné tahanyPrvek na hodnotu null, čímž se paměť vyčistí pro další operaci.
3. Řešení úkolu
Třída úkol
namespace DragAndDrop3.Models { // Třída úkol, obsahuje pouze název public class Ukol { public string Nazev { get; set; } = ""; } }
Třída Úkol definuje jedinou vlastnost - Název.
Razor komponenta
@page "/" <h3>Seznam úkolů</h3> <div class="container d-flex gap-4"> <!-- Seznam úkolů k vyřízení, povolené dragover a v momentě upuštění zavolá metodu VlozitDoVyrizeni() --> <div class="drop-zone" ondragover="event.preventDefault();" @ondrop="VlozitDoVyrizeni"> <h4>K vyřízení</h4> <!-- Výpis všech úkolů, které ještě nejsou zpracovány --> @foreach (var ukol in ukolyKeZpracovani) { <!-- Povolení draggable, volání funkce ZahajitPresun() --> <div class="draggable-item" draggable="true" @ondragstart="() => ZahajitPresun(ukol)"> @ukol.Nazev </div> } </div> <!-- Seznam hotových úkolů, povolené dragover a v momentě upuštění zavolá metodu VlozitDoHotovo() --> <div class="drop-zone" ondragover="event.preventDefault();" @ondrop="VlozitDoHotovo"> <h4>Hotovo</h4> <!-- Výpis všech úkolů, které jsou v seznamu hotovo --> @foreach (var ukol in hotoveUkoly) { <!-- Povolení draggable, volání funkce ZahajitPresun() --> <div class="draggable-item" draggable="true" @ondragstart="() => ZahajitPresun(ukol)"> @ukol.Nazev <div> } </div> </div> <style> /* CSS styl cílové oblasti pro upuštění prvků */ .drop-zone { width: 300px; min-height: 400px; border: 2px dashed #ccc; padding: 20px; background-color: #f9f9f9; } .draggable-item { padding: 10px; margin-bottom: 10px; background-color: #007bff; color: white; cursor: grab; border-radius: 5px; } </style> @code { // Kolekce pro oba sloupce (sjednoceno na Models.Ukol) List<Models.Ukol> ukolyKeZpracovani = new List<Models.Ukol> { new Models.Ukol { Nazev = "Napsat mail" }, new Models.Ukol { Nazev = "Nakoupit" }, new Models.Ukol { Nazev = "Uklidit" }, new Models.Ukol { Nazev = "Vyvenčit psa" } }; List<Models.Ukol> hotoveUkoly = new List<Models.Ukol>(); // Pomocná proměnná pro právě přenášený objekt (nullable a privátní) private Models.Ukol? prenasenyUkol; // Metoda volaná při začátku tažení (@ondragstart) void ZahajitPresun(Models.Ukol ukol) { prenasenyUkol = ukol; } // Metoda volaná při upuštění do "Hotovo" (@ondrop) void VlozitDoHotovo() { // Ochrana proti null if (prenasenyUkol != null && !hotoveUkoly.Contains(prenasenyUkol)) { hotoveUkoly.Add(prenasenyUkol); ukolyKeZpracovani.Remove(prenasenyUkol); prenasenyUkol = null; // Reset } } // Metoda volaná při upuštění zpět do "K vyřízení" (@ondrop) void VlozitDoVyrizeni() { if (prenasenyUkol != null && !ukolyKeZpracovani.Contains(prenasenyUkol)) { ukolyKeZpracovani.Add(prenasenyUkol); hotoveUkoly.Remove(prenasenyUkol); prenasenyUkol = null; // Reset } } }
Atributem draggable="true" určujeme, že prvek HTML lze přesouvat, přičemž událost @ondragstart pomocí lambda výrazu () =>
ZahajitPresun(ukol) okamžitě ukládá instanci právě taženého úkolu do privátní proměnné prenasenyUkol. U cílových oblastí je pak nezbytné volat ondragover="event.preventDefault();", čímž se potlačí výchozí chování prohlížeče, které by jinak upuštění prvku zablokovalo. Jakmile uživatel prvek pustí, událost @ondrop zavolá příslušnou C# metodu (např. VlozitDoHotovo). V bloku @code tyto metody nejprve bezpečně ověří přítomnost objektu v dočasné proměnné a následně pomocí standardních metod Add a Remove na kolekcích List<Models.Ukol> zajistí přesun dat. Po vyresetování proměnné na null se Blazor automaticky postará o překreslení celého uživatelského rozhraní podle aktuálního stavu obou seznamů.