Здравствуйте!
Задача: Организовать фильтрацию по вложенным записям в древовидном реестре.
Есть грид, который служит только для отображения записей и дерево с одной степенью вложенности.
Записи вида 00001 - корневые
000001-1, 000001-2, 000001-3 - подчиненные
Также в таблице есть поля с идентификаторами ID, ParentID. Для корневых записей ID = ParentID
В общем, все организовано по примеру раздела [Проекты], но в проектах реализован хитрый механизм фильтрации, который позволяет фильтровать по подчиненным записям, с любой вложенности. Вы можете проверить это профильтровав раздел Проекты, по названию подчиненной стадии, предварительно ее создав.
Я подозреваю, что получилось организовать такую хитрую фильтрацию с помощью следующих механизмов:
function InitializeFiltersSchemes() {
ProjectWorkspace.IsChangeFilterScheme = false;
ProjectWorkspace.GridFiltersScheme = new Object();
ProjectWorkspace.GridFiltersScheme.XMLStorage = GetNewXMLStorage();
ProjectWorkspace.GridFiltersScheme.CustomFilters = GetNewXMLStorage();
var GridCustomFilters = ProjectWorkspace.GridFiltersScheme.CustomFilters;
GridCustomFilters.InitRootNode('CustomFilters');
GridCustomFilters.RootNode.AddChildNode('FiltersData');
SaveFiltersToScheme(ProjectWorkspace.GridFiltersScheme);
ProjectWorkspace.GanttFiltersScheme = new Object();
ProjectWorkspace.GanttFiltersScheme.XMLStorage = GetNewXMLStorage();
ProjectWorkspace.GanttFiltersScheme.CustomFilters = GetNewXMLStorage();
var GanttCustomFilters = ProjectWorkspace.GanttFiltersScheme.CustomFilters;
GanttCustomFilters.InitRootNode('CustomFilters');
GanttCustomFilters.RootNode.AddChildNode('FiltersData');
SaveFiltersToScheme(ProjectWorkspace.GanttFiltersScheme);
}
function SaveFiltersToScheme(Scheme) {
var CustomFiltersNode = Scheme.CustomFilters.RootNode.Items(0);
CustomFiltersNode.SetAttributeAsBool('ShowForPeriod', chbShowForPeriod.IsChecked, false);
SetStrAttributeToXMLNode(CustomFiltersNode, 'PeriodType', cbPeriodType.DataField.Value);
SetStrAttributeToXMLNode(CustomFiltersNode, 'FromDate', dtcFromDate.DataField.Value);
SetStrAttributeToXMLNode(CustomFiltersNode, 'ToDate', dtcToDate.DataField.Value);
CustomFiltersNode.SetAttributeAsBool('ShowForOpportunity', chbShowForOpportunity.IsChecked, false);
SetStrAttributeToXMLNode(CustomFiltersNode, 'Project', edtProject.Value);
CustomFiltersNode.SetAttributeAsBool('ShowForContact', chbShowForContact.IsChecked, false);
SetStrAttributeToXMLNode(CustomFiltersNode, 'Contact', edtContact.Value);
CustomFiltersNode.SetAttributeAsBool('ShowChildren', chbShowChildren.IsChecked, false);
Scheme.FilterBuilder = GetFilterBuilderXMLDataEx(fbcFilters, Scheme.XMLStorage);
}
function LoadFiltersFromScheme(Scheme) {
var CustomFiltersNode = Scheme.CustomFilters.RootNode.Items(0);
chbShowForPeriod.IsChecked = CustomFiltersNode.GetAttributeAsBool('ShowForPeriod', false);
var DateEnumID = GetStrAttributeFromXMLNode(CustomFiltersNode, 'PeriodType');
if (IsEmptyValue(DateEnumID)) {
dtcFromDate.DataField.Value = GetStrAttributeFromXMLNode(CustomFiltersNode, 'FromDate');
dtcToDate.DataField.Value = GetStrAttributeFromXMLNode(CustomFiltersNode, 'ToDate');
} else {
cbPeriodType.DataField.Value = GetStrAttributeFromXMLNode(CustomFiltersNode, 'PeriodType');
}
chbShowForOpportunity.IsChecked = CustomFiltersNode.GetAttributeAsBool('ShowForOpportunity', false);
edtProject.Value = GetStrAttributeFromXMLNode(CustomFiltersNode, 'Project');
chbShowForContact.IsChecked = CustomFiltersNode.GetAttributeAsBool('ShowForContact', false);
edtContact.Value = GetStrAttributeFromXMLNode(CustomFiltersNode, 'Contact');
chbShowChildren.IsChecked = CustomFiltersNode.GetAttributeAsBool('ShowChildren', false);
fbcFilters.ClearFilter();
fbcFilters.FiltersBuilder.Deserialize(Scheme.FilterBuilder);
fbcFilters.Refresh();
fbcFilters.ApplyFilter();
}
Я так понимаю, что мы должны научить FilterBuilder ходить по вложенным записям, для этого переопределить логику, но как это делается в строчках выше мне не понятно.
Просьба пояснить или дать пример организации корректной фильтрации по древовидному реестру.
Конфигурация Terrasoft 3.3.2.157
Бинарные файлы Terrasoft 3.3.2.268