Метод drag and drop в экселе

Обновлено: 06.07.2024

Придя впервые к технологии DRAG and DROP столкнулся с очень тяжелым её описанием (Это мое субъективное мнение. Прошу с ним не соглашаться, а перечитать все что только можно и посмотреть на этот вопрос с многих сторон). И решил написать пару статей, нацеленных на начинающих разработчиков, кто хочет познать дзен.

Статья будет состоять из двух частей:

  • Метод создания DRAG and DROP эффектов.
  • Практическое применение полученных знаний для создание сортировки при помощи DRAG and DROP

Параграф №1 Метод создания DRAG and DROP эффекта

Перед началом глубокого разбора, посмотрим поверхностно. Представьте себя в роли грузчика, вам необходимо перемесить коробку с одного места на другое. Для грузчика это «Ну взял, ну перенес. Готово!», а для программиста “Подошел к коробке, наклонился, взял коробку, поднял коробку, прошел N шагов, наклонился, отпустил коробку.”. Я это к тому, что перед началом работы проиграйте все в голове, по шагам и вы станете гораздо ближе к истине.

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

При создании DRAG and DROP первым шагом необходимо объекту, который мы будем перемещать, присвоить значение draggable='true'.


,
На первом этапе я хочу показать сам процесс, а после мы его распространим на все объекты. Мы сейчас работаем в JS и как вам известно, в браузере существуют различные события, к которым мы можем привязать свои последовательности действий. Давайте разберем необходимые события для создания DRAG and DROP:

dragstart — происходит, когда пользователь начинает перетаскивать элемент.
drag — происходит, когда элемент перетаскивается.
dragend — происходит, когда пользователь закончил перетаскивание элемента.
dragenter — происходит, когда перетаскиваемый элемент попадает в целевой объект.
dragleave — происходит, когда перетаскиваемый элемент покидает целевой объект.
dragover — происходит, когда перетаскиваемый элемент находится над целью.
drop — происходит, когда перетаскиваемый элемент падает на целевой объект.

Теперь очень важная информация! События делятся на две группы. Для перемещаемого элемента (тот кого мы перетаскиваем): dragstart, Drag, Dragend. Для принимающего элемента (куда перетаскиваем): Dragenter, Dragleave, Dragover, Drop. И эти события не могут работать наоборот, но они могут работать друг без друга.

К примеру: Необходимо переместить объект и оставить его там, где мы отпустили кнопку мыши. Эта задача не требует принимающей части.


Бесспорно, пример сделан на коленке, но он замечательно иллюстрирует не обязательность принимающего объекта.

Параграф №2. Не работает DROP в DRAG and DROP

Когда вы попробуете все события, вы обнаружите что drop не работает. Это разработчики данного метода делают атата тем, кто решил «И это всё… Хух, ерунда».

Ну тут все просто, перед событием drop необходимо на этот же элемент повесить событие

[/vba] Автор - Hugo
Дата добавления - 21.01.2017 в 14:18

Скорей всего я Вам ответил на cyberforum:

(Здорово, работает, но к сожалению есть минусы:
- при выполнении макроса, сам Excel блокируется, что не позволит, например, перетащить файл с рабочего стола.
- ну самая печалька, что файла то не видно в папке, я имею виду в окне "Кидай сюда!")

Скорей всего я Вам ответил на cyberforum:

(Здорово, работает, но к сожалению есть минусы:
- при выполнении макроса, сам Excel блокируется, что не позволит, например, перетащить файл с рабочего стола.
- ну самая печалька, что файла то не видно в папке, я имею виду в окне "Кидай сюда!") Булат

Скорей всего я Вам ответил на cyberforum:

(Здорово, работает, но к сожалению есть минусы:
- при выполнении макроса, сам Excel блокируется, что не позволит, например, перетащить файл с рабочего стола.
- ну самая печалька, что файла то не видно в папке, я имею виду в окне "Кидай сюда!") Автор - Булат
Дата добавления - 22.01.2017 в 03:51

Спасибо Вам за прозорливость.

Спасибо Вам за прозорливость. Булат

Спасибо Вам за прозорливость. Автор - Булат
Дата добавления - 22.01.2017 в 03:57

Суть в том, что с основным файлом будут работать, разные, простите меня, "косячники" и надо чтобы они не искали папку в которую надо положить файл а просто перетащили в окошко, нажали "ок" и все.
А еще есть такие пользователи, для которых создание простой гиперссылки на файл, вообще верх совершенства по владению Excel (это к теме если не заморачиваться с Drag and drop)

Суть в том, что с основным файлом будут работать, разные, простите меня, "косячники" и надо чтобы они не искали папку в которую надо положить файл а просто перетащили в окошко, нажали "ок" и все.
А еще есть такие пользователи, для которых создание простой гиперссылки на файл, вообще верх совершенства по владению Excel (это к теме если не заморачиваться с Drag and drop) Булат

Суть в том, что с основным файлом будут работать, разные, простите меня, "косячники" и надо чтобы они не искали папку в которую надо положить файл а просто перетащили в окошко, нажали "ок" и все.
А еще есть такие пользователи, для которых создание простой гиперссылки на файл, вообще верх совершенства по владению Excel (это к теме если не заморачиваться с Drag and drop) Автор - Булат
Дата добавления - 22.01.2017 в 04:07


Булат, где ещё Вы разбросали свой вопрос? Читайте Правила форума, в частности, п.5s
Булат, где ещё Вы разбросали свой вопрос? Читайте Правила форума, в частности, п.5s Pelena
Булат, где ещё Вы разбросали свой вопрос? Читайте Правила форума, в частности, п.5s Автор - Pelena
Дата добавления - 22.01.2017 в 07:27 Булат, где ещё Вы разбросали свой вопрос? Читайте Правила форума, в частности, п.5s

Прошу простить меня великодушно, обещаю больше так не делать, честно, честно

Булат, где ещё Вы разбросали свой вопрос? Читайте Правила форума, в частности, п.5s

Прошу простить меня великодушно, обещаю больше так не делать, честно, честно Булат

Булат, где ещё Вы разбросали свой вопрос? Читайте Правила форума, в частности, п.5s

Прошу простить меня великодушно, обещаю больше так не делать, честно, честно Автор - Булат
Дата добавления - 22.01.2017 в 07:41

Булат,
Вы меня не поняли немного. Предложенный вариант от Hugo, и есть использование стандартного диалого открытия файла. Обработать полученный путь, перенести указанный файл в "хранилище" и оформить туда ссылку каким-либо образом -это фопрос реализации скрипта , и это возможно. Drag and Drop реализуем при определенных умениях через дополнительные Controls Булат,
Вы меня не поняли немного. Предложенный вариант от Hugo, и есть использование стандартного диалого открытия файла. Обработать полученный путь, перенести указанный файл в "хранилище" и оформить туда ссылку каким-либо образом -это фопрос реализации скрипта , и это возможно. Drag and Drop реализуем при определенных умениях через дополнительные Controls bmv98rus

Замечательный Временно просто медведь , процентов на 20.

Я думаю что если использовать диалог для указания файла - то этому неумёхе-пользователю придётся в этом диалоге искать по дереву свой файл, что не факт что получится
Но если заранее известно что файл будет всегда в одном каталоге - то можно сразу этот каталог и подставить, и так обычно и делают.
Ну а как там на самом деле будет происходить процесс - нам неведомо. Я думаю что если использовать диалог для указания файла - то этому неумёхе-пользователю придётся в этом диалоге искать по дереву свой файл, что не факт что получится
Но если заранее известно что файл будет всегда в одном каталоге - то можно сразу этот каталог и подставить, и так обычно и делают.
Ну а как там на самом деле будет происходить процесс - нам неведомо. Hugo Я думаю что если использовать диалог для указания файла - то этому неумёхе-пользователю придётся в этом диалоге искать по дереву свой файл, что не факт что получится Я думаю что если использовать диалог для указания файла - то этому неумёхе-пользователю придётся в этом диалоге искать по дереву свой файл, что не факт что получится Я думаю что если использовать диалог для указания файла - то этому неумёхе-пользователю придётся в этом диалоге искать по дереву свой файл, что не факт что получится

Даа, согласен Автор - Булат
Дата добавления - 24.01.2017 в 04:43

Я понял Вас и согласен, что тему можно было закрыть ответом "Да, возможно" , просто увидел, что идея осуществима, вот и начал развивать

Я понял Вас и согласен, что тему можно было закрыть ответом "Да, возможно" , просто увидел, что идея осуществима, вот и начал развивать Булат

Я понял Вас и согласен, что тему можно было закрыть ответом "Да, возможно" , просто увидел, что идея осуществима, вот и начал развивать Автор - Булат
Дата добавления - 24.01.2017 в 04:46

Чтобы пользователь мог перетаскивать элемент управления всякий раз, когда он кликнет на него, установите свойство этого элемента управления DragMode равным 1. Это действие включит режим автоматического перетаскивания, т.е. сделает перетаскивание возможным всегда.

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

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

При обсуждении операций drag-and-drop очень важны два элемента: source и target.

Элемент управления, который перетаскивается.

Объект, на который перетаскивается элемент управления. Этот объект идентифицируется событием DragDrop и может быть формой или другим элементом управления.

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

Событие DragDrop получает три параметра:: oSource, nXCoord и nYCoord. Параметр oSource ссылается на элемент управления, который был высвобожден над целью. Параметры nXCoord и nYCoord содержат, соответственно, горизонтальную и вертикальную координаты указателя мыши над целью.

Т.к. oSource является объектом, то вы используете его просто как элемент управления, на свойства которого можно сослаться или вызвать один из его методов. Например, следующие операторы в коде события DragDrop проверяют не высвободил ли пользователь перетаскиваемый элемент управления над самим собой:

Все возможные типы элементов управления, на которые указывает параметр oSource, имеют свойство Visible. Следовательно, вы можете сделать элемент управления невидимым если высвободить его над определенной частью формы или над другим элементом управления. Следующая строка в коде события DragDrop элемента управления Image является причиной того, что высвобождаемый над изображением элемент управления становится невидимым:

Когда вы разрешаете функциональность drag-and-drop, то можете помочь пользователю вашего приложения, включив в него визуальное объяснение того где он может, а где не может высвобождать элемент управления. Лучший способ для этого - это изменение свойства DragIcon в коде события DragOver.

Следующий код в событии DragOver элемента управления показывает пользователю, что перетаскиваемый элемент управления находится не над той целью, над которой его можно высвободить. В этом примере cOldIcon - это свойство формы, определенное пользователем.

Ручная установка свойства DragMode дает больше возможностей по управлению перетаскиванием по сравнению с Автоматической установкой. Ручная установка позволяет указать когда элемент управления можно перетаскивать, а когда - нет. (Когда DragMode установлен в Автоматический режим, то элемент управления возможно перетаскивать до тех пор, пока этот режим не сменится.)

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

Для того, чтобы разрешить перетаскивание в коде не изменяйте умалчиваемое значение свойства DragMode (0 - Ручной). Затем задействуйте метод Drag, в котором можно начать или завершить перетаскивание элемента управления.

Если параметр nAction равен 1, то метод Drag инициирует перетаскивание элемента управления. Если параметр nAction равен 2, то элемент управления высвободится и случится событие DragDrop. Параметр nAction равный 0 отменяет перетаскивание. Эффект подобен тому, который дает присвоение параметру значения 2, но при этом событие DragDrop не возникнет.

Чтобы произвести операцию drag and drop из списка (list box) лучше всего вызывать метод Drag в коде события MouseMove исходного списка (list box) после того как будет определено, что кнопка мыши нажата. Для примера, смотрите форму Lmover.scx в папке . \Samples\Solution\Controls\Lists.

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

Этот код может не дать желаемого эффекта из-за того, что левый верхний угол элемента управления будет спозиционирован на указатель мыши. А вот следующий код позиционируетна указатель мыши центр элемента управления:

Этот код будет работает наилучшим образом когда свойство DragIconустановлено в значение отличное от умалчиваемого (серый прямоугольник). Если используется серый прямоугольник, то пользователь обычно хочет переместить элемент управления точно в конечную позицию серого прямоугольника. Чтобы достичь этого, запишите начальную позицию указателя мыши в исходном элементе управления, а затем используйте эту позицию как смещение при конечном позиционировании элемента управления. Пример такого действия приведен в форме Ddrop.scx, расположенной в папке . \Samples\Solution\Forms.

Для записи начальной позиции мыши

Установите ручной режим перетаскивания элемента управления.

Объявите в форме два свойства-переменные n DragX и n DragY .

Начните перемещение когда произойдет событие MouseDown. При этом, сохраните в коде этого события значение координат nXCoord и nYCoord, соответственно, в свойствах-переменных n DragX и n DragY .

для выполнения операций перетаскивания в приложениях на основе Windows необходимо выполнить обработку ряда событий, особенно DragEnter DragLeave событий, и DragDrop . Работая со сведениями, доступными через аргументы этих событий, можно значительно упростить операции перетаскивания.

Перетаскивание данных

Все операции перетаскивания начинаются с переноса данных. Функция, позволяющая собирать данные при начале перетаскивания, реализуется в DoDragDrop методе.

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

Некоторые элементы управления имеют собственные события перетаскивания. ListView TreeView Для элементов управления и, например, имеется ItemDrag событие.

Начало операции перетаскивания

В MouseDown событии для элемента управления, в котором начнется перетаскивание, используйте DoDragDrop метод, чтобы задать перетаскиваемые данные и разрешить перетаскивание разрешенных эффектов. Дополнительные сведения см. в разделах Data и AllowedEffect.

В следующем примере показан запуск операции перетаскивания. Элемент управления, в котором начинается перетаскивание Button , является элементом управления, перетаскиваемые данные — это строка, представляющая Text свойство Button элемента управления, и разрешенные эффекты можно копировать или перемещать.

В качестве параметра в методе можно использовать любые данные DoDragDrop . в приведенном выше примере Text Button используется свойство элемента управления (вместо жесткого кодирования значения или извлечения данных из набора данных), поскольку свойство было связано с расположением, которое перетаскивается из ( Button элемент управления). Учитывайте это при реализации операций перетаскивания в приложениях Windows.

Пока действует операция перетаскивания, можно выполнить обработку QueryContinueDrag события, которое "запрашивает разрешение" системы, чтобы продолжить операцию перетаскивания. При обработке этого метода также является подходящая точка для вызова методов, которые влияют на операцию перетаскивания, например, расширение объекта TreeNode в TreeView элементе управления при наведении курсора мыши на него.

Завершение перетаскивания данных

После начала перетаскивания данных из расположения в форме Windows Forms или элементе управления их требуется куда-то поместить. При попадании курсора в область формы или элемента управления, которые правильно настроены для размещения данных, вид курсора изменится. любая область в Windows форме или элементе управления может быть сделана для приема пропущенных данных путем установки AllowDrop свойства и обработки DragEnter DragDrop событий и.

Завершение операции перетаскивания

Присвойте AllowDrop свойству значение true.

В DragEnter событии для элемента управления, в котором будет выполняться перетаскивание, убедитесь, что перетаскиваемые данные имеют допустимый тип (в данном случае Text ). Затем код задает результат, который будет выполняться при выполнении перетаскивания в значение в DragDropEffects перечислении. Дополнительные сведения см. в разделе Effect.

Вы можете определить собственное DataFormats , указав собственный объект в качестве Object параметра SetData метода. При этом необходимо убедиться, что указанный объект является сериализуемым. Дополнительные сведения см. в разделе ISerializable.

В DragDrop событии для элемента управления, в котором будет выполняться удаление, используйте GetData метод для получения перетаскиваемых данных. Дополнительные сведения см. в разделе Data.

В приведенном ниже примере элемент TextBox управления — это элемент управления, к которому выполняется перетаскивание (где произойдет удаление). Код задает Text свойство TextBox элемента управления, равное перетаскиваемых данным.

Кроме того, можно работать со KeyState свойством, чтобы, в зависимости от нажатых клавиш во время операции перетаскивания, были выполнены определенные эффекты (например, для копирования перетаскиваемых данных при нажатии клавиши CTRL).

Читайте также: