Файл: ...\Samples\Solution\Controls\Lists\Lmover.scx
Данный пример демонстрирует перемещение элементов из одного list box в другой. Пользователь может дважды щелкнуть мышкой на элементе, чтобы переместить его, выбрать один или более элементов и перетянуть их мышкой, или нажать соответствующую кнопку, чтобы перенести элементы из одного list box в другой.
Два list boxes и четыре сопутствующие кнопки сохранены как класс: MoverLists в библиотеке Samples.vcx. Базовый класс для MoverLists - Контейнер. Чтобы была возможность добавлять и удалять элементы списка, свойства RowSourceType обоих lists должны быть равны 0 – None. Если вы хотите заполнить list box значениями из массива или таблицы, вы можете использовать следующий код:
![]() | |
---|---|
*Массив FOR i = 1 to ALEN(myarray) List.AddItem(myarray[i]) ENDFOR *Таблица SCAN List.AddItem(table.field) ENDSCAN |
Чтобы Перемещать Элементы Дважды Щелкнув Мышкой
Ниже приведенный код сопутствует событию DblClick левого list box (lstSource). Аналогичный код сопутствует событию DblClick правого list box (lstSelected).
![]() | |
---|---|
THIS.Parent.lstSelected.AddItem(THIS.List(THIS.ListIndex)) This.RemoveItem(THIS.ListIndex) THIS.Parent.Refresh |
"THIS" относится к lstSource. "THIS.Parent" относится к классу moverlists, которым является контейнер.
Чтобы Переместить Все Элементы Одного Списка в Другой
Следующий код сопутствует событию Click кнопки cmdAddAll:
![]() | |
---|---|
DO WHILE THIS.PARENT.lstSource.ListCount > 0 THIS.PARENT.lstSelected.AddItem; (THIS.PARENT.lstSource.List(1)) THIS.PARENT.lstSource.RemoveItem(1) ENDDO THIS.PARENT.Refresh |
Чтобы Переместить Выделенные Элементы Одного Списка в Другой
Когда вы перемещаете элемент из list box, значение свойства ListCount этого list box уменьшается, а также и индекс ListIndex всех последующих элементов этого списка. Чтобы переместить несколько выделенных элементов, вам необходимо использовать цикл DO WHILE. Следующий код относится к событию Click кнопки cmdAdd:
![]() | |
---|---|
nCnt = 1 DO WHILE nCnt <= THIS.PARENT.lstSource.ListCount IF THIS.PARENT.lstSource.Selected(nCnt) THIS.PARENT.lstSelected.AddItem; (THIS.PARENT.lstSource.List(nCnt)) THIS.PARENT.lstSource.RemoveItem(nCnt) ELSE nCnt = nCnt + 1 ENDIF ENDDO THIS.PARENT.Refresh |
Чтобы Перетаскивать Мышкой Элементы Одного Списка в Другой
Осуществление "перетаскивания" (drag-and-drop) между двумя list boxes включает в себя код, который сопутствует событиям MouseDown, MouseMove, DragOver и DragDrop. Три дополнительных свойства (DragThreshold, MouseX и MouseY) делают использование данного класса более удобным.
Код события MouseDown записывает X и Y координаты курсора мышки в свойства класса.
![]() | |
---|---|
*MouseDown Parameters nButton, nShift, nXCoord, nYCoord THIS.PARENT.MouseX = nXCoord THIS.PARENT.MouseY = nYCoord |
Код события MouseMove проверяет, была ли нажата левая клавиша мышки до начала процедуры перетаскивания. В дополнение, чтобы предотвратить случайное перетаскивание, данный код проверяет, передвинул ли пользователь мышку на растояние больше, чем установленная пороговая величина (свойство threshold) (8 пикселов по умолчанию).
![]() | |
---|---|
*MouseMove Parameters nButton, nShift, nXCoord, nYCoord IF nButton = 1 && Левая клавиша мышки IF ABS(nXCoord - THIS.PARENT.MouseX) > ; THIS.Parent.DragThreshold OR ; ABS(nYCoord - THIS.PARENT.MouseY) > ; THIS.Parent.DragThreshold THIS.Drag ENDIF ENDIF |
Код события DragOver заменяет иконку DragIcon источника, когда курсор мышки входит и покидает "пространство" list box.
![]() | |
---|---|
*DragOver Parameters oSource, nXCoord, nYCoord, nState DO CASE CASE nState = 0 && Входит oSource.DragIcon = THIS.Parent.CanDropIcon CASE nState = 1 && Покидает oSource.DragIcon = THIS.Parent.NoDropIcon ENDCASE |
Код события DragDrop проверяет, чтобы источник перетаскивания не являлся бы list box-ом назначения процесса пететаскивания, и вызывает метод сопутствующий событию Click кнопки cmdAdd (в случае, если текущий список - lstSelected) или кнопки cmdRemove (если - lstSource).
![]() | |
---|---|
*DragDrop Parameters oSource, nXCoord, nYCoord IF oSource.Name != THIS.Name THIS.PARENT.cmdAdd.Click ENDIF |
Смотрите Также
Задачи
Пример Интерактивного Добавления Элементов в List BoxПример Отображения Нескольких Колонок в List Box
Пример Отображения Картинок в List
Пример Заполнения Списка Значениями из Других Источников
Пример Выбора Нескольких Элементов в List Box
Пример Интерактивного Открытия Множественных Файлов
Пример Сортировки Элементов List Box
Пример Treeview/Listbox Перетащить и Оставить (Drag and Drop)