문제

나는 a를 사용하고있다 devexpress tdxmemdata 기억에서 tdataset 자손. 필터링 된 반면 : 부울 및 필터 : 문자열 속성은 실제로 자동으로 아무것도 수행하지 않고 OnFilterRecord 이벤트의 결과에 의존하는 것처럼 보이지 않습니다.

제가 찾고있는 것은 필터 텍스트를 구문 분석하고 데이터 세트에 적용하는 방법 (tdxmemdata 또는 devexpress의 코드 제품군에있을 수 있음)입니다.

이상적으로는 필터에 대한 개별 행을 테스트하여 데이터 세트에서 필터링하지 않고 일치하는지 확인하고 싶습니다 (필터와 일치하는 행을 강조 표시하고 싶습니다).

필터 문자열 예제 :

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

그래서 중첩 및 또는 또는. 실제로 DeVexpress tcxdbfiltercontrol에 의해 구축되었습니다.

나는 내가 놓친 단순한 것이 있기를 정말로 바라고있다.

업데이트: 나는 열었다 DeVexpress 티켓 그들이 모든 종류의 솔루션을 지원하는지 확인합니다. 나는 그들의 주식 대답을 발견했다 필터링을 지원하지 않습니다 tdxmemdata에서.

도움이 되었습니까?

해결책

나는 이것이 당신이 찾고있는 대답이 아니라는 것을 알고 있지만 tdxmemdata 데이터 세트는 필터 문자열을 지원하지 않습니다. 필터를 사용하려면 자신의 OnFilterRecord 이벤트를 코딩하거나 ProgrammedFilter를 True로 설정하고 필터링 된 레코드 목록으로 필터리스트를 채우십시오 (런타임).

OnFilterRecord 이벤트에서 필터 문자열을 현재 레코드와 비교하기 위해 자신의 파서를 코딩하는 것입니다.

다른 팁

tdxmemdata를 tkbmmemtable. 무료이며 DX 구성 요소와 유사하게 작동하며 필터 문자열을 지원합니다. OnFilterRecord에서 필터 문자열 파서를 구현하는 것보다 포트가 훨씬 적은 시간이 걸릴 것입니다! 문제없이 다른 DX 구성 요소와 함께 작동합니다.

당신이 찾고있는 것은 데이터를 필터링하는 것이 아니라 조건을 충족하면 데이터를 다르게 표시하는 것입니다. TDBGRID를 사용하여 데이터를 표시하는 경우 TDBGRID에서 DrawColumnCell () 이벤트를 살펴보십시오.

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;

tdxmemdata를 사용하고 있기 때문에 Devex 그리드도 사용하고 있습니다. 기본 도면 이외의 작업을 수행하는 방법이 비슷해야합니다. 비슷한 기술을 사용할 수 있습니다. (나는 몇 년 동안 DeVex 물건을 사용하지 않았다. 현재 고용주는 그들을 좋아하지 않으므로 비용을 지불하지 않을 것이다. :-()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top