如何在 wxWidgets 中隐藏 wxListCtrl 的第一列?
How to hide the first column of a wxListCtrl in wxWidgets?
上下文
在 wxWidgets(版本 3.0.2)C++ 应用程序中,我试图隐藏 wxListCtrl 的第一列。
我没有找到执行此操作的成员函数,所以我尝试将列宽设置为 0:
myListCtrl->SetColumnWidth(0, 0);
第一个参数是列 ID,第二个参数是宽度(以像素为单位)(wxListCtrl documentation)。
程序运行后第一列的header如我所愿隐藏了但是第一列每一行的数据都和第二列每一行的数据重叠了(这不是隐藏的)。这显然不是我想要的。 header 和第一列的数据应该被隐藏。
问题
在wxWidgets 3.0.2中,有没有办法隐藏wxListCtrl的第一列(header和每行的数据)?
我不相信你可以。您有几个选择。
- 使用
DeleteColumn(int columnIndex)
删除列。您不会丢失任何数据,只会丢失数据的显示,因此您始终可以 re-insert 该列并在需要时重新填充它 re-add 它。显然,如果您的数据过大,这可能会很耗时。
- 根据您的应用程序,首先不要创建列。你不说为什么你要隐藏它,所以如果你只是不想它,就不要添加它。
- 将您的控件实现为虚拟控件,让您的应用程序控制在何处显示内容。数据显示管理的负担落在您身上,您可以手动完成,但您有更大的灵活性。继承 class 和
wxLC_VIRTUAL
样式并实现 OnGetItemText
http://docs.wxwidgets.org/3.0/classwx_list_ctrl.html#a92370967f97215e6068326645ee76624
编辑:
要扩展评论问题,如何获取 selected 项目索引:
当涉及 selected 项目时,wxListCtrl 有点奇怪。我确定这与需要支持报告、图标等不同视图有关。在处理 multi-column 报告模式时,您可能会发现第一列中只能有 select 项。如果你在Windows,它应该自动设置为"Full Row Select",但我不知道其他操作系统。
无论如何,这里有一个 returns 第一个 selected 项目的实用方法(请注意,如果你愿意,你可以支持 multi-selection)。
//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;
}
如果需要(这很有意义),您可以连接列表项 selected 事件。
this->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxCommandEventHandler(ListView::selected_Changed), NULL, this);
并在该事件处理程序中,获取 selected 项并执行需要执行的操作(完全取决于您的应用程序)。
你会注意到我在这里使用派生的 class 这只会让事情变得容易得多,但你不必这样做。您可以连接到 MyMainForm::sqlResults_selectedChanged
之类的东西。
完成这一切的方法不止一种,您还可以在这里找到一些好的建议和帮助:https://wiki.wxwidgets.org/WxListCtrl
上下文
在 wxWidgets(版本 3.0.2)C++ 应用程序中,我试图隐藏 wxListCtrl 的第一列。
我没有找到执行此操作的成员函数,所以我尝试将列宽设置为 0:
myListCtrl->SetColumnWidth(0, 0);
第一个参数是列 ID,第二个参数是宽度(以像素为单位)(wxListCtrl documentation)。
程序运行后第一列的header如我所愿隐藏了但是第一列每一行的数据都和第二列每一行的数据重叠了(这不是隐藏的)。这显然不是我想要的。 header 和第一列的数据应该被隐藏。
问题
在wxWidgets 3.0.2中,有没有办法隐藏wxListCtrl的第一列(header和每行的数据)?
我不相信你可以。您有几个选择。
- 使用
DeleteColumn(int columnIndex)
删除列。您不会丢失任何数据,只会丢失数据的显示,因此您始终可以 re-insert 该列并在需要时重新填充它 re-add 它。显然,如果您的数据过大,这可能会很耗时。 - 根据您的应用程序,首先不要创建列。你不说为什么你要隐藏它,所以如果你只是不想它,就不要添加它。
- 将您的控件实现为虚拟控件,让您的应用程序控制在何处显示内容。数据显示管理的负担落在您身上,您可以手动完成,但您有更大的灵活性。继承 class 和
wxLC_VIRTUAL
样式并实现OnGetItemText
http://docs.wxwidgets.org/3.0/classwx_list_ctrl.html#a92370967f97215e6068326645ee76624
编辑: 要扩展评论问题,如何获取 selected 项目索引:
当涉及 selected 项目时,wxListCtrl 有点奇怪。我确定这与需要支持报告、图标等不同视图有关。在处理 multi-column 报告模式时,您可能会发现第一列中只能有 select 项。如果你在Windows,它应该自动设置为"Full Row Select",但我不知道其他操作系统。
无论如何,这里有一个 returns 第一个 selected 项目的实用方法(请注意,如果你愿意,你可以支持 multi-selection)。
//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;
}
如果需要(这很有意义),您可以连接列表项 selected 事件。
this->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxCommandEventHandler(ListView::selected_Changed), NULL, this);
并在该事件处理程序中,获取 selected 项并执行需要执行的操作(完全取决于您的应用程序)。
你会注意到我在这里使用派生的 class 这只会让事情变得容易得多,但你不必这样做。您可以连接到 MyMainForm::sqlResults_selectedChanged
之类的东西。
完成这一切的方法不止一种,您还可以在这里找到一些好的建议和帮助:https://wiki.wxwidgets.org/WxListCtrl