如何在wxWidgets中隐藏wxListCtrl的第一列?

时间:2018-03-14 03:34:18

标签: c++ user-interface wxwidgets

上下文

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

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

myListCtrl->SetColumnWidth(0, 0);

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

运行程序后,第一列的标题会被隐藏,但第一列的每一行的数据都与第二列的每一行的数据重叠(未隐藏)。这显然不是我想要的。标题应隐藏第一列的数据。

问题

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

1 个答案:

答案 0 :(得分:2)

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

  1. 使用DeleteColumn(int columnIndex)删除列。您不会丢失任何数据,只是显示它,因此您可以随时重新插入列并重新填充它,如果您需要重新添加它。显然,如果您的数据过大,这可能会非常耗时。
  2. 根据您的应用程序,首先不要创建列。你不要说为什么你要隐藏它,所以如果你不想要它,就不要添加它。
  3. 将您的控件实现为虚拟控件,使您的应用程序可以控制显示位置的内容。数据显示管理的负担由你手动完成,但你有更大的灵活性。使用wxLC_VIRTUAL样式继承该类并实现OnGetItemText http://docs.wxwidgets.org/3.0/classwx_list_ctrl.html#a92370967f97215e6068326645ee76624
  4. 修改: 要扩展评论问题,如何获取所选项目索引:

    对于选定的项目,wxListCtrl有点奇怪。我确定它与需要支持报告,图标等不同视图有关。处理多列报告模式时,您可能会发现只能选择第一列中的项目。如果您使用的是Windows,则应自动将其设置为" Full Row Select"但我不了解其他操作系统。

    无论如何,这是一个返回第一个选定项目的实用工具方法(请注意,如果您愿意,可以支持多选)。

    //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