Spesso abbiamo la necessità di definire l'ordine sequenziale con cui, immagini, files, news o altro devono essere presentati all'utente di un sito web. Applicando il componente Sortable di jQuery UI a una GridView, abbiamo la possibilità di realizzare un'interfaccia in cui le righe possono essere spostate verso l'alto o verso il basso con semplici drag & drop del mouse.
Il Markup della GridView
Affinché possa essere utilizzata in questo contesto, la griglia deve possedere almeno due colonne, che possono essere nascoste o lasciate visibili a seconda delle esigenze di layout.- colonna id, che deve contenere gli identificativi dei record della tabella;
- colonna ordinale, destinata a contenere il numero progressivo che indica l'ordinamento sequenziale delle righe.
Oltre a questi due elementi necessari, possiamo ovviamente aggiungere tutti i campi che riteniamo opportuni.
<asp:GridView ID="GridView1" runat="server" ...> <Columns> <asp:BoundField DataField="id" HeaderText="ID" /> <asp:BoundField DataField="ordinale" HeaderText="Ordine" /> <asp:BoundField DataField="nome" HeaderText="Nome" /> </Columns> </asp:GridView>
Il codice JavaScript
Per attivare la funzionalità di drag and drop sulla griglia, sono necessarie alcune righe di codice JavaScript (oltre ad aggiungere jQuery e jQuery UI) agli script referenziati:$(function() { $("#GridView1 tbody.content").disableSelection(); $("#GridView1 tbody").addClass('content'); $("#GridView1 tbody.content").sortable(); });
Il significato delle istruzioni è il seguente:
- Con disableSelection abbiamo disabilitato la selezione del testo all'interno della griglia, altrimenti durante il drag & drop selezioneremmo anche il testo presente nelle celle, dando vita ad una certa confusione;
- Con addClass abbiamo assegnato la classe content al tag tbody della griglia, all'interno della quale possiamo per esempio impostare lo stile del cursor a move, così da mostrare il cursore del mouse più adeguato.
- Con sortable attiviamo effettivamente la possibilità di spostare le righe della griglia con il drag & drop.
Salvare il nuovo ordinamento dato alle righe
A seguito di ogni operazione di drag & drop, è necessario che il nuovo ordinamento dei dati venga inviato al server, così che possiamo memorizzarlo (per esempio in un database) e preservare l'ordinamento a ogni renderizzazione della pagina. Per farlo, possiamo avvalerci della funzione stop di Sortable di jQuery. Possiamo modificare lo script precedente in questo modo:$(function() { $("#GridView1 tbody.content").disableSelection(); $("#GridView1 tbody").addClass('content'); $("#GridView1 tbody.content").sortable({ stop: function(event, ui) { arrayId = new Array(); arrayOrdinali = new Array(); var rows = document.getElementById ('GridView1').rows; //loop sulla griglia per riscrivere l'ordine for (var index=1; index<rows.length; index++) { // Rieseguo la numerazione nel campo ordinale da 1 a n, in modo // da mostrare sempre la giusta e naturale sequenza (1,2,3,4 ....n) rows[index].cells[1].innerHTML=index; // Creo gli array delle coppie valori id record e ordinale da inviare // al server per essere riscritti sul database * arrayId[index]= rows[index].cells[0].innerHTML arrayOrdinali[index]= rows[index].cells[1].innerHTML } // Con una chiamata ad un web service si inviano al server // i due vettori di dati che possono essere processati per // salvare il nuovo ordinamento storageWebService.storeSort(arrayId, arrayOrdinali) } }); });
Nella funzione stop eseguiamo tre operazioni:
- Ricalcoliamo la numerazione del campo ordinale della griglia in modo da mostrare sempre la naturale sequenza delle righe secondo la sequenza naturale positiva da 1 a n;
- Compiliamo due vettori (arrayId, arrayOrdinali) che contengono rispettivamente, gli id dei record mostrati in griglia e la loro posizione secondo l'ordinamento;
- Come ultimo passo, possiamo invocare un web service per inviare le coppie di valori (Id Record e posizione) al server che provvederà a salvare il nuovo ordinamento.
Per quanto riguarda le modalità secondo cui possiamo esporre un web service a una pagina in modo che possa essere invocato tramite codice JavaScript, possiamo fare riferimento ai due articoli segnalati tra i riferimenti.
Riferimenti:
jQuery e ASP.NET: come realizzare applicazioni AJAX performantihttps://www.aspitalia.com/articoli/asp.net/jquery-ajax.aspx
Introduzione a Microsoft AJAX Library
https://www.aspitalia.com/articoli/asp.net2/microsoft-ajax-library-p-2.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Introduzione alle Container Queries
Path addizionali per gli asset in ASP.NET Core MVC
Filtering sulle colonne in una QuickGrid di Blazor
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Creare una libreria CSS universale: Cards
Disabilitare automaticamente un workflow di GitHub (parte 2)
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Eliminare una project wiki di Azure DevOps
Gestire il colore CSS con HWB
Applicare un filtro per recuperare alcune issue di GitHub
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Come EF 8 ha ottimizzato le query che usano il metodo Contains