Фильтр для ComboBox

Необходимо применить фильтр к комбобоксу 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

Что не так делаю?

Нравится

18 комментариев

Попробуйте так:

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.

Каким образом тогда в скрипте 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 всегда нулевые значения.

Проверяйте значение поля внутри делегата.

Все работает. Большое спасибо.

Показать все комментарии