Получение данных из секции карточки
После получения данных карточки, либо её объектной модели можно получить доступ к данным её секций.
Базовый API
На данном уровне API, секция карточки представлена типом SectionData
. Получить данные секции карточки можно следующим образом:
SectionData section = card.Sections[sectionId]; (1) (2) (3)
1 | card — данные карточки, из которой выбираются данные секции. |
||
2 | Sections — коллекция всех секций карточки. |
||
3 | sectionId — идентификатор секции, данные которой должны быть получены.
|
-
Получить все её строки (для иерархической секции будут возвращены строки только первого уровня):
RowDataCollection rows = section.Rows;
-
Получить все строки без учета иерархии, т.е. для иерархической секции будут возвращены все строки:
RowDataCollection rows = section.GetAllRows();
-
Найти строку, пользуясь клиентской фильтрацией, либо строки, используя поиск по секции.
-
Получить строку секции по идентификатору строки:
RowData row = section.GetRow(rowId);
-
Добавить новую строку, либо удалить существующую, воспользовавшись методами
CreateRow
иDeleteRow
, соответственно. -
Выбрать первую строку — востребовано для плоской секции, которая содержит единственную строку:
RowData row = section.FirstRow;
Полный список методов и свойств класса секции см. в описании типа
SectionData
.
С большой долей вероятности, целью получения данных секции (SectionData
) является доступ к полям её строк. В качестве примера, рассмотрим полный код, который выводит названия (поле Name
) всех подпапок первого из карточки папок:
CardData card = userSession.CardManager.GetCardData(new Guid("DA86FABF-4DD7-4A86-B6FF-C58C24D12DE2")); (1)
SectionData section = card.Sections[new Guid("FE27631D-EEEA-4E2E-A04C-D4351282FB55")]; (2)
RowData row = section.GetRow(new Guid("FFFFFFFF-FFFF-0003-FFFF-000000000000")); (3)
foreach (var folderRow in row.ChildRows) (4)
{
Console.WriteLine(folderRow["Name"]); (5)
}
1 | Получаем данные карточки папок (см. Описание полей стандартной карточки). |
2 | Выбираем секцию "Папки". |
3 | Выбираем строку "Папки". Данная строка содержит подстроки, отражающие папки одноименного раздела в дереве папок Windows-клиента. |
4 | Перебираем строки первого уровня. Коллекцию строк без учета иерархии можно получить из свойства AllChildRows . |
5 | Получаем значение конкретного поля Name (Название) строки и выводим его (значение) в консоль. |
Таким образом, чтобы получить данные из секции карточки, достаточно выбрать из неё конкретную строку (либо перебирать их все) и получить значение поля по его псевдониму.
Объектная модель
Способ получения данных из секции карточки на этом уровне API зависит от способа представления этой секции в объектной модели карточки:
-
Для предоставления данных отдельной секции объектная модель карточки содержит свойство, возвращающее сущность секции, а точнее коллекцию сущностей её строк. Таким образом данные секции могут быть получены из свойства класса объектной модели карточки. Такой способ реализации является основным для объектной модели карточек библиотеки Базовые объекты.
-
Объектная модель карточки не содержит отдельных свойств, возвращающих сущность секции (как в первом случае), но класс объектной карточки унаследован от класса
BaseCard
. В этом случае коллекция строк секции может быть получена с помощью методаGetSection
.Метод
GetSection
не предназначен для работы с иерархическими секциями — при получении секции данного типа, будут возвращены строки только первого уровня иерархии. Для работы с иерархическими секциями потребуется самостоятельно разработать объектную модель карточки (первый способ получения данных секции), либо использовать базовый API.
Чтобы сравнить приведенные способы получения данных секции карточки, рассмотрим сценарий, в котором нужно получить названия всех основных файлов карточки типа Документ.
В классе объектной модели карточки типа Документ — Document
— объявлено свойство Document.Files
, возвращающее коллекцию файлов документа (типа DocumentFile
), из коллекции файлов может быть получено название.
Document document = objectContext.GetObject<Document>(cardId); (1)
ObjectCollection<DocumentFile> files = document.Files; (2)
foreach (DocumentFile file in files)
{
if (file.FileType = DocumentFileType.Main)
Console.WriteLine(file.FileName); (3)
}
1 | Получаем карточку типа Документ по идентификатору карточки. |
2 | Получаем коллекцию всех файлов документа. |
3 | Выбираем основные файлы и выводим их название — свойство FileName . |
Для реализации сценария вторым способом потребуется самостоятельно получить название из Карточки файла с версиями:
BaseCard card = objectContext.GetObject<BaseCard>(cardId); (1)
var files = (IEnumerable<BaseCardSectionRow>)card.GetSection(new Guid("A6FA8BAF-2EA4-4071-AA3E-5C4E71646A90")); (2)
foreach (var file in files)
{
if ((int)file["FileType"] = 0) (3)
{
var versionedFileCard = userSession.CardManager.GetCard(file.GetGuid("FileId")) as VersionedFileCard; (4)
Console.WriteLine(versionedFileCard.CurrentVersion.Name); (5)
}
}
1 | Получаем карточку (используется из первого примера)
Тип возвращаемого объекта не уточняется намеренно, для демонстрации возможностей базового класса. |
2 | Получение всех строк коллекционной секции Файлы карточки типа Документ по идентификатору секции. |
3 | Проверяем тип файла: 0 — основной, 1 — дополнительный. |
4 | Получаем карточку файла с версиями. |
5 | Выводим название файла. |
-
Получить строки этой секции с помощью метода
BaseCard.GetSection
:var files = (IEnumerable<BaseCardSectionRow>)card.GetSection(new Guid("A6FA8BAF-2EA4-4071-AA3E-5C4E71646A90"));
-
Получить значение нужного поля из строки:
int type = (int)file["FileType"]; (1) Guid fileId = file.GetGuid("FileId"); (2)
1 Способ получения значения поля по псевдониму с приведением к нужному типу. 2 Способ получения значение поля, если заранее известно, что тип поля — Guid
.Чтобы получить родительский объект, например документ типа
Document
, если есть объектная модель файла этого документа типаDocumentFile
, используйте методObjectHelper.GetParent
:DocumentFile documentFile; Document document = ObjectHelper.GetParent<Document>(docFile);