Изменить порядок списка winforms с помощью перетаскивания?

StackOverflow https://stackoverflow.com/questions/805165

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Я не хочу тратить на это целую вечность.

Это было полезно?

Решение

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

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

Другие советы

Опоздал на 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;
    }

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top