web-dev-qa-db-fra.com

Réorganiser une zone de liste Winforms par glisser-déposer?

Est-ce un processus simple?

J'écris seulement une interface utilisateur rapide et hacky pour un outil interne.

Je ne veux pas y passer un âge.

39
Gareth Simpson

Voici une application rapide et sale. Fondamentalement, j'ai créé un formulaire avec un bouton et un ListBox. Au clic sur le bouton, la ListBox est remplie avec la date des 20 prochains jours (a dû utiliser quelque chose juste pour les tests). Ensuite, il permet de glisser-déposer dans la ListBox pour la réorganisation:

    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);
        }
82
BFree

7 ans de retard. Mais pour toute personne nouvelle, voici le code.

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;
    }
8
Wally Modz

La première fois, cela prend quelques heures si vous n'avez jamais implémenté le glisser-déposer, que vous voulez le faire correctement et que vous devez lire les documents. En particulier, le retour immédiat et la restauration de la liste si l'utilisateur annule l'opération nécessitent quelques réflexions. L'encapsulation du comportement dans un contrôle utilisateur réutilisable prendra également un certain temps.

Si vous n'avez jamais fait de glisser-déposer, jetez un œil à ceci exemple de glisser-déposer à partir du MSDN. Ce serait un bon point de départ et cela devrait vous prendre peut-être une demi-journée pour que la chose fonctionne.

3
Daniel Brückner

Une alternative utilise la vue de liste contrôle, qui est le contrôle qu'Explorateur utilise pour afficher le contenu des dossiers. C'est plus compliqué, mais implémente le glisser-déposer pour vous.

0
Simon Buchan