Introducción:
En este ejemplo (por cierto, el primero que publico yo como autor en el año
2009) te voy a mostrar cómo hacer drag & drop (arrastrar y soltar) desde un
ListView (en modo Description) a un ListBox.
Todo el proceso de esta prueba o ejemplo, consiste en lo siguiente:
Se llena el ListView con elementos (los nombres de los ficheros de un
directorio en concreto),
se permite seleccionar un elemento del ListView y arrastrarlo al ListBox, en
ese caso, se muestra el texto (el contenido de la propiedad Text del
elemento del ListView, es decir, del ListViewItem soltado),
también se pueden seleccionar varios elementos del ListView y arrastrarlos
hasta el ListBox, en ese caso, lo que se muestra es el texto de todos y cada
uno de los elementos soltados.
Además de estas opciones de arrastrar y soltar entre un control ListView y
otro ListBox, se permite igualmente que se arrastren y suelten ficheros...
si miras el código de ejemplo lo tendrás más claro.
Para que todo esto sea posible necesitamos lo siguiente (en un proyecto
del tipo Windows.Forms):
Un formulario con un control ListView llamado ListView1 y un control ListBox
llamado ListBox1 y el código (para VB o C#)
que te muestro más abajo.
Las asignaciones necesarias se hacen en ese mismo código, a resaltar es
que el control ListBox1 tenga un valor verdadero en la propiedad AllowDrop
con idea de que permita que se haga Drag & Drop en ese control.
El código
'------------------------------------------------------------------------------
' Hacer drag & drop entre dos controles de un formulario (23/Ene/09)
'
' ©Guillermo 'guille' Som, 2009
'------------------------------------------------------------------------------
Option Strict On
Option Infer On
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Text
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles MyBase.Load
With ListView1
.View = View.Details
.AllowDrop = True
.Columns.Clear()
.Columns.Add("Fichero", 300, HorizontalAlignment.Left)
End With
ListBox1.AllowDrop = True
leerDir("E:\tmp")
End Sub
Private Sub leerDir(ByVal path As String)
ListView1.Items.Clear()
Dim fics() As String = System.IO.Directory.GetFiles(path)
For Each s As String In fics
ListView1.Items.Add(s)
Next
End Sub
Private Sub ListBox1_DragDrop(ByVal sender As Object, _
ByVal e As DragEventArgs) _
Handles ListBox1.DragDrop
ListBox1.Items.Clear()
If e.Data.GetDataPresent( _
"System.Windows.Forms.ListView+SelectedListViewItemCollection") Then
Dim datos = CType(e.Data.GetData(GetType(ListView.SelectedListViewItemCollection)), _
ListView.SelectedListViewItemCollection)
For Each d As ListViewItem In datos
ListBox1.Items.Add(d.Text)
Next
ElseIf e.Data.GetDataPresent("System.Windows.Forms.ListViewItem") Then
Dim datos = CType(e.Data.GetData(GetType(ListViewItem)), ListViewItem)
ListBox1.Items.Add(datos.Text)
ElseIf e.Data.GetDataPresent("FileDrop") Then
Dim datos = CType(e.Data.GetData("FileDrop"), String())
For Each d In datos
ListBox1.Items.Add(d.ToString)
Next
Else
For Each d In e.Data.GetFormats
ListBox1.Items.Add(d.ToString)
Next
End If
End Sub
Private Sub ListBox1_DragEnter(ByVal sender As Object, _
ByVal e As DragEventArgs) _
Handles ListBox1.DragEnter
'TODO: hacer las comprobaciones de cuándo debe permitirse arrastrar y soltar
e.Effect = DragDropEffects.Copy
End Sub
Private Sub ListView1_ItemDrag(ByVal sender As Object, _
ByVal e As ItemDragEventArgs) _
Handles ListView1.ItemDrag
ListView1.DoDragDrop(ListView1.SelectedItems, DragDropEffects.Copy)
End Sub
End Class
//-----------------------------------------------------------------------------
// Hacer drag & drop entre dos controles de un formulario (23/Ene/09)
//
// ©Guillermo 'guille' Som, 2009
//-----------------------------------------------------------------------------
using System;
using System.Text;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ListView1.View = View.Details;
ListView1.AllowDrop = true;
ListView1.Columns.Clear();
ListView1.Columns.Add("Fichero", 360, HorizontalAlignment.Left);
ListBox1.AllowDrop = true;
leerDir(@"E:\tmp");
}
private void leerDir(string path)
{
ListView1.Items.Clear();
string[] fics = System.IO.Directory.GetFiles(path);
foreach (string s in fics)
{
ListView1.Items.Add(s);
}
}
private void ListBox1_DragDrop(object sender, DragEventArgs e)
{
ListBox1.Items.Clear();
if (e.Data.GetDataPresent("System.Windows.Forms.ListView+SelectedListViewItemCollection"))
{
var datos = ((ListView.SelectedListViewItemCollection)
e.Data.GetData(typeof(ListView.SelectedListViewItemCollection)));
foreach (ListViewItem d in datos)
{
ListBox1.Items.Add(d.Text);
}
}
else if (e.Data.GetDataPresent("System.Windows.Forms.ListViewItem"))
{
var datos = ((ListViewItem)e.Data.GetData(typeof(ListViewItem)));
ListBox1.Items.Add(datos.Text);
}
else if (e.Data.GetDataPresent("FileDrop"))
{
var datos = ((String[])e.Data.GetData("FileDrop"));
foreach (var d in datos)
{
ListBox1.Items.Add(d.ToString());
}
}
else
{
foreach (var d in e.Data.GetFormats())
{
ListBox1.Items.Add(d.ToString());
}
}
}
private void ListBox1_DragEnter(object sender, DragEventArgs e)
{
//TODO: hacer las comprobaciones de cuándo debe permitirse arrastrar y soltar
e.Effect = DragDropEffects.Copy;
}
private void ListView1_ItemDrag(object sender, ItemDragEventArgs e)
{
ListView1.DoDragDrop(ListView1.SelectedItems, DragDropEffects.Copy);
}
}
Espero que te sea de utilidad.
Nos vemos.
Guillermo
Espacios de nombres usados en el código de este artículo:
System.Windows.Forms
System.IO