sábado, octubre 23, 2004

Artículo : Implementación Simple de Drag & Drop en C# y VB.Net

La implementación de Drag & Drop en aplicaciones windows, con .Net, es una secuencia de eventos y propiedades que casi nunca varía.

Para ilustrar el proceso, he preparado un ejemplo de una aplicación windows, del que pueden bajar el código en C#, o el código en VBNet.

Drag del ListBox al DataGrid
Fig. 1 - Interface de la aplicación para Drag&Drop desde la lista a la Grilla.

Esta aplicación accede a una base de datos (Northwind de MSDE o SQLServer) y extrae una lista de Empleados (tabla Employee). Se permitirá "arrastrar" (Drag) el apellido del Empleado hacia una caja de texto y hacia una grilla de datos.

El objetivo es verificar, en el caso del textbox, el índice del item seleccionado y, en el caso de la grilla, desplegar los detalles del empleado seleccionado.

El conjunto de pasos a implementar es :

Para el TextBox

Paso Uno:
Poner en true la propiedad AllowDrop del TextBox. Esto habilitará la acción de soltar el ratón hacia este control.

Paso Dos:
Trabajar sobre el evento MouseDown del ListBox (es el evento que inicia el proceso de arrastre) y llamar el método DoDragDrop :

DoDragDrop(this.listBox1.SelectedIndex.ToString(), DragDropEffects.Copy);


Este método recibe como primer parámetro el elemento que se está arrastrando (para el caso nuestro el índice del elemento seleccionado en el ListBox) y, como segundo parámetro, el efecto que se producirá en el proceso de arrastre (pueden ser: Copy, Move, None, Link o Scroll).

Paso Tres:
Sobre el TexBox, en su evento DragEnter establecemos, con la siguiente línea, que el ícono que se deberá presentar, en este caso el de copia de contenido.

e.Effect = DragDropEffects.Copy;


Paso Cuatro:
Por último, para el evento DragDrop de TextBox tendremos, ahora si, la asignación del contenido seleccionado cuando se suelte el ratón (Drop).




this.textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();



Listo. Para la grilla es un contexto similar.

En el evento DragEnter de DataGrid ponemos lo siguiente :


if (e.Data.GetDataPresent(DataFormats.Text))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;


y en el evento DragDrop del mismo control :


int indiceListbox = 1 + int.Parse(e.Data.GetData(DataFormats.Text).ToString());
//refresca el datagrid
this.dataGrid1.DataSource = null;

DataSet ds = new DataSet();
SqlCommand com = new SqlCommand();
com.CommandText = "SELECT * FROM Employees WHERE EmployeeId = @ID";
com.CommandType = CommandType.Text;
com.Connection = conn;
com.Parameters.Add("@ID",SqlDbType.Int);
com.Parameters["@ID"].Value = indiceListbox;

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = com;
da.Fill(ds);

this.dataGrid1.DataSource = ds.Tables[0].DefaultView;



con eso, el control llenará los datos para el item seleccionado en la lista.

Esta sucesión de 4 pasos es la que habitualmente se sigue para el proceso de Drag & Drop. Puede implementarse, por ejemplo, un efecto "Move" en lugar de "Copy", donde habría que incluir un paso adicional para quitar el elemento seleccionado del ListBox.

Eso, para hacerlo un tanto más interesante, lo dejo como tarea para el lector... :)

Espero sea útil.



Share this post
  • Share to Facebook
  • Share to Twitter
  • Share to Google+
  • Share to Stumble Upon
  • Share to Evernote
  • Share to Blogger
  • Share to Email
  • Share to Yahoo Messenger
  • More...

12 comentarios

 
© aleGozalves
Designed by BlogThietKe Cooperated with Duy Pham
Released under Creative Commons 3.0 CC BY-NC 3.0
Posts RSSComments RSS
Back to top