Програмування заповнення залежних полів
У даній статті ми вивчимо можливості 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 з кодом, описаним в цій статті, для вирішення своїх завдань. Не копіюйте його цілком - для ваших типів документів система вже згенерувала подібний файл,
і вам слід лише за аналогією використовувати фрагменти коду.