Получение данных из секции карточки

После получения данных карточки, либо её объектной модели можно получить доступ к данным её секций.

Базовый API

На данном уровне API, секция карточки представлена типом SectionData. Получить данные секции карточки можно следующим образом:

SectionData section = card.Sections[sectionId]; (1) (2) (3)
1 card — данные карточки, из которой выбираются данные секции.
2 Sections — коллекция всех секций карточки.
3 sectionId — идентификатор секции, данные которой должны быть получены.

Идентификаторы секций карточек базовой поставки Docsvision приведены в разделе Описание полей стандартной карточки.

После получения данных секции можно:
  • Получить все её строки (для иерархической секции будут возвращены строки только первого уровня):

    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 зависит от способа представления этой секции в объектной модели карточки:

  1. Для предоставления данных отдельной секции объектная модель карточки содержит свойство, возвращающее сущность секции, а точнее коллекцию сущностей её строк. Таким образом данные секции могут быть получены из свойства класса объектной модели карточки. Такой способ реализации является основным для объектной модели карточек библиотеки Базовые объекты.

  2. Объектная модель карточки не содержит отдельных свойств, возвращающих сущность секции (как в первом случае), но класс объектной карточки унаследован от класса 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 Выводим название файла.
То есть, чтобы получить данные из секций, если объектная модель секции не реализована, требуется:
  1. Получить строки этой секции с помощью метода BaseCard.GetSection:

    var files = (IEnumerable<BaseCardSectionRow>)card.GetSection(new Guid("A6FA8BAF-2EA4-4071-AA3E-5C4E71646A90"));
  2. Получить значение нужного поля из строки:

    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);