DragDrop. Декларативное описание
В системе реализовано декларативное описание переноса данных между объектами интерфейса (DragDrop).
На данный момент времени декларативное описание DragDrop возможно на следующих объектах интерфейса:
- Browser
- Schedule
- Timeline
Если на Schedule описан DragDrop переноса элементов календаря между объектами формы, то перенос данных в другие объекты интерфейса осуществляется с нажатой клавишей CTRL.
На рисунке представлено описание DragDrop для формы браузера.
На данной форме можно сформировать список объектов определённых типов, от которых разрешено принятие данных для текущего объекта Базы Знаний.
Для каждого объекта в списке можно указать действие, которое будет выполнено после принятия данных.
Описание параметров формы:
Разрешить перенос данных от | Выполнить действие после переноса | ||
Тип | Тип объекта, от которого разрешен перенос данных. В случае указания любого объекта, данные будут приняты, если они удовлетворяют определённой структуре. Описание структуры будет представлено ниже. | Тип | Тип объекта, который будет вызван после приёма данных. |
Объект | Указание объекта Базы Заний для выполнения после приёма данных. | ||
Параметр | Указание параметра объекта, куда будет передан DataTable принимаемых данных. Можно использовать для вызова пользовательских форм. | ||
Для каждой строки | Если указан данный параметр, то объект будет вызван столько раз, сколько строк в принимаемом массиве данных. В случае выполнения датаблока для обработки принимаемых данных, будет выполнена команда на добавление, если параметр False, в противном случае, команда на выборку. | ||
Объект | Указание объекта Базы Знаний. | Обновить | Признак обновления объекта Базы Заний после приёма данных. |
Описание структуры принимаемых данных объектами интерфейса (Client.Common.Config.DragDropObject):
''' <summary>Структура данных для DragDrop</summary>
Public Structure DragDropObject
''' <summary>Конструктор</summary>
''' <param name="ObjectType">Тип объекта операции DragDrop</param>
''' <param name="ObjectID">ID объекта операции DragDrop. Уникальный для экземпляра каждого объекта</param>
''' <param name="ObjectData">Данные объекта</param>
Public Sub New(ObjectType As DragDropType, ObjectID As Guid, ObjectData As Object)
Me.ObjectType = ObjectType
Me.ObjectID = ObjectID
Me.KBObjectType = Common.KBObjectType.None
Me.KBObjectID = Guid.Empty
Me.ObjectData = ObjectData
End Sub
''' <summary>Конструктор</summary>
''' <param name="ObjectType">Тип объекта операции DragDrop</param>
''' <param name="ObjectID">ID объекта операции DragDrop. Уникальный для экземпляра каждого объекта</param>
''' <param name="KBObjectType">Тип объекта Базы Знаний</param>
''' <param name="KBObjectID">ID объекта Базы Знаний</param>
''' <param name="ObjectData">Данные объекта</param>
''' <param name="Table">Табличные данные</param>
Public Sub New(ObjectType As DragDropType, ObjectID As Guid, KBObjectType As KBObjectType, KBObjectID As Guid, ObjectData As Object, Table As DataTable)
Me.ObjectType = ObjectType
Me.ObjectID = ObjectID
Me.KBObjectType = KBObjectType
Me.KBObjectID = KBObjectID
Me.ObjectData = ObjectData
Me.Table = Table
End Sub
''' <summary>Тип объекта</summary>
Public ObjectType As DragDropType
''' <summary>ID объекта</summary>
Public ObjectID As Guid
''' <summary>Тип объекта Базы Знаний</summary>
Public KBObjectType As KBObjectType
''' <summary>ID объекта Базы Знаний</summary>
Public KBObjectID As Guid
''' <summary>Данные объекта</summary>
Public ObjectData As Object
''' <summary>Табличные данные</summary>
Public Table As DataTable
End Structure
Данную структуру можно сформировать на любой пользовательской форме или в своей библиотеке.
Для принятия данных контролом, в его свойствах нужно выставить: {имя_контрола}.AllowDrop = True.
Пример обработки структуры в контроле на примере Диаграммы Ганта:
''' <summary>Перемещение по контролу при операции DragDrop</summary>
Private Sub jTimeLine_DragOver(sender As Object, e As DragEventArgs) Handles jTimeLine.DragOver
If jTimeLine.AllowDrop AndAlso e.Data.GetDataPresent(GetType(Config.DragDropObject)) Then
' принимаем только структуру Config.DragDropObject
Dim DragDropData As Config.DragDropObject = e.Data.GetData(GetType(Config.DragDropObject))
If Me.IDTimeLine.Equals(DragDropData.KBObjectID) Then
' обработка переноса данных над тем же объектом, откуда данные пришли
If Me.IDInstance.Equals(DragDropData.ObjectID) Then
e.Effect = Windows.Forms.DragDropEffects.All
Else
e.Effect = Windows.Forms.DragDropEffects.None
End If
Else
' принимаем данные только если тип "Объект Базы Знаний"
If DragDropData.ObjectType = DragDropType.KBObject Then
e.Effect = Windows.Forms.DragDropEffects.All
Else
e.Effect = Windows.Forms.DragDropEffects.None
End If
End If
Else
e.Effect = Windows.Forms.DragDropEffects.None
End If
End Sub
В данном примере:
- IDTimeLine - ID Диаграммы Ганта
- IDInstance - ID экземпляра объекта (т.е. одна и та же Диаграмма Ганта открыта с разными параметрами, получаем 2 формы одного и того же объекта Базы Знаний)
''' <summary>Завершение перемещения по TimeLine при операции DragDrop</summary>
Private Sub jTimeLine_DragDrop(sender As Object, e As DragEventArgs) Handles jTimeLine.DragDrop
' принимаем только структуру Config.DragDropObject
If e.Data.GetDataPresent(GetType(Config.DragDropObject)) = False Then Return
Dim DragDropData As Config.DragDropObject = e.Data.GetData(GetType(Config.DragDropObject))
' если записи в таблице отсутсвуют, выходим
If DragDropData.Table.Rows.Count = 0 Then Return False
' далее следует код для обработки принимаемых данных
' {User Code}
End Sub
0 комментариев