вступ
Доброго часу доби, шановні хабрчане. Даний пост не буде особливо відрізняти оригінальністю, унікальністю або геніальністю. Я б назвав його керівництво з користування. Думаю багато бувалі програмісти зроблять безліч зауважень, за що я в цілому буду тільки вдячний, тим більше якщо це буде конструктивна критика. Але, в цілому, мій пост орієнтований більше на початківців програмістів, так як досвідчені швидше за все стикалися з таким завданням і вже вирішили її самі.
Отже, про що ж буде сьогоднішня наша розмова. Як ви зрозуміли з назви, я розповім як реалізувати Drag and Drop мовою C # в Visual Studio. Думаю багато початківці програмісти стикалися з такою проблемою, коли існує кілька списків і ви хочете перетягнути елементи з одного в інший, але придумати як це зробити або знайти зрозумілий мануал не могли. І адже так хочеться, щоб у вашому додатку було все красиво і сучасно, а доводилося обходиться простим вибором елемента і перенесенням його в інший після натискання на кнопку. Сподіваюся сьогодні цим простим керівництвом я зможу все-таки допомогти парочок юних бійців (я і сам такий, як мені здається) і розвіяти будь-які проблеми пов'язані з реалізацією даного функціоналу.
Хочу зауважити, що я не буду детально розглядати як знайти або додати той чи інший елемент на форму, не буду також детально описувати властивості об'єктів.
З чого все починалося
Коротко розповім з чого все починалося і що ми з вами повинні будемо зробити (ТЗ). Почалося все з того, що моїм завданням стала реалізація автомата з напоями, причому повна реалізація, з урахуванням всіх нюансів, таких як заміна напоїв, їх цін, поповнення каси автомата без використання коду і багато іншого, що могло бути опущено при інших обставинах. Але я подумав, якщо робити, то максимально реалістічноі вирішив додати drag and drop грошей з гаманця в слот для грошей з чим довелося неабияк помучатся, але що додало моїй програмі родзинку.
Технічне завдання
У нас є два об'єкти: ListView, який представляє наш гаманець і ListBox, в якому при перетягуванні буде з'являтися назва купюри або монети. Необхідно створити програму, яка дозволить перетягувати елементи з об'єкта ListView в ListBox без додаткових кнопок.
Ну, що ж, виклик прийнятий. Приступимо.
Крок 1 Створення робочої області
Створюємо новий проект Windows Form Applicarion і додаємо на форму наступні елементи:
- ListView. Наш гаманець звідки ми будемо перетягувати грошики. Нагадаю, що всі елементи будуть представлені у вигляді зображень монет і купюр.
- ListBox. Список, куди ми будемо все це перетягувати, в якому будуть відображатися назви номіналів.
- ImageList. Саме звідси ми отримаємо наші зображення грошей.
- Label. Допоміжний елемент, який буде показувати в яку позицію буде додано назву в ListBox.
Крок 2 Підготовка елементів
Прийшов час найважливішою і найскладнішою частини. В цілому, скопіювати і вставити буде не складно, але важливо зрозуміти код! Вижпрограммісти;)
Для ListView:
- MouseDown
- MouseUp
- MouseMove
Для ListBox:
- DragOver
- DragDrop
- DragEnter
- DragLeave
ListView MouseDown
Ця подія будемо відбуватися в той момент, коли ви натиснете на ліву кнопку миші в об'єкті ListView.
ListView MouseUp
Відпустивши кнопку миші ми автоматично «кидаємо» об'єкт.
ListView MouseMove
Рухаючи мишку ми викликаємо цю подію, причому працювати воно починає тільки якщо ми вийшли за межі нашого «гаманця».
Хочу звернути вашу увагу на рядок:
ListBox DragOver
ListBox DragDrop
Додавання перетягуваного об'єкта в новий список. Тут найважливіше це аргумент sender, який є нашим перетягувати елементи. І тут знову включається ваша фантазія. В даному випадку, я просто отримую значення Tag з отриманого об'єкта (пам'ятаєте ми додавали в поле Tag назви номіналів?). Точно таким же чином ви можете реалізувати все, що забажає ваша душа.
ListBox DragEnter, DragLeave
Нарешті, саме останнє, це «скидання» нашого Label. Бо якщо цього не зробити, то він продовжити нам показувати в яке місце списку буде додано файл, навіть якщо файл вже доданий.
висновок
Залишається тільки запустити додаток і упевнитися, що все працює (не забудьте протестувати програму з затиснутим Ctrl). Тепер, зробивши все написане вище, ви зможете адаптувати цей код під свої цілі. Додати лічильники для підрахунку об'єктів, перетягувати об'єкти не тільки зі списків в списки, а й багато іншого тепер можна реалізувати в найкоротші терміни.
Завдання на будинок
1. Додайте облік кількості монет в ListView (за допомогою лічильника або будь-яким іншим зручним способом). Реалізуйте не вилучення монети з ListView, а зменшення їх кількості.
2. Додайте будь-який новий об'єкт (який саме ви повинні визначити самі) і перетягніть в нього зображення з ListView. Кожне нове перетягування повинно видаляти попереднє зображення.
Примітка: Можна додати відразу ListView і додавати в нього фото у вигляді нових елементів. Не забудьте врахувати, що якщо монетка (купюра) були додані раніше, то необхідно не додавати новий елемент, а збільшити кількість старих елементів.
На цьому я закінчую своє керівництво, сподіваюся, що воно комусь буде корисним. Дякую за увагу!