ventana titulo soltar mover impedir formulario form bordes barra arrastrar c# winforms listbox

c# - titulo - ¿Reordenar un cuadro de lista de winforms usando arrastrar y soltar?



mover un form sin barra de titulo c# (4)

7 años tarde Pero para alguien nuevo, aquí está el código.

private void listBox1_MouseDown(object sender, MouseEventArgs e) { if (this.listBox1.SelectedItem == null) return; this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move); } private void listBox1_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } private void listBox1_DragDrop(object sender, DragEventArgs e) { Point point = listBox1.PointToClient(new Point(e.X, e.Y)); int index = this.listBox1.IndexFromPoint(point); if (index < 0) index = this.listBox1.Items.Count - 1; object data = listBox1.SelectedItem; this.listBox1.Items.Remove(data); this.listBox1.Items.Insert(index, data); } private void itemcreator_Load(object sender, EventArgs e) { this.listBox1.AllowDrop = true; }

Es este un proceso simple?

Solo estoy escribiendo una UI hacky rápida para una herramienta interna.

No quiero pasar una edad en eso.


Aquí hay una aplicación rápida y sucia. Básicamente creé un Formulario con un botón y un ListBox. Al hacer clic en el botón, el ListBox se llena con la fecha de los próximos 20 días (tuvo que usar algo solo para probar). Luego, permite arrastrar y soltar dentro del ListBox para reordenar:

public partial class Form1 : Form { public Form1() { InitializeComponent(); this.listBox1.AllowDrop = true; } private void button1_Click(object sender, EventArgs e) { for (int i = 0; i <= 20; i++) { this.listBox1.Items.Add(DateTime.Now.AddDays(i)); } } private void listBox1_MouseDown(object sender, MouseEventArgs e) { if (this.listBox1.SelectedItem == null) return; this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move); } private void listBox1_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } private void listBox1_DragDrop(object sender, DragEventArgs e) { Point point = listBox1.PointToClient(new Point(e.X, e.Y)); int index = this.listBox1.IndexFromPoint(point); if (index < 0) index = this.listBox1.Items.Count-1; object data = e.Data.GetData(typeof(DateTime)); this.listBox1.Items.Remove(data); this.listBox1.Items.Insert(index, data); }


La primera vez que toma algunas horas si nunca implementó arrastrar y soltar, desea hacerlo bien y tiene que leer los documentos. Especialmente la retroalimentación inmediata y la restauración de la lista si el usuario cancela la operación requieren algunas reflexiones. Encapsular el comportamiento en un control de usuario reutilizable también llevará algo de tiempo.

Si nunca ha hecho "arrastrar y soltar", eche un vistazo a este ejemplo de arrastrar y soltar desde MSDN. Este sería un buen punto de partida y le tomará tal vez medio día lograr que la cosa funcione.


Una alternativa es usar el control list-view , que es el control que Explorer usa para mostrar el contenido de las carpetas. Es más complicado, pero implementa el arrastre de elementos para ti.