如何模仿 Outlook 的分组命名






4.82/5 (6投票s)
如何根据日期对列表视图中的项目进行分组。
引言
最近,我需要对列表视图中的项目进行排序。好吧,我知道你想说,“这没什么难的”。但是,我也需要像 Outlook 那样对它们进行分组。我的意思是“根据日期,今天的项目,昨天的项目,明天的项目,下个月的项目,...”。
Using the Code
首先,我们需要为每个组定义标签
private void Form1_Load(object sender, EventArgs e)
{
string[] groupName = {"Older",
"Last month", "4 weeks ago", "3 weeks ago",
"2 weeks ago", "Last week",
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday",
"Yesterday",
"Today",
"Tomorrow",
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday",
"Next week", "In 2 weeks",
"In 3 weeks", "In 4 weeks", "Next month",
"Newer"};
// populate the group list
foreach(string group in groupName)
listView1.Groups.Add(new ListViewGroup(group));
}
然后,我们需要根据当前日期和项目的日期来定义项目属于哪个组。
internal static int GetDateTimeGroupIndex(DateTime dtRef, DateTime dtSource)
{
// Because week starts on Monday in France
int dtWeekDay = (Convert.ToInt32(dtSource.DayOfWeek) + 6) % 7;
int dtRefWeekDay = (Convert.ToInt32(dtRef.DayOfWeek) + 6) % 7;
int ts = (dtRef.Date - dtSource.Date).Days;
if (ts == 0)
return 0; // same day
if (ts == 1)
return -1; // day before
if (ts == -1)
return 1; // day after
// same week
if ((ts > 1) && (ts <= dtRefWeekDay))
return dtWeekDay - 8;
if ((-ts > 1) && (-ts <= 6 - dtRefWeekDay))
return dtWeekDay + 2;
// previous / next weeks
for (int nIdx = 0; nIdx <= 3; nIdx++)
{
if ((ts > dtRefWeekDay + nIdx * 7) &&
(ts <= dtRefWeekDay + (nIdx + 1) * 7))
if (dtRef.Month == dtSource.Month)
return -(9 + nIdx);
else
return -13;
if ((-ts > 6 - dtRefWeekDay + nIdx * 7) &&
(-ts <= 6 - dtRefWeekDay + (nIdx + 1) * 7))
if (dtRef.Month == dtSource.Month)
return (9 + nIdx);
else
return 13;
}
if (Math.Abs(dtSource.Month - dtRef.Month) == 1)
return Math.Sign(ts) * (-13);
return Math.Sign(ts) * (-14);
}
最后,我们需要为每个项目设置 Group
属性,如下所示
DateTime dtDate = DateTime.Now.AddMonths(-2);
while(dtDate < DateTime.Now.AddMonths(2))
{
ListViewItem item = new ListViewItem("Item " +
dtDate.Date.ToString("dd/MM/yyyy"));
item.Group = listView1.Groups[GetDateTimeGroupIndex(DateTime.Now, dtDate) + 14];
listView1.Items.Add(item);
dtDate = dtDate.AddDays(1);
}
结果是...
关注点
需要注意的是,组的显示顺序与创建顺序相同;这就是为什么我从旧到新创建它们,以及为什么我重复日期名称:第一次是当项目早于今天时(如果今天是星期五,那么上周三的项目将属于标记为“星期三”的组 - 第一个,如果今天是星期一,那么下周三的项目也将属于标记为“星期三”的组,但第二个)。
然后,当列表视图排序时,组也会排序,并且在每个组中,项目也会排序。
历史
- 2009年4月14日:首次提交。