首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DevExpress cxDBFilterControl值枚举

DevExpress cxDBFilterControl值枚举
EN

Stack Overflow用户
提问于 2014-02-03 16:54:35
回答 1查看 642关注 0票数 1

我试图枚举cxDBFilterControl中的标准,包括任何组。字段名、运算符、值字段。

代码语言:javascript
复制
cxDBFilterControl1.ApplyFilter;
Memo1.Lines.Add(cxDBFilterControl1.FilterCaption);
Memo1.Lines.Add('');
for ci := 0 to cxDBFilterControl1.Criteria.Root.Count - 1 do begin
  if not cxDBFilterControl1.Criteria.Root.Items[ci].IsItemList then begin
    Memo1.Lines.Add(
//    ((cxDBFilterControl1.Criteria.Root.Items[ci] as TcxFilterCriteriaItem).ItemLink as TcxFilterItem).FieldName +' : '+ // typecast issue
      (cxDBFilterControl1.Criteria.Root.Items[ci] as TcxFilterCriteriaItem).Operator.DisplayText +' : '+
      (cxDBFilterControl1.Criteria.Root.Items[ci] as TcxFilterCriteriaItem).DisplayValue
);
  end
  else begin
  end;
end;

上面的代码将列出没有字段名的根级条件,如何获得字段名以及添加的组及其运算符?

代码语言:javascript
复制
cxDBFilterControl1.FilterCaption output:
(id = 1) and (ttype > 4) and ((tdate < 2/2/2014) or (outcome = test))

枚举输出应该类似于:

代码语言:javascript
复制
id equals 1
AND
ttype equals 4
AND
  tdate lessthan 2/2/2014
  OR
  outcome equals test
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-03 20:55:09

代码语言:javascript
复制
procedure Form1.Test
begin
  PrintFilter(Memo1, cxDBFilterControl1.Criteria.Root);
end;

procedure PrintFilter(Memo: TMemo; ARoot: TcxFilterCriteriaItemList; Level: integer = 0);
var
  I: Integer;
  Op: string;
  Line: string;
  LItemLink: TObject;
  LItem: TcxFilterCriteriaItem;
begin
  for I := 0 to ARoot.Count - 1 do
  begin
    //extract into a function?
    case ARoot.BoolOperatorKind of
      fboAnd: Op := 'AND';
      fboOr: Op := 'OR';
      fboNotAnd: Op := 'NOT AND';
      fboNotOr: Op := 'NOT OR';
    end;
    //
    if not ARoot.Items[I].IsItemList then
    begin
      if I <> 0 then
        Memo.Lines.Add(StringOfChar(' ', Level * 2) + Op);
      LItem := (ARoot.Items[I] as TcxFilterCriteriaItem);
      LItemLink := LItem.ItemLink;
      if (LItemLink <> nil) and (LItemLink is TField) then
        Line := TField(LItemLink).DisplayName;
      Line := Line + ' ' + LItem.Operator.DisplayText +' '+ LItem.DisplayValue;
      Memo.Lines.Add(StringOfChar(' ', Level * 2) + Line)
    end else
    begin
      if TcxFilterCriteriaItemList(ARoot.Items[I]).Count > 0 then
        Memo.Lines.Add(StringOfChar(' ', Level * 2) + Op);
      PrintFilter(Memo, TcxFilterCriteriaItemList(ARoot.Items[I]), Level + 1);
    end;
  end;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21533016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档