Необходимо применить фильтр к комбобоксу 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
Что не так делаю?
Нравится
Попробуйте так:
Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) { var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6"; var filters = e.Filters; filters.Add(new Dictionary<string, object> { {"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
У меня работает нормально. Сообщите больше информации. Может, кроме этого в другом месте ещё какие-то фильтры на это поле есть?
Данный код был размещен в скрипте 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, там надо указать тип в угловых скобках. Вроде:
Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");
Можно и before, и after.
Угловые скобки вырезал парсер форума, они там есть:
var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");
т.е. ошибка с этим не связана.
Посмотрите в других разделах как устроено наложение фильтров и сделайте по аналогии. Там несложно.
Вот пример:
Page.ManagerLookupEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) { Collection<Dictionary<string, object>> filters = e.Filters; Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId"); filters.Add(new Dictionary<string, object> { {"comparisonType", FilterComparisonType.Equal}, {"leftExpressionColumnPath", "Account.Id"}, {"useDisplayValue", false}, {"rightExpressionParameterValues", new object[] {accountId}}}); };
Если нужно Id записи, карточка которой открыта, то можно просто:
{"rightExpressionParameterValues", new object[] {Page.DataSource.ActiveRowPrimaryColumnValue.ToString()}}});
Между нами, есть некоторое недопонимание, если использовать напрямую т.е. просто вставить ваш код фильтра в скрипт, фильтр применяется, тут проблем нет.
Как я писал выше этот фильтр должен применяться по условию, а для этого необходимо получить Id открываемой активности и проверить значения других полей. И ошибка как раз возникает на строке получения Id открываемой активности:
var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");
Условие должно проверяться внутри делегата.
if(NeedFilters) { filters.Add(new Dictionary<string, object> {
Применил :
var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();
На выходе получил значение TaskId:
00000000-0000-0000-0000-000000000000
Я открываю уже существующую запись.
Дело в том, что :
var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();
получает Id активности только если его перенести в ScriptAfterBasePageLoadComplete, в скриптах Init всегда нулевые значения.