繁体   English   中英

cxGrid Unicode 排序

[英]cxGrid Unicode sorting

如何让 cxGrid 以 Latin-2 (ISO-8859-2) 编码进行排序?

我不希望网格依赖于 Windows 的区域设置。 问题是我在斯洛文尼亚,但我需要用克罗地亚语进行分类。 (现在 Ć,Č,Š 没有正确排序)

可以做到吗?

您可以为 cxGrid 挂钩由 DBTableView 的 DataController 公开的 OnCompare 事件,并实现如下处理程序:

procedure TMyForm.cxGrid1DBTableView1DataControllerCompare( 
                ADataController: TcxCustomDataController;
                ARecordIndex1, ARecordIndex2, AItemIndex: Integer;
                const V1, V2: Variant;
                var Compare: Integer );
var
  S1, S2       : String;
  CompareResult: Integer;

begin
  S1 := V1;
  S2 := V2;
  CompareResult := CompareStringW( LANG_CROATIAN, 0, pWideChar( S1 ), -1,
                                                     pWideChar( S2 ), -1 );
  case CompareResult of
    CSTR_LESS_THAN    : Compare := -1;
    CSTR_EQUAL        : Compare := 0;
    CSTR_GREATER_THAN : Compare := 1;
  end;
end;

如果 S1 = 'Ć,Č,Š' 且 S2 = 'Č,Ć,Š',则 S1 > S2,我认为这是预期的结果。 如果您切换到 LOCALE_NEUTRAL,则会得到相反的结果。

将 V1 和 V2 转换为字符串时应小心,因为并非所有列都可以按所需方式转换。 日期 - 例如 - 可能需要特殊处理。

另请注意,如果函数失败,CompareStringW 将返回 0。 一个完整的实现可能必须处理这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM