c++ - DBGrid 按计算字段排序

标签 c++ sorting filter c++builder dbgrid

我的问题是:如何通过计算字段对 DBGrid 进行排序。我正在使用 C++Builder Starter Editon,并且此版本中没有可用的 ClientDataSet 来在字段上创建索引并按列的索引排序。所以这不是一个选项。 (在许多线程中阅读此内容)我正在使用 TIBDataSet(下面的 ibds)并且正在过滤数据。工作正常......对于 DB 列,而不是计算列......我有什么想法可以解决这个问题吗?

void __fastcall TForm1::DBGrid3TitleClick(TColumn *Column)
{
    static cIdx = 0;
    static String oby = "ASC";

    TBookmark CurrentPosition;
    TIBDataSet *ibds = IBDS_accountsDist;
    CurrentPosition = ibds->GetBookmark();
    if (cIdx != Column->Index) {
        oby = "ASC"; // ANOTHER column choosen
    } else if (oby == "ASC") {
        oby = "DESC";
    } else oby = "ASC";
    cIdx = Column->Index;

    ibds->Filtered = false;
    switch (Column->Index){
        case 0: ibds->Filter = "ORDER BY SumAj "+oby; break; // SumAj is a calculated field => Does not work
        case 1: ibds->Filter = "ORDER BY CSAL_ACCOUNTNAME "+ oby; break; // DB-field WORKS FINE
    }
    ibds->Filtered = true;
    ibds->GotoBookmark(CurrentPosition);
}

最佳答案

你做不到。 TIBDataSet 是底层数据库的表示。基本上,它按照 SQL 中定义的顺序获取记录。

最简单的方法是使用 TDBClientDataset,但它不包含在 c++ Builder 的入门版中。您可以探索其他方式,例如将所有记录预加载到 std::list 中,然后使用 order 函数对记录进行排序。最后,您可以使用简单的 TGrid 或 TStringGrid 显示它们。

无论如何,我建议升级 C++Builder,因为 TClientDataSet 是大多数数据项目中的主要部分之一,特别是当您需要创建中大型项目时。

将 TIBDataSet 等数据库特定组件与用户界面混合会损害项目的可扩展性和维护性。

关于c++ - DBGrid 按计算字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11804731/

相关文章:

java - 计算距离 - 即时计算还是在数据输入数据库后立即计算?

Java Web、Struts2过滤器,总是检查文件不存在,导致缓存泄漏

c++ - 普通 C 加载 C# dll

c++ - 当 OpenGL 相机处于低高度(低 Z 坐标)时,为什么将窗口坐标映射到球体很困难?

Python 接受成对的字符串和整数输入

Jquery move 表行但不 move 表头

arrays - Google Sheets 如何根据单元格引用过滤列

css - 悬停在单元格上时,将 Webkit 过滤器应用于表格单元格内的图像

c++ - 为什么我不能在类中有静态对象?

c++ - 类变量 : public access read-only, 但私有(private)访问读/写