EditManager
(ICSSoft.STORMNET.Windows.Forms.Binders.EditManager
, менеджер редактирования) — специализированный класс для непрерывного связывания контролов со свойствами объекта данных.
Метод EditManager.Change
Если значение объекта данных изменено программным образом, то для обновления значения на форме необходимо сообщить EditManager
, что значение (либо весь объект изменились). Это делается вызовом у EditManager
метода Change()
. Если метод вызван без параметров, то обновляются все контролы. Если с параметром (именем свойства), то только контролы, «подвязанные» к указанному свойству. Если параметром указано имя мастера, то обновляются все контролы всех мастеровых свойств этого мастера.
Пример использования данного метода представлен в статье Особенности задания значения по умолчанию.
Особенность: метод без параметра, либо с одним параметром-строкой не вызовет AfterChangeProperties()
.
Метод EditManager.SetReadonlyFlagProperties
На форме редактирования иногда необходимы поля, которые блокируются через EditManager. Однако возникают ситуации, когда при использовании EditManager.SetReadonlyFlagProperties
после сохранения объекта на какой-то время снимается блокировка и значение может быть изменено. Для предотвращения таких ситуаций существует метод AddControlsToForcedReadOnlyList
, блокирующий изменение флаг ReadOnly
. Данный метод работает со списком контролов. Список в свою очередь можно редактировать: добавлять или удалять контролы.
void EditManager.SetReadonlyFlagProperties(bool readonlyflag, params string[] properties)
Параметр readonlyflag
определяет значение, которое будет установлено свойству ReadOnly у контролов, редактирующих поля, указанные в properties
.
Пример использования данного метода представлен в статье Формы и классы на рабочем столе приложения.
Метод AddControlsToForcedReadOnlyList
/// <summary>
/// Добавить элементы в список контролов, у которых EditManager не будет менять флаг ReadOnly.
/// </summary>
/// <param name="controlList">Новые элементы.</param>
public void AddControlsToForcedReadOnlyList(List<Control> controlList)
Пример:
public override void Edit(ICSSoft.STORMNET.DataObject dataobject, string contpath, string propertyname, object tag)
{
base.Edit(dataobject, contpath, propertyname, tag);
if (DataObject != null)
{
EditManager.AddControlsToForcedReadOnlyList(new List<Control>() { ctrlФИО });
}
}
Метод RemoveControlsFromForcedReadOnlyList
Данный метод позволяет удалить контролы, добавленные методом AddControlsToForcedReadOnlyList.
/// <summary>
/// Удалить элементы из списка контролов, у которых EditManager не будет менять флаг ReadOnly.
/// </summary>
/// <param name="controlList">Удаляемые элементы.</param>
/// <param name="readOnlyFlag">Флаг, который у удаляемых из списка элементов нужно проставить в свойство ReadOnly.</param>
public void RemoveControlsFromForcedReadOnlyList(List<Control> controlList, bool readOnlyFlag = false)
Создание формы редактирования объекта
Существует несколько способов “ручного” создания формы редактирования объекта с возможностью связать ее со свойствами существующего объекта данных.
Связывание через программный код
1.Разместить необходимые элементы управления на форме;
2.Создать экземпляр класса ICSSoft.STORMNET.Windows.Forms.Binders.EditManager
(менеджер редактирования — специализированный класс для непрерывного связывания контролов со свойствами объекта данных).
В конструкторе обязательным параметром является класс данных, на который настраивается менеджер редактирования.
Пример:
em = new StormNetForms.Binders.EditManager(typeof(CDDD));
3.Связать контролы со свойствами объекта данных.
Для этого необходимо вызвать у EditManager метод AddControl
. Параметрами передаются: структура ICSSoft.STORMNET.Windows.Forms.Binders.ControlForBindStruct
.
Примеры связывания контрола со свойством объекта данных:
em.AddControl(new StormNetForms.Binders.ControlForBindStruct(txtName, "Text"), "Наименование");
em.AddControl(new StormNetForms.Binders.ControlForBindStruct(txtCapacity, "Text"), "Объем");
4.Установить в свойство EditManager.DataObject
объект данных, который требуется отредактировать.
После выполнения этих действий контролы будут подключены к свойствам объекта данных посредством EditManager
, соответственно, когда пользователь будет редактировать значения в контролах, одновременно будут изменяться значения свойств объекта данных.
Если значение объекта данных изменено программным образом, то для обновления значения на форме необходимо выполнить EditManager.Change
.
EditManager
имеет события, позволяющие определить изменение значений свойств объекта данных. Это событие BeforeChangePropertyValue
, срабатывающее перед установкой значения и AfterChangeProperty
, срабатывающее после установки значения.
Также, можно связывать вручную намазанные контролы с другими контролами, предоставляющими свой EditManager
, например с GroupEditBase
, тогда можно обеспечить редактирование значений объекта данных, находящегося в списке, через внешние контролы.
Связывание через окно редактирования свойств
Вместо того, чтобы конструировать EditManager из кода, его также можно «набросить» на форму как контрол и связать контролы со свойствами через стандартное окно редактирования свойств в среде Visual Studio.
Если в окне редактирования свойств EditManager в поле Bindings.
this.editManagerMain.Bindings = new ICSSoft.STORMNET.Windows.Forms.Design.Binds("", null, null);
на следующую, где указано, с каким представлением работает EditManager:
this.editManagerMain.Bindings = new ICSSoft.STORMNET.Windows.Forms.Design.Binds("C__КлиентE", typeof(IIS.TryFilter.Клиент), null);
Далее через поле Bindings.
Для связывания полей ввода со свойствами объекта генерируется код, аналогичный следующему:
Binds(string viewname, Type dataobjectType, OneBind[] binds) (параметры для создания объектов класса OneBind аналогичны параметрам структуры ControlForBindStruct).
this.editManagerMain.Bindings = new Binds("C__КлиентE", typeof(IIS.TryFilter.Клиент),
new ICSSoft.STORMNET.Windows.Forms.Design.OneBind[]
{
new OneBind(this.textBoxClientFIO, typeof(System.Windows.Forms.TextBox), "Text", null, "ФИО"),
new OneBind(this.textBoxClientAdress, typeof(System.Windows.Forms.TextBox), "Text", null, "Прописка")
});