Как реализовать Drag and Drop - PullRequest
       0

Как реализовать Drag and Drop

0 голосов
/ 03 апреля 2012

Я работаю над проектом.Это делается с помощью перетаскивания. Это код, который у меня есть сейчас.

   namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            listBox1.DoDragDrop(listBox1.SelectedItem.ToString(), DragDropEffects.Move);
        }

        private void listBox2_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.AllowedEffect;
        }

        private void listBox2_DragDrop(object sender, DragEventArgs e)
        {
            listBox2.Items.Add(e.Data.GetData(DataFormats.Text));
            listBox1.Items.Remove(listBox1.SelectedItem.ToString());
        }

Он позволяет добавить во второе поле списка, но я пытаюсь получить его, где вы также можете переместить элемент обратно в первыйсписок, если вы хотите.Я повторяю код для второго списка, как я сделал для первого, или есть строка кода, которую я мог бы просто добавить. Также, как вы можете определить, является ли ваша программа «неразрушимой».Спасибо.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Я повторяю код для второго списка

В значительной степени, да.Хотя вы можете немного упростить его, поскольку код будет практически идентичен, если оба списка будут использовать один и тот же обработчик для MouseDown, DragEnter и DragDrop, а затем использовать отправителя, чтобы выяснить, является ли он listBox1 или listBox2.

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

Обычно я делаю что-то вроде этого:

private Size dragSize = SystemInformation.DragSize;
private Rectangle dragBounds = Rectangle.Empty;

private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
   if (e.Button == MouseButtons.Left)
   {
        dragBounds = new Rectangle(new Point(e.X - dragSize.Width / 2, e.Y - dragSize.Height/2), dragSize);
   }
   else
   {
       dragBounds = Rectangle.Empty;
   }
}

private void listBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && dragBounds != Rectangle.Empty && !dragBounds.Contains(e.X, e.Y))
    {
        //start drag
        listBox1.DoDragDrop(listBox1.SelectedItem.ToString(), DragDropEffects.Move);
        dragBounds = Rectangle.Empty;
    }
}
2 голосов
/ 03 апреля 2012

Для основного вопроса реализации перетаскивания: да, вам нужно создать обработчики для listbox1 и listbox2, которые отражают функциональность, которая у вас уже есть:

  • Обработчик события MouseDown для listBox2
  • Обработчик DragEnter для listBox1
  • Обработчик DragDrop для listBox1.

Также вам необходимо убедиться, что вы назначили эти обработчики для использования их соответствующими событиями в конструкторе форм.

1 голос
/ 03 апреля 2012

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

private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
    HandleMouseDown(listbox1);
}

private void listBox2_DragEnter(object sender, DragEventArgs e)
{
    HandleDragEnter( e );
}

private void listBox2_DragDrop(object sender, DragEventArgs e)
{
    HandleDragDrop( listBox1, listBox2, e );
}

private void listBox2_MouseDown(object sender, MouseEventArgs e)
{
    HandleMouseDown(listBox2);
}

private void listBox1_DragEnter(object sender, DragEventArgs e)
{
    HandleDragEnter( e );
}

private void listBox1_DragDrop(object sender, DragEventArgs e)
{
    HandleDragDrop( listBox2, listBox1, e );
}


private void HandleMouseDown( ListBox listBox )
{
    listBox.DoDragDrop(listBox.SelectedItem.ToString(), DragDropEffects.Move);
}

private void HandleDragEnter( DragEventArgs e )
{
    e.Effect = e.AllowedEffect;
}

private void HandleDragDrop( ListBox src, ListBox dst, DragEventArgs e )
{
    dst.Items.Add( e.Data.GetData(DataFormats.Text) );
    src.Items.Remove( src.SelectedItem.ToString() );
}

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

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