Если требуемый уровень настройки внешнего вида формы редактирования документов превышает возможности, предлагаемые системой Ultima Businessware® (см. раздел Системные инструменты настройки внешнего вида экранных форм), можно создать свою форму редактирования любого документа.
Для упрощения работы в системе реализована следующая иерархия классов:
BaseEditForm
BaseDocumentEditForm
Для реализации формы редактирования документа необходимо унаследовать ее от формы BaseDocumentEditForm и реализовать интерфейс IRecordEditor<Т>, где Т – тип документа.
Система для редактирования документа будет искать форму, реализующую интерфейс IRecordEditor<T>. Если в системе не окажется ни одной такой формы, откроется базовая форма редактирования документа. Если в системе окажется более одной такой формы, то система выдаст ошибку. Это позволяет избежать неочевидного поведения системы при ошибке настройки системы администратором.
Прикладной разработчик может запросить открытие формы редактирования документа через класс DocumentHelper с помощью методов EditDocument<T> и BeginEditDocument<T>, где Т – тип документа, форму редактирования которого требуется открыть. Методы открывают модальную и немодальную формы редактирования соответственно.
Рассмотрим создание формы редактирования документов на примере типа документов Purchase:
В проекте модуля создаем новый объект Windows Form, наследуем его от класса BaseDocumentEditForm (из пространства имен Ultima.Client.Documents) и реализуем интерфейс IRecordEditor<T>:
public partial class PurchaseEditForm : BaseDocumentEditForm, IRecordEditor<PurchaseDocument> { public PurchaseEditForm() { InitializeComponent(); } } |
К созданной форме необходимо подключить источник данных. Для этого добавляем на нее элемент управления bindingSource и подключаем к нему объект метаданных Ultima.Metadata.PurchaseDocument:
Назначаем в параметрах формы добавленный элемент bindingSource в качестве источника данных DataSourse.
Теперь можно добавлять на форму элементы управления. Чтобы разделить свойства документа и его табличную часть, используем элемент управления SplitContainerControl библиотеки DevExpress. Каждый из элементов управления, предназначенный для отображения свойств документа, через свойство элемента DataBindings -> EditValue подключаем к соответствующим свойствам справочника в bindingSorce:
Для элементов управления DictionaryLookupEdit, с помощью которых отображаются склад (StoreID) и поставщик (SupplierID), дополнительно выбираем в свойстве DictionaryType тип справочника, записи которого они отображают – Ultima.Metadata.Store и Ultima.Metadata.Agent соответственно.
В правой части контейнера SplitContainerControl размещаем элемент управления BaseTablePartGridPanel, предназначенный для отображения и редактирования данных табличной части документа. Задаем для него тип табличной части через параметр TablePartType – PurchaseArticleTablePartRow. Для его таблицы (элемент управления GridControl библиотеки DevExpress) подключаем в качестве источника данных табличную часть, выбирая ее через добавленный ранее bindingSource:
По завершении компилируем проект, копируем созданные библиотеки в папку модуля в клиентском приложении Client/ClientModules/TradeTestSolution, перезагружаем метаданные и открываем созданную форму редактирования документа: