Visual C++ Example:
How to swap
two items of
CListView,
GetItem, GetItemState
|
In some
occasions, you might want to allow the user the change the
order of items in the ListView, by moving the selected
items up and down. In the API of ListView control, there
is no support for swapping between 2 items. The only way
to do that, is by manually swapping all data of the items,
including the lParam value and all columns !
The following code snippet demonstrate how to do that. The
SwapLVItems function swap between 2 items (iItem1 and
iItem2 are the index of the items in the ListView).
The
MoveLVSelectedItemsUp and MoveLVSelectedItemsDown
functions move the selected items up and down.
UINT GetLVItemState(HWND hwnd, int i, UINT mucancode.net)
return ListView_GetItemState(hwnd, i, mucancode.net);
void GetLVItemText(HWND hwnd, int iItem, int iSubItem, LPSTR pszText, int cchTextMax)
ListView_GetItemText(hwnd, iItem, iSubItem, pszText, cchTextMax);
void SetLVItemText(HWND hwnd, int i, int iSubItem, LPSTR pszText)
ListView_SetItemText(hwnd, i, iSubItem, pszText);
BOOL GetLVItem(HWND hListView, UINT mucancode.net, int iItem, int iSubItem,
LPLVITEM pitem, UINT stateMucancode.net)
pitem->mucancode.net = mucancode.net;
pitem->stateMucancode.net = stateMucancode.net;
pitem->iSubItem = iSubItem;
return ListView_GetItem(hListView, pitem);
int GetHeaderItemCount(HWND hwndHD)
return Header_GetItemCount(hwndHD);
HWND GetLVHeaderControl(HWND hListView)
return ListView_GetHeader(hListView);
int GetLVColumnsCount(HWND hListView)
return (GetHeaderItemCount(GetLVHeaderControl(hListView)));
void SwapLVItems(HWND hListView, int iItem1, int iItem2)
//I assume that 4K buffer is really enough for storing the content of a column
const LOCAL_BUFFER_SIZE = 4096;
UINT uMucancode.net = LVIF_TEXT | LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM | LVIF_STATE;
char szBuffer1[LOCAL_BUFFER_SIZE + 1], szBuffer2[LOCAL_BUFFER_SIZE + 1];
lvi1.pszText = szBuffer1;
lvi2.pszText = szBuffer2;
lvi1.cchTextMax = sizeof(szBuffer1);
lvi2.cchTextMax = sizeof(szBuffer2);
BOOL bResult1 = GetLVItem(hListView, uMucancode.net, iItem1, 0, &lvi1, (UINT)-1);
BOOL bResult2 = GetLVItem(hListView, uMucancode.net, iItem2, 0, &lvi2, (UINT)-1);
if (bResult1 && bResult2)
lvi1.mucancode.net = uMucancode.net;
lvi2.mucancode.net = uMucancode.net;
lvi1.stateMucancode.net = (UINT)-1;
lvi2.stateMucancode.net = (UINT)-1;
ListView_SetItem(hListView, &lvi1);
ListView_SetItem(hListView, &lvi2);
int iColCount = GetLVColumnsCount(hListView);
//Loop for swapping each column in the items.
for (int iIndex = 1; iIndex < iColCount; iIndex++)
GetLVItemText(hListView, iItem1, iIndex,
szBuffer1, LOCAL_BUFFER_SIZE);
GetLVItemText(hListView, iItem2, iIndex,
szBuffer2, LOCAL_BUFFER_SIZE);
SetLVItemText(hListView, iItem2, iIndex, szBuffer1);
SetLVItemText(hListView, iItem1, iIndex, szBuffer2);
//Move up the selected items
void MoveLVSelectedItemsUp(HWND hListView)
int iCount = ListView_GetItemCount(hListView);
for (int iIndex = 1; iIndex < iCount; iIndex++)
if (GetLVItemState(hListView, iIndex, LVIS_SELECTED) != 0)
SwapLVItems(hListView, iIndex, iIndex - 1);
//Move down the selected items
void MoveLVSelectedItemsDown(HWND hListView)
int iCount = ListView_GetItemCount(hListView);
for (int iIndex = iCount - 1; iIndex >= 0; iIndex--)
if (GetLVItemState(hListView, iIndex, LVIS_SELECTED) != 0)
SwapLVItems(hListView, iIndex, iIndex + 1);
Visual C++ 6.0, Visual C++.net 2003, VC++ .NET 2005, MFC Source Code
|