ListView 按错误的列排序
ListView sorting by wrong column
在这个 winapi 程序中,我根据 "Date" 列对所有项目进行排序。但是,它按 "Description" 列而不是 "Date" 列排序。
这是WM_NOTIFY中的代码:
static char szText[10];
NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam;
switch (((LPNMHDR)lParam)->code) {
case LVN_COLUMNCLICK:
if (pNm->iSubItem == 2)
if (ListView_SortItems(pNm->hdr.hwndFrom, CompareFunc,
(LPARAM) (pNm->iSubItem)) == FALSE)
MessageBox(hwnd, "FALSE", "", MB_OK);
break;
/* other WM_NOTIFY code */
}
ListView_SortItems
returns 真,奇怪。
这是 CompareFunc 函数:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
if (lParamSort == 2) {
date d1, d2; // app-defined "date" class
char b1[32], b2[32];
sscanf((char *) lParam1, "%s %d %d", b1, &d1.day, &d1.yr);
sscanf((char *) lParam2, "%s %d %d", b2, &d2.day, &d2.yr);
d1.month = monthtoi(b1); // converts month as string to number
d2.month = monthtoi(b2);
if (d1 > d2) // overloading the ">" and "<" operators
return 1;
else if (d1 < d2)
return -1;
return 0;
}
}
我尝试根据 3 而不是 2(基于 1 与基于 0)检查 iSubItem,但这也不起作用。
我做错了什么?
编辑:
int monthtoi(char *s)
{
int i;
for (i = 0; i < 12; ++i) {
// MONTHS is a global array of char *, containing the months
if (strcmp(MONTHS[i], s) == 0)
return i;
}
return -1;
}
bool date::operator>(const date &x)
{
switch (this->cmp(x)) { // cmp is a private member function
case 0:
case -1:
return false;
case 1:
return true;
}
return false;
}
bool date::operator<(const date &x)
{
switch (this->cmp(x)) {
case 0:
case 1:
return false;
case -1:
return true;
}
return false;
}
int date::cmp(const date &x)
{
if (this->yr > x.yr)
return 1;
else if (this->yr < x.yr)
return -1;
if (this->yr == x.yr) {
if (this->month > x.month)
return 1;
else if (this->month < x.month)
return -1;
else if (this->day > x.day)
return 1;
else if (this->day < x.day)
return -1;
else
return 0;
}
return 0;
}
输入的 lParam1
和 lParam2
不是子项目的字符串,但正如 documentation 所说的那样,它们是与项目关联的数据:
The lParam1 parameter is the 32-bit value associated with the first
item being compared; and the lParam2 parameter is the value associated
with the second item. These are the values that were specified in the
lParam member of the items' LVITEM structure when they were inserted
into the list.
您可以找到完整的 ListView 排序示例here,但它的基础知识如下:
// Custom type storing the item's information, or a link to it
struct myitemdata_t
{
char* pFood;
char* pDescription;
date Date;
...
};
// When adding items to a listview set the item data
m_ctlListView.InsertItem(i, "food");
m_ctlListView.SetItemText(i, 1, "Saturday shopping");
...
// Set the item data for the list item
m_ctlListView.SetItemData(i, (LPARAM) GetItemData(i));
// Your sort function should look like
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
myitemdata_t* pData1 = (myitemdata_t *)lParam1;
myitemdata_t* pData2 = (myitemdata_t *)lParam2;
...
在这个 winapi 程序中,我根据 "Date" 列对所有项目进行排序。但是,它按 "Description" 列而不是 "Date" 列排序。
这是WM_NOTIFY中的代码:
static char szText[10];
NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam;
switch (((LPNMHDR)lParam)->code) {
case LVN_COLUMNCLICK:
if (pNm->iSubItem == 2)
if (ListView_SortItems(pNm->hdr.hwndFrom, CompareFunc,
(LPARAM) (pNm->iSubItem)) == FALSE)
MessageBox(hwnd, "FALSE", "", MB_OK);
break;
/* other WM_NOTIFY code */
}
ListView_SortItems
returns 真,奇怪。
这是 CompareFunc 函数:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
if (lParamSort == 2) {
date d1, d2; // app-defined "date" class
char b1[32], b2[32];
sscanf((char *) lParam1, "%s %d %d", b1, &d1.day, &d1.yr);
sscanf((char *) lParam2, "%s %d %d", b2, &d2.day, &d2.yr);
d1.month = monthtoi(b1); // converts month as string to number
d2.month = monthtoi(b2);
if (d1 > d2) // overloading the ">" and "<" operators
return 1;
else if (d1 < d2)
return -1;
return 0;
}
}
我尝试根据 3 而不是 2(基于 1 与基于 0)检查 iSubItem,但这也不起作用。 我做错了什么?
编辑:
int monthtoi(char *s)
{
int i;
for (i = 0; i < 12; ++i) {
// MONTHS is a global array of char *, containing the months
if (strcmp(MONTHS[i], s) == 0)
return i;
}
return -1;
}
bool date::operator>(const date &x)
{
switch (this->cmp(x)) { // cmp is a private member function
case 0:
case -1:
return false;
case 1:
return true;
}
return false;
}
bool date::operator<(const date &x)
{
switch (this->cmp(x)) {
case 0:
case 1:
return false;
case -1:
return true;
}
return false;
}
int date::cmp(const date &x)
{
if (this->yr > x.yr)
return 1;
else if (this->yr < x.yr)
return -1;
if (this->yr == x.yr) {
if (this->month > x.month)
return 1;
else if (this->month < x.month)
return -1;
else if (this->day > x.day)
return 1;
else if (this->day < x.day)
return -1;
else
return 0;
}
return 0;
}
输入的 lParam1
和 lParam2
不是子项目的字符串,但正如 documentation 所说的那样,它们是与项目关联的数据:
The lParam1 parameter is the 32-bit value associated with the first item being compared; and the lParam2 parameter is the value associated with the second item. These are the values that were specified in the lParam member of the items' LVITEM structure when they were inserted into the list.
您可以找到完整的 ListView 排序示例here,但它的基础知识如下:
// Custom type storing the item's information, or a link to it
struct myitemdata_t
{
char* pFood;
char* pDescription;
date Date;
...
};
// When adding items to a listview set the item data
m_ctlListView.InsertItem(i, "food");
m_ctlListView.SetItemText(i, 1, "Saturday shopping");
...
// Set the item data for the list item
m_ctlListView.SetItemData(i, (LPARAM) GetItemData(i));
// Your sort function should look like
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
myitemdata_t* pData1 = (myitemdata_t *)lParam1;
myitemdata_t* pData2 = (myitemdata_t *)lParam2;
...