无法将多个项目插入列表视图控件的单行
Posted
技术标签:
【中文标题】无法将多个项目插入列表视图控件的单行【英文标题】:Failing to insert multiple items into single row of List view control 【发布时间】:2012-11-22 13:30:34 【问题描述】:我正在尝试使用以下代码创建具有两列的 Listview 控件。
LV_COLUMN lvc = 0;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 180;
lvc.pszText = _T("Title");
lvc.cchTextMax = _tcslen(lvc.pszText);
ListView_InsertColumn(hwndList, 0, &lvc);
lvc.pszText = _T("ApplicationName");
lvc.cchTextMax = _tcslen(lvc.pszText);
ListView_InsertColumn(hwndList, 1, &lvc);
插入两个列。这是成功插入的。 然后我想在第一行分别为 Title & ApplicationName 列添加 2 个项目。
我正在使用结构:
typedef struct
TCHAR m_title[512];
TCHAR m_Application[512];
APPLICATION_LIST;
然后尝试在同一行中插入多个项目:
APPLICATION_LIST *pAppList = new APPLICATION_LIST;
if(pAppList)
_tcscpy(pAppList->m_title,TEXT("My Mozilla"));
_tcscpy(pAppList->m_Application,TEXT("FireFox"));
LVITEM lvi = 0;
lvi.mask = LVIF_PARAM | LVIF_TEXT;
lvi.iItem = ListView_GetItemCount(hwndList);
lvi.pszText = LPSTR_TEXTCALLBACK ;
ListView_InsertItem(hwndList,&lvi);
但我无法使用这个将多个项目插入同一行!我哪里出错了?这样做时不会插入任何项目!
请帮我纠正这个代码?那么如何在列表视图控件的同一行中插入多个项目。
【问题讨论】:
【参考方案1】:您指定了LVIF_PARAM
标志,但没有分配lvi.lParam
字段。你需要添加它。那么,要正确使用LPSTR_TEXTCALLBACK
,ListView的父窗口的消息过程需要处理LVN_GETDISPINFO
通知。它将提供一个指向 LVITEM
结构的指针,该结构指定它希望您为其提供文本的列表项和列。您可以使用该项目的lParam
访问您的APPLICATION_LIST
指针并将相应的字符串复制到该项目的pszText
缓冲区中。
例如:
LV_COLUMN lvc = 0;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 180;
lvc.pszText = TEXT("Title");
lvc.cchTextMax = lstrlen(lvc.pszText);
ListView_InsertColumn(hwndList, 0, &lvc);
...
lvc.pszText = TEXT("ApplicationName");
lvc.cchTextMax = lstrlen(lvc.pszText);
ListView_InsertColumn(hwndList, 1, &lvc);
.
typedef struct
TCHAR m_title[512];
TCHAR m_Application[512];
APPLICATION_INFO;
APPLICATION_INFO *pAppInfo = new APPLICATION_INFO;
lstrcpy(pAppInfo->m_title, TEXT("My Mozilla"));
lstrcpy(pAppInfo->m_Application, TEXT("FireFox"));
LVITEM lvi = 0;
lvi.mask = LVIF_PARAM | LVIF_TEXT;
lvi.iItem = ListView_GetItemCount(hwndList);
lvi.pszText = LPSTR_TEXTCALLBACK;
lvi.lParam = reinterpret_cast<LPARAM>(pAppInfo);
ListView_InsertItem(hwndList,&lvi);
.
case WM_NOTIFY:
NMDR *nmhdr = reinterpret_cast<NMHDR*>(msg.lParam);
if ((nmhdr->hwndFrom == hwndList) && (nmhdr->code == LVN_GETDISPINFO))
NMLVDISPINFO pdi = reinterpret_cast<NMLVDISPINFO*>(msg.lParam);
if (pdi->item.mask & LVIF_TEXT)
APPLICATION_INFO *pAppInfo = reinterpret_cast<APPLICATION_INFO*>(pdi->item.lParam);
switch (pdi->item.iSubItem)
case 0:
lstrcpyn(pdi->item.pszText, pAppInfo->m_Title, pdi->item->cchTextMax);
break;
case 1:
lstrcpyn(pdi->item.pszText, pAppInfo->m_Application, pdi->item->cchTextMax);
break;
else
...
break;
【讨论】:
以上是关于无法将多个项目插入列表视图控件的单行的主要内容,如果未能解决你的问题,请参考以下文章
SWIFT:在具有多个部分的表视图中显示字典时,无法将具有标识符单元格错误的单元格出列
将 SQLite 表数据显示到列表视图中,就在将数据插入同一 Activity 上的表之后,无需关闭 Activity 并重新打开