Lilypie Primer PicLilypie Primer Ticker

martes, 3 de julio de 2007

Arrastrar y mover un Control

Update 2008-09-16.
Pueden descargar el código de este post aqui


En este post expondré una sencilla forma de mover un control dentro su contenedor; algo que no es muy complicado en realidad, pero que tampoco es lo más intuitivo del mundo.

Para lograrlo haremos uso de los eventos MouseDown, MouseUp y MouseDown, implementados en la clase Control, por lo que el código aquí expuesto nos servirá para mover cualquier objeto derivado de dicha clase.

Para empezar creamos un formulario y añadimos un control cualquiera. Para este ejemplo utilizaré un simple Label.

Ahora necesitamos declarar un campo privado del tipo booleano que nos indique si actualmente estamos arrastrando el control.

private bool isDragging = false;

Entonces nos valemos de los eventos MouseDown y MouseUp de nuestro Label para fijar el valor del campo isDragging, asi:

private void label1_MouseDown(object sender, MouseEventArgs e)

{
isDragging = true;

}

private void label1_MouseUp(object sender, MouseEventArgs e)
{

isDragging = false;
}

Ahora si, la verdadera acción ocurre en el evento MouseMove de nuestro Label:

private void label1_MouseMove(object sender, MouseEventArgs e)
{

Control ctrl = sender as Control;
if (isDragging)

{

Point p1 = ctrl.PointToScreen(e.Location);

Point p2 = ctrl.Parent.PointToClient(p1);

ctrl.Location = p2;

}

}

Lo único novedoso de este código es el uso de los métodos PointToScreen y PointToClient que transforman las coordenadas a coordenadas de Pantalla y a coordenadas de Control respectivamente.

Nada más, con estas pocas líneas ya podemos permitir a nuestros usuarios acomodar los controles a su conveniencia, algo muy útil para diseñar formularios, reportes, interfaces de usuario y otras cosas por el estilo.

9 comentarios:

jujomago dijo...

Hola man, puedes indicarme como usar los datasets y datagrids con c# en visual studio, es que no estoy acostumbrado a hacerlo de forma grafica, vengo de java y todo lo hago programando.

Saludoss

Anónimo dijo...

Gracias me sirvio mucho el codigo =)

asdeoz dijo...

oras intentando esto y no me salía. Con tu código en 5 min lo he tenido listo, Muchas gracias!

Anónimo dijo...

:s soy aalgo nuevo en esto y no me ha funcionad.o :s

hay k creear alguna clalse o algo asi??

lo he probadoo y no se no corre error pero no logro arrastrarlo


gracias.. poor si alguien me ayuda..

J. Marcos Troncoso dijo...

He publicado el código de este post en SkyDrive. Aqui les dejo el link

http://cid-cc57ea47a0487eb1.skydrive.live.com/self.aspx/myblog/DragnDrop.zip

Vibrlo dijo...

Konda oye copie el codigo y lo aplique a un Label pro no se mueve... tengo que hacr alguna modificacion en el Form.Designer.cs???

Gsus dijo...

hola disculpa porque al declarar

"private bool isDragging = false;" me sale error y no hay ninguna opcion con bool ni boolean en c#

clausindm dijo...

INTEREZANTE GRACIAS POR EL APORTE

Anónimo dijo...

Excelente, me funcionó, lo incorporaré a mi proyecto. Gracias men.