【问题标题】:How to hide the first column of a wxListCtrl in wxWidgets?如何在 wxWidgets 中隐藏 wxListCtrl 的第一列?
【发布时间】:2018-03-14 03:34:17
【问题描述】:

上下文

在 wxWidgets(3.0.2 版)C++ 应用程序中,我试图隐藏 wxListCtrl 的第一列。

我没有找到执行此操作的成员函数,所以我尝试将列的宽度设置为 0:

myListCtrl->SetColumnWidth(0, 0);

第一个参数是列 ID,第二个参数是像素宽度 (wxListCtrl documentation)。

运行程序后,第一列的标题按我的意愿隐藏,但第一列每一行的数据与第二列每一行的数据重叠(没有隐藏)。这显然不是我想要的。标题第一列的数据应该被隐藏。

问题

在 wxWidgets 3.0.2 中,有没有办法隐藏 wxListCtrl 的第一列(每行的标题和数据)?

【问题讨论】:

    标签: c++ user-interface wxwidgets


    【解决方案1】:

    我不相信你可以。你有几个选择。

    1. 使用DeleteColumn(int columnIndex) 删除列。您不会丢失任何数据,只会丢失数据的显示,因此您可以随时重新插入列并在需要重新添加时重新填充它。显然,如果您的数据过大,这可能会很耗时。
    2. 根据您的应用程序,首先不要创建列。你没有说为什么要隐藏它,所以如果你不想要它,就不要添加它。
    3. 将您的控件实现为虚拟控件,使您的应用程序可以控制在何处显示什么内容。数据显示管理的负担由您手动完成,但您拥有更大的灵活性。继承wxLC_VIRTUAL风格的类并实现OnGetItemTexthttp://docs.wxwidgets.org/3.0/classwx_list_ctrl.html#a92370967f97215e6068326645ee76624

    编辑: 展开评论问题,如何获取选中项索引:

    wxListCtrl 在选择项目时有点奇怪。我确信这与需要支持报告、图标等不同视图有关。在处理多列报表模式时,您可能会发现只能选择第一列中的项目。如果你在 Windows 上,它应该自动设置为“全行选择”,但我不知道其他操作系统。

    不管怎样,这里有一个返回第一个选中项的实用方法(注意,如果你愿意,你可以支持多选)。

    //Get the item currently selected
    int ListView::GetItemSelected() const
    {
        for(int i=0; i<GetItemCount(); ++i)
            if (GetItemState(i, wxLIST_STATE_SELECTED) == wxLIST_STATE_SELECTED)
                return i;
        return -1;
    }
    

    如果你愿意(并且有意义),你可以连接列表项选择事件。

    this->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxCommandEventHandler(ListView::selected_Changed), NULL, this);
    

    在该事件处理程序中,获取所选项目并执行需要执行的操作(完全取决于您的应用程序)。

    你会注意到我在这里使用了一个派生类,它只是让事情变得更容易,但你不必这样做。你可以连接到MyMainForm::sqlResults_selectedChanged 之类的东西。

    完成这一切的方法不止一种,您还可以在这里找到一些好的建议和帮助:https://wiki.wxwidgets.org/WxListCtrl

    【讨论】:

    • 我用 SQL 查询的结果填充 wxListCtrl。例如,列标题可以是“userID firstName lastName”。我不需要(也不想要)userID 列,它是要在用户界面中显示的第一列。这就是我想隐藏它的原因。我仍然需要它存在,因为双击一个 wxListCtrl 行,我需要能够获取存储在第一列中的用户 ID 来执行其他操作。我会研究你的第三点,看看是否方便使用。
    • 作为建议,不要依赖 UI 控件来存储数据。有时这是有道理的(在简单的情况下),但通常最好单独维护数据文档并让 UI 成为该数据的窗口。将 SQL 查询结果保存在单独的列表中,并在对数据执行操作时将当前选定的行用作该列表的索引。
    • 我想我明白你的意思,但想澄清一点。如果在 wxListCtrl 中我没有索引列,但让我们说只有“firstName”和“lastName”列可以以不同的方式排序并可能被过滤,我如何从当前选定的行中获取索引?跨度>
    • @Mat.R,您还可以设置列的用户数据,例如用户 ID、行 ID 或其他。或者您可以根据添加的 wxListCtrl 行将 SQL 结果保存到 std::map 中。你的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多