Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Фильтрация cxDBTreeList  [new]
wsnet
Member

Откуда:
Сообщений: 769
Пытаюсь настроить фильтрациюcxDBTreeList, но ничего не происходит:
procedure TfrmDataTreeList.CreateFilter(AColumn: TcxDBTreeListColumn; ASearhText: string);
begin
  with lstMain.DataController.Filter do
  begin
    BeginUpdate;
    try
      Root.Clear;
      if Trim(edtSearchText.Text) = '' then
        Active := False
      else
      begin
        Root.AddItem(AColumn, foLike, '%' + ASearhText + '%', '');
        Active := True;
      end;
    finally
      EndUpdate;
    end;
  end;
end;


Вопрос, почему ?
13 сен 17, 14:34    [20792912]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
JaDi
Member

Откуда: JayDi из Сызрани
Сообщений: 2943
Трилист не поддерживает подобный метод фильтрации через контроллер -- это есть только у грида. Так что можно воспользоваться другими методами -- фильтровать датасет или отдельные ноды скрывать-показывать.
13 сен 17, 14:52    [20792963]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
wsnet
Member

Откуда:
Сообщений: 769
JaDi, а слышал, что стал поддерживать в новых версиях или только звон ?
13 сен 17, 15:00    [20792981]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
wsnet
Member

Откуда:
Сообщений: 769
Переделал, но фильтруются такое впечатление только корневые узлы, а среди детей уже не находит.
procedure TfrmDataTreeList.CreateFilter(AColumn: TcxDBTreeListColumn; ASearhText: string);
var
  ANode: TcxTreeListNode;
  i: Integer;
begin
  if ASearhText = '' then
    for i := 0 to lstMain.AbsoluteCount - 1 do
      lstMain.AbsoluteItems[i].Visible := True
  else
    for i := 0 to lstMain.AbsoluteCount - 1 do
    begin
      ANode := lstMain.AbsoluteItems[i];
      if Pos(ASearhText, Trim(ANode.Values[AColumn.ItemIndex])) > 0 then
        ANode.Visible := True
      else
        ANode.Visible := False;
    end;
end;
13 сен 17, 15:25    [20793081]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
DimaBr
Member

Откуда:
Сообщений: 10184
Фильтр в дереве ?
Куда деваются узлы если родитель не попал в фильтр ?
13 сен 17, 15:30    [20793099]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
wsnet
Member

Откуда:
Сообщений: 769
DimaBr, да, я грешным делом думал, что если дети Visible то и родители Visible
13 сен 17, 15:54    [20793159]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
JaDi
Member

Откуда: JayDi из Сызрани
Сообщений: 2943
wsnet
JaDi, а слышал, что стал поддерживать в новых версиях или только звон ?

Без понятия, кто там звонит, но на 2017 год этой фичи даже в планах не было, хотя и просят их уже лет семь:
https://www.devexpress.com/Support/Center/Question/Details/S137256/makes-the-quantumtreelist-implement-icxfiltercontrol
13 сен 17, 16:41    [20793327]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
wsnet
Member

Откуда:
Сообщений: 769
JaDi, так я в ТП devespress посмотрел, оказывается AbsoluteCount не рекомендуют использовать, в итоге переделал:
procedure TfrmDataTreeList.CreateFilter(AColumn: TcxDBTreeListColumn; ASearhText: string);
var
  ANode, AParentNode: TcxTreeListNode;
  i: Integer;
begin
  ANode := lstMain.Root.getFirstChild;
  while ANode <> nil do
  begin
    if Pos(ASearhText, ANode.Values[AColumn.ItemIndex]) > 0 then
    begin
      ANode.Visible := True;
       //TcxTreeListNode(ANode.Parent).Visible := True;
      AParentNode := ANode.Parent;
      while AParentNode <> nil do
      begin
        AParentNode.Visible := True;
        AParentNode := AParentNode.Parent;
      end;
    end
    else
      ANode.Visible := False;
    ANode := ANode.GetNext;
  end;
end;


Но чем плох AbsoluteCount?
13 сен 17, 17:09    [20793406]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация cxDBTreeList  [new]
JaDi
Member

Откуда: JayDi из Сызрани
Сообщений: 2943
wsnet,

Потому что "массив" AbsoluteItems перестраивается при изменении структуры дерева, и можно нарваться на различные глюки.
13 сен 17, 17:17    [20793435]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить