作者:刘树伟
日期:2015-10-18
当Win32的List控件选中“Edit Label”风格后,List第0列Item可以被编辑,默认情况下,只有第0列的Item可以被编辑。但List提供了交换列索引的功能,我们可以把第0列与想要被编辑的列交换顺序,达到编辑非第0列的目的。
m_list.InsertColumn(0, _T("Column 0"), LVCFMT_LEFT, 100);
m_list.InsertColumn(1, _T("Column 1"), LVCFMT_LEFT, 100);
m_list.InsertColumn(2, _T("Column 2"), LVCFMT_LEFT, 100);
int nIndex = m_list.InsertItem(0, _T("Item 0"));
m_list.SetItemText(nIndex, 1, _T("Subitem 1"));
m_list.SetItemText(nIndex, 2, _T("Subitem 2"));
// 下面的代码,把第2列变成第0列。需要注意的是:SetColumn是把第2列“插入”第0列前,第0列右面的列依次右移,而不是交换第2列和第0列。调用完SetColumn之后,显示出来的顺序是2、0、1,而不是2、1、0。调用完SetColumn之后,第2列就可以编辑了。需要注意的第二点是,虽然调用SetColumn之后,界面上列的顺序改变了,但在List内部,并没有任何变化,列的索引也没有变化,界面上的第0列,在内部仍然是第2列。调用 CString str = m_list.GetItemText(0, 2)之后,str的内部仍然是"Subitem 2"。
LVCOLUMN col;
col.mask = LVCF_ORDER;
col.iOrder = 0;
m_list.SetColumn(2, &col);
// 调用完SetColumn之后,界面上只有Header移动了位置,Item并没有改变,需要调用Invalidate刷新一下界面。
m_list.Invalidate();