Необходимо применить фильтр к комбобоксу StatusEdit в карточке редактирования задачи.
При применении следующего кода:
Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
Collection> filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};
При выборе выпадающего списка происходит следующая ошибка:
Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent
Что не так делаю?
Нравится
Попробуйте так:
[csharp]
Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
var filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};
[/csharp]
Та же самая ошибка вылетает.
Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent
У меня работает нормально. Сообщите больше информации. Может, кроме этого в другом месте ещё какие-то фильтры на это поле есть?
Данный код был размещен в скрипте ScriptAfterBasePageLoadComplete т.к. должен срабатывать по условию после загрузки всех полей карточки.
Каким образом тогда в скрипте Init получить следующее значение:
var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");
На этой строчке скрипт "вылетает". т.к. , насколько я понимаю, данные из DataSource еще не загружены.
Логика внутри делегата выполняется не на открытии, а в момент нажатия на лукап.
Почему тогда происходит ошибка:
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в Terrasoft.WebApp.TaskEditPageEventsProcess`1.ChildInitAfterParentScriptExecute(ProcessExecutingContext context)
при получении Id открываемой активности:
var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");
???
И под скриптом Init подразумевался ChildInitBeforeParentScript ???
Функция GetTypedColumnValue — это generic, там надо указать тип в угловых скобках. Вроде:
[csharp]
Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue("AccountId");
[/csharp]
Можно и before, и after.
Угловые скобки вырезал парсер форума, они там есть:
[csharp]
var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");
[/csharp]
т.е. ошибка с этим не связана.
Посмотрите в других разделах как устроено наложение фильтров и сделайте по аналогии. Там несложно.
Вот пример:
[csharp]
Page.ManagerLookupEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
Collection> filters = e.Filters;
Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue("AccountId");
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Account.Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {accountId}}});
};
[/csharp]
Если нужно Id записи, карточка которой открыта, то можно просто:
[csharp]
{"rightExpressionParameterValues", new object[] {Page.DataSource.ActiveRowPrimaryColumnValue.ToString()}}});
[/csharp]
Между нами, есть некоторое недопонимание, если использовать напрямую т.е. просто вставить ваш код фильтра в скрипт, фильтр применяется, тут проблем нет.
Как я писал выше этот фильтр должен применяться по условию, а для этого необходимо получить Id открываемой активности и проверить значения других полей. И ошибка как раз возникает на строке получения Id открываемой активности:
[csharp]
var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");
[/csharp]
Условие должно проверяться внутри делегата.
[csharp]
if(NeedFilters) {
filters.Add(new Dictionary {
[/csharp]
Применил :
[csharp]
var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();
[/csharp]
На выходе получил значение TaskId:
00000000-0000-0000-0000-000000000000
Я открываю уже существующую запись.
Дело в том, что :
[csharp]
var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();
[/csharp]
получает Id активности только если его перенести в ScriptAfterBasePageLoadComplete, в скриптах Init всегда нулевые значения.