Подтвердить что ты не робот

Переупорядочить список winforms с помощью перетаскивания?

Это простой процесс?

Я пишу только быстрый хакерский интерфейс для внутреннего инструмента.

Я не хочу тратить на это время.

4b9b3361

Ответ 1

Вот быстрое и грязное приложение. В основном я создал форму с кнопкой и ListBox. При нажатии кнопки ListBox заполняется датой следующих 20 дней (нужно было использовать что-то только для тестирования). Затем он позволяет перетаскивать в ListBox для переупорядочения:

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

Ответ 2

В первый раз требуется несколько часов, если вы никогда не выполняли перетаскивание, хотите сделать все правильно и прочитать документы. Особенно немедленная обратная связь и восстановление списка, если пользователь отменяет операцию, требуют некоторых мыслей. Инкапсуляция поведения в пользовательский элемент многократного использования займет некоторое время.

Если вы никогда не делали перетаскивание вообще, посмотрите на этот пример перетаскивания из MSDN. Это было бы хорошей отправной точкой, и вам понадобится полдня, чтобы заставить работу работать.

Ответ 3

Альтернативой является элемент управления list-view, который используется проводником управления для отображения содержимого папок. Это сложнее, но реализует перетаскивание элементов для вас.

Ответ 4

7 лет спустя. Но для кого-то нового, вот код.

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;
    }