miércoles, 3 de agosto de 2011

(drag and drop) Cómo agregar funcionalidad de arrastrar y colocar TreeView en una aplicación de Visual C#

En este artículo paso a paso se describe cómo realizar una operación de arrastrar y colocar con nodos de árbol entre dos controlesTreeView en una aplicación de Visual C#.

Volver al principio

Requisitos
En la lista siguiente se indican el hardware, el software, la infraestructura de red y los Service Pack recomendados que necesitará:
  • Visual C# .NET o Visual C# 2005
En este artículo se da por supuesto que está familiarizado con los temas siguientes:
  • Control TreeView de Windows Forms
  • Control de eventos de Windows Forms

Volver al principio

Descripción de la técnica
El control TreeView ofrece tres eventos de arrastrar y colocar que debe controlar:
  • ItemDrag: Este evento se genera desde el control TreeView de origen en cuanto el usuario empieza a arrastrar el nodo de árbol. Cuando esto ocurra, llame al método DoDragDrop para iniciar el procedimiento de arrastrar y colocar.
  • DragEnter: después de iniciar la operación de arrastrar y colocar, debe controlar el evento DragEnter del control TreeView de destino. Este evento se produce cuando el usuario arrastra el objeto TreeNode desde el control TreeView de origen hasta un punto dentro de los límites del control TreeView de destino. El evento DragEnter permite que el control TreeView de destino especifique si la operación de arrastre es válida para este control. El código de ejemplo de este artículo sólo permite la operación de desplazamiento.
  • DragDrop: el último evento que hay que controlar es el evento DragDrop del control TreeView de destino. Este evento se produce cuando el objeto TreeNode que se arrastra se ha colocado en el control TreeView de destino. Para controlar este evento, recupere el objeto TreeNode y agréguelo al control TreeView de destino. En el código de ejemplo se utiliza el objetoData para recuperar los datos.
El código de ejemplo de este artículo garantiza que se ha arrastrado un objeto TreeNode hasta el control TreeView de destino. El método GetData del objeto Data recupera el nodo que se arrastra desde el control de origen. El método GetNodeAt determina en qué punto del control de destino se coloca este nodo. Una vez que determine la posición, agregue el nodo de origen como secundario del nodo de destino. Puesto que este ejemplo realiza una operación de desplazamiento, el último paso consiste en quitar el nodo de origen del control TreeView original.

Volver al principio

Pasos para crear el ejemplo
  1. Cree una nueva aplicación para Windows en Visual C#. De forma predeterminada, se crea un formulario denominado Form1.
    Nota
    Se debe cambiar el código en Visual Studio 2005. Cuando crea un proyecto de Windows Forms, Visual C# agrega un formulario al proyecto de manera predeterminada y le asigna el nombre Form1. Los dos archivos que representan el formulario se denominan Form1.cs y Form1.designer.cs. Debe escribir el código en Form1.cs; el archivo designer.cs es donde el Diseñador de Windows Forms escribe el código que implementa todas las acciones que realizó arrastrando y colocando controles desde el cuadro de herramientas.
    Para obtener más información acerca del Diseñador de Windows Forms en Visual C# 2005, visite el siguiente sitio Web de Microsoft:

    http://msdn2.microsoft.com/en-us/library/ms173077.aspx

  2. Utilice el cuadro de herramientas para agregar dos controles TreeView a Form1. De forma predeterminada se crean TreeView1y TreeView2.
  3. Para permitir que los controles TreeView se puedan arrastrar y colocar, cambie la propiedad AllowDrop de TreeView1 yTreeView2 a True en la ventana Propiedades.

Haga doble clic en Form1 para generar el controlador de métodos del evento Load de Form1. Agregue el código siguiente para llenar los dos controles TreeView con objetos TreeNode y para definir los controladores de eventos:



private void Form1_Load(object sender, System.EventArgs e)
{
TreeNode ParentNode1;
TreeNode ParentNode2;

ParentNode1 = treeView1.Nodes.Add("tv1");
ParentNode1.Nodes.Add("tv1FirstChild");
ParentNode1.Nodes.Add("tv1SecondChild");
ParentNode1.Nodes.Add("tv1ThirdChild");
ParentNode1.Nodes.Add("tv1FourthChild");
ParentNode1.Expand();

ParentNode2 = treeView2.Nodes.Add("tv2");
ParentNode2.Nodes.Add("tv2FirstChild");
ParentNode2.Nodes.Add("tv2SecondChild");
ParentNode2.Expand();
this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
this.treeView2.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
}



Agregue el controlador de métodos siguiente para controlar el evento ItemDrag de TreeView1 o TreeView2, dependiendo de la dirección de la operación de arrastre. Este código inicia una operación de desplazamiento del elemento que se está arrastrando.








private void treeView_DragEnter(object sender,
System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}



Agregue el controlador de métodos siguiente para controlar el evento DragEnter de TreeView1 o TreeView2, dependiendo de la dirección de la operación de arrastre:








private void treeView_DragEnter(object sender,
System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}



Agregue el método siguiente a la clase Form1 de forma que siga inmediatamente al método que agregó en el paso anterior:








private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
TreeNode NewNode;

if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
{
Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
if(DestinationNode.TreeView != NewNode.TreeView)
{
DestinationNode.Nodes.Add((TreeNode) NewNode.Clone());
DestinationNode.Expand();
//Remove Original Node
NewNode.Remove();
}
}
}




  1. Genere y ejecute el proyecto. Arrastre nodos desde un control TreeView hasta el otro. Observe que se quita el nodo del control de origen y se agrega como nodo secundario al control de destino.



Volver al principio



Notas

El ejemplo que se ofrece en este artículo está pensado con fines demostrativos únicamente. Por tanto, solo ilustra cómo utilizar el controlTreeView en un escenario simplificado. Para reducir el tamaño del ejemplo, no se tienen en cuenta varios escenarios. Por ejemplo, el código no le permite realizar una operación de arrastrar y colocar con nodos del mismo control TreeView.


El código tampoco trata el escenario en el que un usuario no coloca el objeto en un nodo concreto del control TreeView de destino. Para controlar este escenario, compruebe si DestinationNode es nulo; si lo es, puede agregar el objeto que se está arrastrando hasta la raíz del control TreeView y así sucesivamente.

 



link http://support.microsoft.com/kb/307968

0 comentarios:

Publicar un comentario