Il breve tutorial di quest’oggi ci guiderà a realizzare una semplice applicazione Windows Form sulla cui form principale sono presenti due ListBox sulle quali vogliamo abilitare ed implementare il drag and drop (sarà quindi possibile “trascinare” un elemento da una form all’altra oltre che su se stessa cambiandone l’ordine).
Tutto quello che dobbiamo fare è a questo punto creare un nuovo progetto Windows Form con Visual Studio e trascinare due ListBox, chiamandole rispettivamente lst1 e lst2 sulla form appena creata.
Possiamo utilizzare l’evento Load della form principale per popolare la prima lista oltre che abilitare il drag and drop su ambedue con il seguente codice:
lst1.Items.Add("Primo");
lst1.Items.Add("Secondo");
lst1.Items.Add("Terzo");
lst1.Items.Add("Quarto");
lst1.Items.Add("Quinto");
lst1.Items.Add("Sesto");
lst1.Items.Add("Settimo");
lst1.AllowDrop = true;
lst2.AllowDrop = true;
A questo punto dobbiamo prendere in considerazione tre eventi: il primo MouseDown sulla prima ListBox e i secondi due, DragOver e DragDrop, sulla seconda ListBox. Vediamo questi passi più in dettaglio
private void lst1_MouseDown(object sender, MouseEventArgs e)
{
if (lst1.Items.Count > 0)
{
int index = lst1.SelectedIndex;
string s = lst1.Items[index].ToString();
DragDropEffects dde = DoDragDrop(s, DragDropEffects.All);
if (dde == DragDropEffects.All)
{
lst1.Items.RemoveAt(lst1.SelectedIndex);
}
}
}
Il significato delle operazioni da compiere allo scatenarsi di quest’evento sono molto semplici: se abbiamo almeno un elemento sulla ListBox “sorgente” (che in questo caso è la prima) prendiamo l’indice dell’elemento selezionato ed otteniamo il testo dell’elemento stesso conservandolo in una stringa. A questo punto, tramite il metodo DoDragDrop possiamo iniziare l’operazione di trascinamento. Se il metodo stesso restituirà uno dei valori appartenenti all’enumerazione DragDropEffects.All, vorrà dire che il drag and drop è avvenuto correttamente e quindi possiamo rimuovere dalla ListBox l’elemento precedentemente selezionato.
Ora passiamo all’evento DragOver, scatenato dopo il DragEnter, sulla seconda ListBox: qui ci limiteremo ad informare che abbiamo accettato l’evento di drag and drop stesso:
private void lst2_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
Non ci resta a questo punto che passare all’implementazione dell’ultimo evento sulla seconda ListBox: DragDrop
private void lst2_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.StringFormat))
{
string str = (string)e.Data.GetData(DataFormats.StringFormat);
lst2.Items.Add(str);
}
}
Le operazioni che l’evento compierà sono le seguenti: se il formato dei dati “trascinati” è una stringa, leggo la stringa stessa e l’aggiungo alla seconda ListBox.
Da notare che al compimento di quest’evento, nel MouseDown della prima ListBox leggeremo il valore “all” per dde il che ci permetterà di cancellare l’elemento dalla lista stessa.