Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/196: Рейтинг темы: голосов - 196, средняя оценка - 4.95
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199

Как реализовать drag-and-drop в Windows Forms?

27.02.2011, 19:02. Показов 41613. Ответов 14

Студворк — интернет-сервис помощи студентам
Как реализовать drag-and-drop в Windows Forms?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.02.2011, 19:02
Ответы с готовыми решениями:

Событие Drag and Drop в Windows forms C++
Help me,please!!!)) Суть в чем: Создайте проект, содержащий 2 списка ListBox и две кнопки Button и обеспечивающий решение следующих...

Drag and drop - как реализовать?
Доброго времени суток, попался мне один лэндинг в качестве учебного, там есть в конце оказался вот такой блок с drag and drop. Я -...

Как реализовать Drag And Drop из Listbox в RichTextBox
всем приветы. прошу помощи у сведущих форумчан. Имею на форме заполненный Listbox и пустой RichTextBox. Как реализовать перетаскивание...

14
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
27.02.2011, 19:33
Если было mousedown меряешь путь, который прошел указатель мыши, если путь больше 5 пикселов включаешь свойство dragging и посылаешь событие ondrag
0
 Аватар для Etrimus
399 / 366 / 54
Регистрация: 23.05.2010
Сообщений: 716
27.02.2011, 19:33
Я бы посоветовал вам конкретизировать вопрос. Что, куда надо перетаскивать? В пределах формы, или снаружи в форму...
0
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
27.02.2011, 19:35  [ТС]
1. Из эксплорера в форму
2. Снаружи в форму
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
27.02.2011, 19:45
[ссылка удалена модератором] - VB, но тоже сойдет (:

Добавлено через 35 секунд
VB.NET
1
2
3
4
5
6
7
8
'Здесь проверяешь файлы ли тащит пользователь
Private Sub control_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles control.DragEnter
        If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
            e.Effect = DragDropEffects.All
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   Private Sub control_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles control.DragDrop
        Dim s() As String = e.Data.GetData("FileDrop", False) 'массив с полных путей с именами файлов
 
        Try
            For i = 0 To s.Length - 1 'перебираешь
 
                Dim fileElem() As String
                fileElem = s(i).Split("")
                Dim filename As String = fileElem(fileElem.Length - 1) 'получаешь отдельно имя файла
                'проверяешь расширение если нужно
                If Mid(filename, filename.Length - 3).ToLower = ".jpg" Then
 
                End If
            Next i
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        Me.prBar.Visible = False
        Me.lblProgress.Visible = False
 
    End Sub
Добавлено через 54 секунды
когда перетаскиваешь файл на форму, в том же событии DragEnter передается DragEventArgs у которого есть DataObject, у которого в свою очередь есть GetFormats() и GetData(string format)
в частности для файла одно из значений GetFormats дает FileName или FileNameW

e.Data.GetData("FileName") и e.Data.GetData("FileNameW") дают имя файла, не знаю на какой из них стоит опиратся, возможно на тот что с W.
1
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
27.02.2011, 20:08  [ТС]
Перевёл на C#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private void Label1_DragDrop(object sender, DragEventArgs e)
    {
        string[] s = (string[]) e.Data.GetData("FileDrop", false);
        try
        {
            int VB$t_i4$L0 = s.Length - 1;
            for (int i = 0; i <= VB$t_i4$L0; i++)
            {
                string[] fileElem = s[i].Split(new char[] { '\\' });
                string filename = fileElem[fileElem.Length - 1];
                if (Strings.Mid(filename, filename.Length - 3).ToLower() == ".jpg")
                {
                }
            }
        }
        catch (Exception exception1)
        {
            ProjectData.SetProjectError(exception1);
            Interaction.MsgBox(exception1.ToString(), MsgBoxStyle.OkOnly, null);
            ProjectData.ClearProjectError();
        }
    }
Второй:
C#
1
2
3
4
5
6
7
8
9
10
11
    private void Label1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            e.Effect = DragDropEffects.Move | DragDropEffects.Copy | DragDropEffects.Scroll;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }
1
 Аватар для Etrimus
399 / 366 / 54
Регистрация: 23.05.2010
Сообщений: 716
28.02.2011, 14:44
Я вот тоже заинтересовался подобным вопросом.
Как можно сделать так, что бы в многострочный ТекстБокс можно было перетащить файл извне?
Я ставлю у ТекстБокса сойство AllowDrop в true, назначаю ему событие DragDrop, ставлю в нём точку останова, что бы посмотреть, какие есть полезные свойства у DragEventArgs, пытаюсь перетащить файл из проводника Windows, но события не происходит...

Добавлено через 5 часов 41 минуту
Искал в интернете, к сожалению, не нашёл хоть какой-нибудь статейки о перетаскивании. На МСДН есть один огромный пример, в котором перетаскивают из одного ЛистБокса в другой. Это не то, что нужно, да и не понял я его
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.02.2011, 15:43
Лучший ответ Сообщение было отмечено как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Windows.Forms;
 
namespace FileToTextBox
{
    public partial class Form1 : Form
    {
        public Form1 () {
            InitializeComponent();
            textBox1.AllowDrop = true;
            textBox1.DragEnter += new DragEventHandler(textBox1_DragEnter);
            textBox1.DragDrop += new DragEventHandler(textBox1_DragDrop);
        }
 
        private void textBox1_DragEnter ( object sender, DragEventArgs e ) {
            if (e.Data.GetDataPresent(DataFormats.FileDrop) &&
                ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move))
 
                e.Effect = DragDropEffects.Move;
        }
 
        private void textBox1_DragDrop ( object sender, DragEventArgs e ) {
            if (e.Data.GetDataPresent(DataFormats.FileDrop) && e.Effect == DragDropEffects.Move) {
                string[] objects = (string[])e.Data.GetData(DataFormats.FileDrop);
                // В objects хранятся пути к папкам и файлам
                textBox1.Text = null;
                for (int i = 0; i < objects.Length; i++)
                    textBox1.Text += objects[i] + "\r\n";
            }
        }
    }
}
8
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
28.02.2011, 19:00  [ТС]
Спасибо огромнейшее!!!!!!!!!

Добавлено через 1 час 16 минут
Вот только как проверить расширение файла.. а то у меня перетаскивают .dll, а мне надо .zip
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.02.2011, 19:06
C#
1
2
3
if (string.Equals(Path.GetExtension(objects[i]), ".zip", StringComparison.InvariantCultureIgnoreCase)) {
     // ZIP
}
2
 Аватар для Etrimus
399 / 366 / 54
Регистрация: 23.05.2010
Сообщений: 716
28.02.2011, 19:30
SSTREGG, спасибо за рабочий пример кода!
Если не затруднит, не могли бы вы более подробно прокомментировать его, либо указать, где почитать то, что даст понимание работы с drag-and-drop, потому что из кода понятны только некоторые отрывочные вещи (хоть бы и на английском)?
Мне просто нужно при перетаскивании в текстбокс помещать содержимое текстового файла, как я понимаю, надо для этого его сначала в потоке прочесть, а потом уже заносить в текстбокс.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.02.2011, 20:18
Etrimus, http://msdn.microsoft.com/ru-r... s.71).aspx - раздел Dropping Data. Пример можно переписать даже короче судя по содержимому статьи, но это уже на личное усмотрение.
Цитата Сообщение от Etrimus Посмотреть сообщение
Мне просто нужно при перетаскивании в текстбокс помещать содержимое текстового файла, как я понимаю, надо для этого его сначала в потоке прочесть, а потом уже заносить в текстбокс.
В событии DragDrop проверяй первый элемент массива: файл это или папка, если файл то читаем с помощью Stream'а и выводим в TextBox.
1
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
01.03.2011, 17:15  [ТС]
Спасибо. Написал прогу с ICSharpCode.SharpZipZip.dll:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
namespace Dearchivator
{
    partial class Form1
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
            this.SuspendLayout();
            // 
            // pictureBox1
            // 
            this.pictureBox1.Image = global::Irn.Properties.Resources.Im;
            this.pictureBox1.Location = new System.Drawing.Point(12, 12);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(218, 62);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(241, 86);
            this.Controls.Add(this.pictureBox1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "Form1";
            this.Text = "Деархиватор";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private System.Windows.Forms.PictureBox pictureBox1;
        private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
using System;
 
namespace Dearchivator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            pictureBox1.AllowDrop = true;
            pictureBox1.DragEnter += new DragEventHandler(textBox1_DragEnter);
            pictureBox1.DragDrop += new DragEventHandler(textBox1_DragDrop);
        }
 
        string ZipFileName = "";
 
        private void textBox1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop) &&
                ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move))
 
                e.Effect = DragDropEffects.Move;
        }
 
        private void textBox1_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop) && e.Effect == DragDropEffects.Move)
            {
                try
                {
                    string[] objects = (string[])e.Data.GetData(DataFormats.FileDrop);
                    // В objects хранятся пути к папкам и файлам
                    ZipFileName = "";
                    for (int i = 0; i < objects.Length; i++)
                    {
                        ZipFileName += objects[i];
                        if (string.Equals(Path.GetExtension(objects[i]), ".zip", StringComparison.InvariantCultureIgnoreCase))
                        {
                            DialogResult dr = folderBrowserDialog1.ShowDialog();
                            if (dr == System.Windows.Forms.DialogResult.OK)
                            {
                                new FastZip().ExtractZip(ZipFileName, folderBrowserDialog1.SelectedPath, null);
                            }
                            MessageBox.Show(null, "Готово", "Выполнено успешно", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show(null, "Пожалуйста, укажите файл .zip", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        }
                    }
                }
                catch { MessageBox.Show(null, "Какая-то ошибка", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Stop); }
            }
        }
 
        private void Form1_Load(object sender, System.EventArgs e)
        {
            this.TopMost = true;
        }
    }
}
и ещё ресурс ResX
1
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
08.03.2011, 11:17  [ТС]
А как переместить из формы в эксплорер???
Заранее спасибо.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
08.03.2011, 15:08
Цитата Сообщение от mak326428 Посмотреть сообщение
А как переместить из формы в эксплорер???
Для этого файл должен существовать. Во вложении пример перетаскивания файлов из\в Explorer.

Для перетаскивания нужно зажать контрол и начать тянуть мышью из листбокса.
Вложения
Тип файла: rar DaDExplorer.rar (37.2 Кб, 488 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2011, 15:08
Помогаю со студенческими работами здесь

Как реализовать Drag and drop для объектов
Здравствуйте,подскажите,пожалуйста,как реализовать Drag and drop для объектов asp.net winforms ,на бчном c# это через mouse move mouse...

MFC Drag and Drop Как его реализовать?
Доброе время суток. Как реализовать Drag and Drop между двумя List Control'ами?

Как реализовать Drag'n'Drop для ListBox?
Опять я. Все отталкивал на потом &quot;как сделать&quot;, да так и не доходят руки и мозги:) Мне нужно сделать оычный драгдроп для листbокса. ...

Игра-паззл. Как реализовать Drag&Drop
Задали сделать такую задачу: Создать приложение WinForms, позволяющее собрать паззл из девяти квадратных фрагментов. Каждый фрагмент...

Как реализовать технологию Drag and Drop на картинку в пределах окна?
Есть приложение для информационного киоска, есть картинка, размер которой превышает стандартный размер экрана. Нужно сделать так, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru