Программирование заполнения зависимых полей


В данной статье мы изучим возможности FossLook по автоматическому заполнению значения поля в зависимости от введенных данных в других полях на карточке. Ознакомьтесь со статьей "Программирование в FossLook" для получения базовых знаний, необходимых для понимания изложенного материала.

В данной статье мы продолжим работу над нашей библиотекой "Моя библиотека". В нашем распоряжении есть документ такого вида:

Документ FossLook

Предположим, что ваши пользователи захотели, чтобы система облегчала им повседневную жизнь: при выборе значения в поле "Важность документа" им необходимо автоматически установить поле "Срок исполнения" (в дату, которая установлена "На завтра"). Данное действие мы будем производить в том случае, если выбрали значение "Документ высокой важности".

В реализации данной задачи нам поможет событие AfterFieldChanged, которое предоставляется базовым классом карточки. Откройте файл Form.cs из скрипта карточки документа, и добавьте заготовку кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Form : Foss.FossDoc.ObjectModel.DataRepresentation.View.DocumentCard.DocumentCardInplaceForm
{
	protected override void ActivateRoutine()
	{
		base.ActivateRoutine();

		//Подпишемся на событие AfterFieldChanged чтобы отследить
		//изменение полей на карточке.
		AfterFieldChanged += new FieldChangeEventHandler(Form_AfterFieldChanged);
	}

	void Form_AfterFieldChanged(object sender, FieldChangeEventArgs e)
	{
		//это событие будет приходить всякий раз, 
		//когда пользователь меняет значение одного из полей на карточке
	}

	public override void Shutdown()
	{
		base.Shutdown();

		//отпишемся от события - это обязательное правило для метода Shutdown.
		//Он вызывается всякий раз, когда карточка закрывается.
		AfterFieldChanged -= new FieldChangeEventHandler(Form_AfterFieldChanged);
	}

Как видим, в методе ActivateRoutine мы выполнили подписку на событие, в методе Shutdown - отписались от него, а метод-обработчик события пока у нас ничем не заполнен.

Теперь пришло время подумать, как мы отследим изменение значения поля "Важность документа"? Очевидно, что нам потребуется тег данного поля. Также нам будет нужен идентификатор той справочной записи, которая нас интересует. В итоге у нас получается такой код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void Form_AfterFieldChanged(object sender, FieldChangeEventArgs e)
{
	//это событие будет приходить всякий раз, 
	//когда пользователь меняет значение одного из полей на карточке

	//Тег мы скопируем из администрирования, и объявим его в коде таким образом:
	TPropertyTag tagImportance = Converters.PropertyTag.FromUInt32(0x80700F00);
	//Вверху мы объявили алиас using Converters = ... чтобы было меньше писать.
					
	//Скопируем идентификатор записи "Документ высокой важности", которая требуется
	//для отслеживания:
	OID highImportanceID = Converters.OID.FromString("00000000F1CA38A027344A138E0D3FCAA7619B63");

	//Теперь собственно самое интересное - если событие сообщает что 
	//изменилось поле, которое нам нужно:
	if (e.DocumentCardField.Attribute.Tag.IsEquals(tagImportance))
	{
		//ага, вот и поле "Важность документа". Узнаем, что там за значение?
		if (e.DocumentCardField.Value != null)
		{
			//Справочное поле в значении всегда содержит "идентификатор" (OID),
			//поэтому тут мы приводим к этой структуре.
			OID recordID = (OID)e.DocumentCardField.Value;

			if (recordID.IsEquals(highImportanceID))
			{
				//значение, которое установил пользователь - это наша
				//запись "Документ высокой важности".
				//Теперь мы тут сразу установим значение другого поля:
				//"Срок исполнения"
				TPropertyTag tagTerm = Converters.PropertyTag.FromUInt32(0x80790040);
				IDocumentCardGridField fieldTerm = Fields[tagTerm];
				if (fieldTerm != null)
				{
					//для примера ставим дату 
					//в поле "Срок исполнения" на завтра:
					fieldTerm.Value = DateTime.Now.AddDays(1);
				}
			}

		}
	}
}

Как видим, анализируя выбранное значение справочного поля мы принимаем решение о том, нужно или нет установить значение в другом поле. С помощью такого инструмента вы можете запрограммировать любые сложные взаимозависимости полей.

Вы можете скачать и использовать файл Form.cs с кодом, описанным в этой статье, для решения своих задач. Не копируйте его целиком - для ваших типов документов система уже сгенерировала подобный файл, и вам следует лишь по аналогии использовать фрагменты кода.

© 2001-2017 ФОСС-Он-Лайн. Все права защищены.