Pergunta

Eu estou usando um DevExpress TdxMemData na memória descendente de TDataSet. Embora tenha filtrada: Boolean e Filtro: propriedades de cadeia, ele não parece realmente fazer alguma coisa com eles automaticamente, em vez de confiar no resultado do parâmetro Aceitar do evento OnFilterRecord.

Então o que eu estou procurando é uma maneira (talvez seja em TdxMemData ou em outro lugar no conjunto de código de DevExpress) para analisar o texto do filtro e aplicá-lo ao conjunto de dados.

Idealmente, eu gostaria de ter uma maneira de testar uma linha individual contra o filtro para ver se ele corresponde, sem filtrá-la para fora do conjunto de dados (eu quero linhas de destaque que correspondem ao filtro).

Exemplo cadeia de filtro:

((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)

Portanto, há aninhada e de e ou de. Na verdade, é construído pela DevExpress TcxDBFilterControl.

Eu estou realmente esperando há algo simples que eu estou ausente.

Update: eu abri uma href="http://www.devexpress.com/Support/Center/p/Q206534.aspx" rel="nofollow bilhete com DevExpress para ver se eles apoiar qualquer tipo de solução. Eu fiz encontrar a sua resposta padrão que eles não suportam filtragem em TdxMemData.

Foi útil?

Solução

Eu sei que esta não é a resposta a sua procura, mas o conjunto de dados TdxMemData não suporta seqüências de filtro. Para usar filtros quer código de seu próprio evento OnFilterRecord ou conjunto ProgrammedFilter a verdade e preencher o filterlist com uma lista dos registros que são filtrados (em tempo de execução).

Uma possibilidade seria a de código de seu próprio analisador para comparar a seqüência de filtro contra o registro atual no evento OnFilterRecord.

Outras dicas

Você pode querer olhar para substituir o TdxMemData com TkbmMemTable . É grátis, funciona de forma semelhante ao componente DX, e seqüências de filtro suportes. Provavelmente levaria muito menos tempo para a porta mais do que seria a implementação de um analisador seqüência de filtro em OnFilterRecord! Ele vai trabalhar com os outros componentes DX sem problemas.

O que você está procurando não está filtrando os dados, mas uma questão de exibi-lo de maneira diferente se ele atende uma condição. Se você estiver usando uma TDBGrid para exibir os dados, olhar para o evento DrawColumnCell () no TDBGrid:

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DBG: TDBGrid;
begin
  DBG := TDBGrid(Sender);
  // Add any other conditions from your 'filter' here in the next line.
  if (YourData.FieldByName('WHATEVER').AsString = 'Jim') and
     (YourData.FieldByName('REP').AsInteger > 1000) then
    Column.Font.Color := clRed;
  DBG.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Uma vez que você estiver usando TdxMemData, você provavelmente está usando a grade DevEx também. Tem que ter uma forma semelhante a fazer algo que não seja o desenho padrão; você pode usar uma técnica semelhante lá. (Eu não usei o material DevEx em poucos anos;. Empregador atual não gosta deles, e, portanto, não saltará para a despesa :-()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top