MFC ListCtrl如何查找某一行的上一行或者下一行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC ListCtrl如何查找某一行的上一行或者下一行相关的知识,希望对你有一定的参考价值。

我有一个ListCtrl第一列用来显示日期时间,然后我在两个DateTimePicker分别输入日期、时间。如果条件相等的话可以查找到,但是我又想在不相等的情况下,查找ListCtrl最接近DateTimePicker的上一行或者下一行,要怎么实现?贴一段代码,望高手解答。

void CClientDlg::OnBnClickedSelect()

int i;
CTime stDate,stTime;
CString strDTime;
CString strItem1,strItem1Time1;
m_dtYMD.GetTime(stDate);
m_dtHMS.GetTime(stTime);
//获取DateTimePicker时间
strDTime.Format("%04d-%02d-%02d %02d:%02d",stDate.GetYear(),stDate.GetMonth(),stDate.GetDay(),stTime.GetHour(),stTime.GetMinute());

for(i = 0;i < m_lstDtf.GetItemCount();i++)

//获取ListCtrl第一列日期、时间
strItem1 = m_lstDtf.GetItemText(i,0);
strItem1Time1 = strItem1.Left(16);

if(strDTime == strItem1Time1)

m_lstDtf.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED|LVIS_FOCUSED);
m_lstDtf.SetFocus();
m_lstDtf.EnsureVisible(i,FALSE);
break;



//无此时间段视频,定位到相邻行,弹出消息对话框 ???
if(i == m_lstDtf.GetItemCount())

MessageBox("无此时间段视频",NULL,MB_OK|MB_ICONWARNING);
return;


假设我输入2014-10-24 8:30:00,但ListCtrl只有2014-10-24 8:10:00和2014-10-24 8:50:00,我想在2014-10-24 8:10:00或者2014-10-24 8:50:00处高亮显示

遍历列表,计算输入时间和列表项的时间差,找到时间差最小的那一项,并设置选中状态。

求时间差可以先将两个时间标准化,然后用MFC提供的类库来运算,例如:

COleDateTime  m_tStartDateTime;
COleDateTime  m_tEndDateTime ;
//赋值,此处省略
COleDateTimeSpan tMinute = m_tEndDateTime - m_tStartDateTime;  
int iMinute = (int)tMinute.GetTotalMinutes();
//iMinute即为相差分钟数

追问

你说的m_tStartDateTime和m_tEndDateTime哪个是DateTimePicker输入的,哪个是ListCtrl里面的

追答

无所谓,都一样

追问

iMinute可以求出,但要怎么判断它是最小的那一项呢?

追答

遍历数组找最小值,很基本的算法,比排序还简单,建议多看些经典算法。

参考技术A 我建议,用个结构体来保存Cstring key = 2014-10-24 8:10:00,__int64 value = 2014102481000

比较的时候用value

在 MFC 中更改 CListCtrl 的样式

【中文标题】在 MFC 中更改 CListCtrl 的样式【英文标题】:Changing style of CListCtrl in MFC 【发布时间】:2013-12-12 14:58:38 【问题描述】:

我在 mfc 应用程序的一个对话框中有一个 ListCtrl。我想更改列名样式和按钮样式,使其看起来更像 win7 主题。这是右边有 listCtrl 的旧对话框。

我想把表格的第一行和按钮改成这样,

这可以通过 m_ElementListCtrl.SetExtendedStyle(..) 更改任何样式来完成吗?或改变它的一些属性?

【问题讨论】:

【参考方案1】:

您好,如果您的应用是 Unicode(否则有 some problems),您需要使用通用控件 6。

在您的stdafx.h 文件中,您可能会看到这种代码,如果没有,只需将其添加到文件末尾,如果您将应用更改为 UNICODE,您将看到具有新样式的控件。

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32'   name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32'name='Microsoft.Windows.Common-Controls' version='6.0.0.0'processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

同时检查项目属性->链接器->清单文件->生成清单应该设置在Yes (/MANIFEST)

【讨论】:

以上是关于MFC ListCtrl如何查找某一行的上一行或者下一行的主要内容,如果未能解决你的问题,请参考以下文章

MFC的list control控件,如何得到某一行某列的字符串内容?

MFC如何让ListCtrl的CheckBox只有一个处于选中状态

listctrl控件怎么用?

execl中如何统计某列中指定数值的上一行数值?

在MFC中使用listctrl控件,要修改某行某列的值

mfc如何用txt保存下拉框控件的内容?下拉框如何读入TXT中的内容到属性-数据中?