Изменить порядок списка winforms с помощью перетаскивания? - PullRequest
35 голосов
/ 30 апреля 2009

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

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

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

Ответы [ 4 ]

77 голосов
/ 30 апреля 2009

Вот быстрое и грязное приложение. В основном я создал форму с кнопкой и 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);
        }
6 голосов
/ 12 ноября 2016

на 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;
    }
3 голосов
/ 30 апреля 2009

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

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

0 голосов
/ 30 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...