Listview LVCOLUMN.iSubItem的用途是什么?

Listview LVCOLUMN.iSubItem的用途是什么?,listview,winapi,Listview,Winapi,我不明白LVCOLUMN.iSubItem的目的是什么。MSDN就是这么说的: iSubItem Type: int Index of subitem associated with the column. 我首先认为这意味着,当我创建一个列时,我可以为该列设置一个索引,例如:123,然后当我想在该列中插入一些数据时,我只提供数字123作为该列的标识 但它不起作用,无论我为列设置了什么索引,列仍然编号为0、1、2、3,…子项仅对具有样式LVS_报表的列表控件有效和起作用。您需要插入列才能使用

我不明白
LVCOLUMN.iSubItem
的目的是什么。MSDN就是这么说的:

iSubItem

Type: int

Index of subitem associated with the column.
我首先认为这意味着,当我创建一个列时,我可以为该列设置一个索引,例如:123,然后当我想在该列中插入一些数据时,我只提供数字123作为该列的标识


但它不起作用,无论我为列设置了什么索引,列仍然编号为0、1、2、3,…

子项仅对具有样式LVS_报表的列表控件有效和起作用。您需要插入列才能使用它


使用此样式可以添加项LVM_INSERTITEM,每个项都可以有子项。要处理子项的内容,需要结构的成员。

如果使用LVS_报告样式,列表视图控件看起来像网格控件

在这种情况下,项存储在列0中,子项表示存储的内容 在其他列中(没有完整的概念,例如“单元”)。因此,子项索引通常与and消息(或相应的and宏)一起使用,以写入或读取列X文本值。根据索引,如果iSubItem==0,则访问该项;如果iSubItem>=1,则访问子项


您可以在这里查看这个问题,以便获得额外的示例:

否,
LVCOLUMN.iSubItem
按照您发现的从0到右的顺序编号。是的,它看起来毫无意义,因为您必须始终指定列号才能对LVCOLUMN执行任何操作。所以它只是把你已经知道的东西还给你

很难猜测这是怎么发生的,除了注意到通用控件并不是微软最好的时刻。我怀疑这可能与listview上的LVS_EX_HEADERDRAGDROP有关。这允许用户通过拖动列来重新排列列。现在,传递给LVM_GETCOLUMN的列索引变得有点模糊,它应该指示列的位置还是原始索引?如果您需要了解用户是如何安排列的,他们会选择后者并使用
LVM_GETCOLUMNORDERARRAY


或者,它们只是镜像了LVITEM.iSubItem,以保持结构的相似性,这可能有点可能。别担心。

我有两个猜测。1)您没有在
LVCOLUMN.mask
中指定
LVCF\u子项
,或者2)
iSubItem
仅由
LVM\u GETCOLUMN
使用(例如,根据重新排列后的顺序获取列的子项)。文档中没有任何内容指向后一种解释,尽管…“为了解决子项的内容,您需要结构的成员”这就是我提出这个问题的原因,结构的成员(
LVCOLUMN.iSubItem
)是不相关的,列编号为0、1、2、3,…iSubItem成员是ListCtrl iSubItem。在报告模式下,如果应用程序允许,用户可以按不同顺序拖动列、隐藏列或插入新列。iSubItem对于给定的列始终保持不变,将其与您提供的信息绑定,并在控件的生命周期内保持不变。