el Guille, la Web del Visual Basic, C#, .NET y más...

Drag & drop entre ListView y ListBox

 
Publicado el 23/Ene/2009
Actualizado el 24/Ene/2009
Autor: Guillermo 'guille' Som

Cómo hacer drag and drop (arrastrar y soltar) elementos de un ListView a un ListBox.



 

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

Para Visual Basic:

'------------------------------------------------------------------------------
' 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

 

Para C#:

//-----------------------------------------------------------------------------
// 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
 


Código de ejemplo (comprimido):

No hay nada de código, todo está en el artículo.


 


La fecha/hora en el servidor es: 22/12/2024 17:24:38

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024