Этот раздел описывает методы и свойства, предназначенные для управления функционалом Множественного Выбора.

Содержание:

Класс ObjectSet<T>

Поскольку экземпляр этого класса является неперсистентным, то разработчик должен самостоятельно позаботится об инициализации его свойств либо воспользоваться классом ObjectSetPersistentOwnerHelper.

Класс ObjectSet<T> предоставляет следующие свойства и методы:

Свойства:

Параметр <Т> указывает тип объектов, которые образуют Выборку.

GlobalContext является вычисляемым свойством. Оно позволяет разделить объекты Выборок на основании подключенных модулей. Чтобы указать, что при подключении определённого модуля все последующие Выборки должны храниться отдельно, необходимо модифицировать коллекцию XafariModule.ObjectSetGlobalContexts. Добавьте в нее соответствующую пару ключ-значение.

LocalContext предназначено для разделения/объединения ссылок на Выборку. Т.е. при определенной ситуации разные экземпляры ObjectSet<T> могут ссылаться на одну и ту же выборку.

OwnerId позволяет привязать Выборку к определенному объекту, т.н. "родителю". В рассмотренном примере фигурировал только один экземпляр класса FilterObject. В реальном проекте таких экземпляров может быть много, и свойства каждого из них должны ссылаться на "свои" Выборки.

SelectionType указывает на способ выбора, т.е. на способ, которым определены объекты, входящие в Выборку. Данное свойство может принимать одно из значений перечисления MultipleSelectionType:

None: способ выбора не определён.

Multiple: выбрано статическое множество объектов.

Criteria: применен критерий, который выбирает динамическое множество объектов.

Criteria задаёт критерий для выбора объектов.

KeyPropertyTypeName является вычисляемым свойством. Оно может содержать значения из перечисления KeyPropertyTypeName. Значение вычисляется на основании типа ключевого поля у выбираемых объектов.

ObjectsSelectableType указывает тип Выборки.

XPObjectSet ссылается на персистентный объект типа XPObjectSet, этот  объект хранится в БД.

Методы:

ОbjectSet(IObjectSpace objectSpace) является конструктором. Параметр objectSpace используется для взаимодействие с БД.

IList GetSelectionObjects() возвращает множество выбранных объектов, которое соответствует текущему экземпляру.

void SetSelectedObject(IList selectedObject) устанавливает статическое множество объектов Выборки. При этом старые объекты удаляются. После вызова метода свойство ObjectsSelectableType автоматически не изменится. Если это важно, то установите новое значение вручную.

int GetObjectSetObjectCount() возвращает количество объектов в Выборке. Используется прямой запрос в БД.

CriteriaOperator GetCriteria(string propertyName) возвращает текущий критерий. Это критерий может быть востребован в дальнейшем для фильтрации других данных.

Класс ObjectSetPersistentOwnerHelper

Как уже говорилось ранее, экземпляр класса ObjectSet<T> не персистентен. Свойства типа ObjectSet<T> определены в некотором классе-владельце (см. класс FilterObject в примере). ObjectSetPersistentOwnerHelper поможет инициализировать объекты класса ObjectSet<T>.

Для успешного использования ObjectSetPersistentOwnerHelper должны быть выполнены следующие условия:

ObjectSetPersistentOwnerHelper предоставляет следующие методы.

public static void CreateObjectSets<O>(O owner, string ownerId): инициализировать все свойства типа ObjectSet<T> в указанном объекте-владельце. Параметры: O указывает тип объекта-владельца, owner это ссылка на объект-владелец, ownerId это идентификатор, он привязывает Выборку к своему объекту-родителю.

Замечание:

свойство LocalContext будет автоматически проинициализировано именем свойства, которое ссылается на объект ObjectSet<T>. Если вы желаете установить собственное значение для свойство LocalContext, то воспользуйтесь атрибутом LocalContextAttribute (см. свойства FilterObject_B и FilterObject_C в примере).

public static void UpdateOwnwerId<O>(O owner): обновляет значение свойства OwnerId у всех экземпляров ObjectSet<T>.

Рассмотрим код класса FilterObject из примера. При загрузке объекта FilterObject требуется проинициализировать все его свойства типов ObjectSet<T>. Для этого перекройте метод OnLoaded() и обратитесь в нем к классу ObjectSetPersistentOwnerHelper.

 

protected override void OnLoaded(){ 

ObjectSetPersistentOwnerHelper.CreateObjectSets(this, this.Session.GetKeyValueAsString(this));}

 

Однако, возможна ситуация, в которой значение ключевого поля у объекта-родителя неизвестно. Тогда вы не можете явно установить значение параметра ownerId. Такое может случиться при создании нового объекта-родителя. Для решения проблемы предлагается сначала проинициализировать свойство OwnerId временным значением:

 

public override void AfterConstruction(){

ObjectSetPersistentOwnerHelper.CreateObjectSets(this, ObjectSetPersistentOwnerHelper.OwnertIdUndefined);

         base.AfterConstruction();

        }

 

После того, как ключевое поле у объекта-родителя станет доступно, обновите свойство OwnerId. Для вызова метода UpdateOwnwerId перегрузите, например, метод OnSaving() базового класса.

 

protected override void OnSaving(){

            base.OnSaving();

            ObjectSetPersistentOwnerHelper.UpdateOwnwerId(this);

        }

 

Дополнительные возможности

ObjectSetOperand

Используйте ObjectSetOperand в коде чтобы получить требуемую Выборку.

 

new ObjectSetOperand(propertyName, new { LocalContext, OwnerId }, KeyPropertyTypeName);

 

Параметры конструктора:

propertyName: имя свойства, которое ссылается на объект, который должен находится в Выборке.

LocalContext, OwnerId, KeyPropertyTypeName это свойства типа ObjectSet<T>, которые ограничивают поиск.

Пользовательская функция ObjectSet()

Использовать данную функцию можно как в режиме runtime,  так и в Design-time. Функция имеет 4 входных параметра, последний не обязателен:

 

ObjectSet([Object_C.Oid],'Context1','89bafc65-28e6-480e-9424-07157d554093') 

 

Первый параметр является ссылкой свойство, по которому осуществляется фильтрация.

Второй параметр указывает имя локального контекста (см. свойство LocalContext у Выборки). Если задача состоит в фильтрации по Выборке, не зависящей от локального контекста, то установите значение 'null'.

Третий параметр указывает ключевое поле объекта-владельца, используйте  строковое представление. Если задача состоит в фильтрации по Выборке, не зависящей от объекта-владельца, то установите значение 'null'.

Четвертый параметр (необязательный) указывает тип ключевого поля объектов Выборки, используйте  строковое представление. Например, если надо указать тип Int, то установите значение 'int'. Фреймворк полагает, что значением по умолчанию является Guid.