Файл: ...\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)