Технические вопросы
5.x

Как написать на С#

Добрый день. Помогите написать на языке С# следующую логику:

Если поле SupportLineEdit равно e6b732b6-f36b-1410-a994-00155d054c04 , то поле DepartamentEdit должно быть равно также e6b732b6-f36b-1410-a994-00155d054c04

Если поле SupportLineEdit равно a8d971a0-a7b1-4001-9312-4707391f8e77, то в фильтре поля DepartamentEdit не должны быть задействованы e6b732b6-f36b-1410-a994-00155d054c04 и feaf10a0-f36b-1410-a994-00155d054c04

Заранее спасибо

Нравится

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

Добрый день, Татьяна!
1. Создаете обработчик события изменения поля SupportLineEdit, в котором реализуете следующее:
[csharp]
var supLine = SupportLineEdit.Text;
var supLineId = new Guid(SupportLineEdit.Value);
if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04")) {
DepartamentEdit.SetValueAndText(supLineId, supLine);
}
return true;
[/csharp]
2. На событии Init необходимо реализовать наложение фильтров на поле с помощью PrepareLookupFilter. Аналогичный пример:
[csharp]
Page.RegionEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
object value = Page.CountryEdit.Value;
Guid countryId = (value == null || value.ToString().Equals(string.Empty)) ? Guid.Empty : Guid.Parse(value.ToString());
if (countryId == Guid.Empty) {
return;
}
var filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Country.Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {countryId.ToString()}}});
};
[/csharp]
здесь вместо new object[] {countryId.ToString()}
Вы можете положить несколько Id:
new object[] {"e6b732b6-f36b-1410-a994-00155d054c04", "feaf10a0-f36b-1410-a994-00155d054c04"}

По п.1 - не получилось, т.к. выдало ошибку, что SupportLineEdit и DepartamentEdit не найдены.
При этом в обработчике события изменения поля SupportLineEdit установила: Page.DepartamentEdit.Clear(); - здесь ошибок не выдало.

Татьяна, я немного ошибся. Нужно добавить "Page." перед названиями контролов.
[csharp]
var supLine = Page.SupportLineEdit.Text;
var supLineId = new Guid(SupportLineEdit.Value);
if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04")) {
Page.DepartamentEdit.SetValueAndText(supLineId, supLine);
}
return true;
[/csharp]

Андрей, пишу так:
var supLine = Page.SupportLevelEdit.Text;
var supLineId = new Guid(SupportLevelEdit.Value);
if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04")) {
Page.DepartmentEdit.SetValueAndText(supLineId, supLine);
}

return true;

Система выдает ошибку, что имя SupportLevelEdit не найдено.

пишу во второй строчке:
var supLineId = new Guid(Page.SupportLevelEdit.Value);

тогда система выдает ошибку - см скриншот

Татьяна, понял. Попробуйте так:
[csharp]
var supLineValue = Page.SupportLineEdit.Value.ToString();
var supLineId = Guid.Empty;
if (supLineValue != string.Empty) {
supLineId = new Guid(supLineValue);
}
[/csharp]

А где здесь связь с DepartmentEdit ?

Татьяна, этот кусок кода нужно использовать вместо
[csharp]
var supLineId = new Guid(Page.SupportLevelEdit.Value);
[/csharp]

Андрей, я написала в обработчике события изменения поля SupportLevelEdit:

var supLine = Page.SupportLevelEdit.Text;

var supLineValue = Page.SupportLevelEdit.Value.ToString();
var supLineId = Guid.Empty;
if (supLineValue != string.Empty) {
supLineId = new Guid(value);
}

if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04")) {
Page.DepartmentEdit.SetValueAndText(supLineId, supLine);
}

return true;

В итоге получила сообщение об ошибке: что value не найден (ошибка в строке supLineId = new Guid(value);)

Татьяна,

var supLine = Page.SupportLevelEdit.Text;

var supLineValue = Page.SupportLevelEdit.Value.ToString();
var supLineId = Guid.Empty;
if (supLineValue != string.Empty) {
supLineId = new Guid(supLineValue);
}

if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04")) {
Page.DepartmentEdit.SetValueAndText(supLineId, supLine);
}

return true;

Добрый день
п.1 - опубликовало без ошибок
Но при выборе в карточке Задачи определенного SupportLevelEdit - поле DepartmentEdi автоматически не заполнилось. Подскажите, что не так?

Данная реализация приемлема в том случае, когда справочники полей
SupportLineEdit и DepartamentEdit ссылаются на один объект.

1. На событии изменения поля SupportLineEdit, в карточке, реализовать код:
[csharp]
var id = new Guid(Page.SupportLineEdit.Value.ToString());
If(id == new Guid(“e6b732b6-f36b-1410-a994-00155d054c04”)) {
Page.DepartamentEdit.SetValueAndText(id, Page.SupportLineEdit.Text);
}
[/csharp]

2. На Init Страницы реализовать код:
[csharp]
Page.DepartamentEdit.PrepareLookupFilter += delegate (object sender, EditEventArgs e) {
Collection> filters = e.Filters;
var id = new Guid(“Page.SupportLineEdit.Value.ToString()”);
If(id == new Guid(“a8d971a0-a7b1-4001-9312-4707391f8e77”)) {
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {new Guid(“e6b732b6-f36b-1410-a994-00155d054c04”), new Guid(“e6b732b6-f36b-1410-a994-00155d054c04”)}}}
);
}
};
[/csharp]
Где:
EditEventArgs – LookupEditEventArgs(если поле справочника) или ComboBoxEditEventArgs(если поле со списком)

Добрый день.
Вот в том-то и дело, что эти справочники не ссылаются на обин объект.

Как я писал ранее, что:

"Вильшанский Дмитрий" написал:

Данная реализация приемлема в том случае, когда справочники полей

SupportLineEdit и DepartamentEdit ссылаются на один объект.

Татьяна, у Вас нет возможности сделать, чтобы они ссылались на один объект?

Нет, нет такой возможности.

Татьяна, если SupportLevelEdit и DepartmentEdit ссылаются на разные объекты (таблицы), то едва ли в этих таблицах будут значения с одинаковыми полями Id. Вероятно, Вы ошиблись при указании идентификаторов. Проверьте это, пожалуйста. При текущей реализации у Вас, скорее всего, не выполняется условие:
[csharp]
if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04"))
[/csharp]
Попробуйте так:
[csharp]
var supLineValue = Page.SupportLevelEdit.Value.ToString();
var supLineId = Guid.Empty;
if (supLineValue != string.Empty) {
supLineId = new Guid(supLineValue);
}
var activeRow = Page.DataSource.ActiveRow;
var departmentId = new Guid("e6b732b6-f36b-1410-a994-00155d054c04"); //тут Id департамента
string departmentText = "Название департамента";
if (supLineId == new Guid("e6b732b6-f36b-1410-a994-00155d054c04")) { //тут Id линии поддержки, он не равен Id департамента

//тут тогда можно так:
Page.DepartmentEdit.SetValueAndText(departmentId , departmentText);

//или вот так:
activeRow.SetColumnValue("DepartmentId", departmentId);
activeRow.LoadLookupDisplayValues("Department");
}
return true;
[/csharp]
Что касается фильтрации, то пользуясь предоставленным мной в первом комменте примером можно сделать так:
[csharp]
Page.DepartamentEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
object value = Page.SupportLineEdit.Value;
Guid supportLineId = (value == null || value.ToString().Equals(string.Empty)) ? Guid.Empty : Guid.Parse(value.ToString());
if (supportLineId == new Guid("a8d971a0-a7b1-4001-9312-4707391f8e77")) { //при выполнении этого условия накладываем фильтры
var filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.NotEqual}, //не равно
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues",
new object[] {"e6b732b6-f36b-1410-a994-00155d054c04", "feaf10a0-f36b-1410-a994-00155d054c04"}}//значения для сравнения
}
);
}
};
[/csharp]
Опять же, перепроверьте, правильность идентификаторов в БД.

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