当Windows窗体日历中有5000个日历项时,它会变得很慢
本文关键字:日历 窗体 Windows 5000个 | 更新日期: 2023-09-27 18:08:06
我正在使用Windows日历控件构建一个小时注册程序。现在我有一个问题,当其中有很多议程项目时,这个控件的性能如何。我目前使用下面的测试代码用5000个日历项填充日历:
private void test()
{
Random r = new Random();
int i = 0;
for (i = 1; i <= 500; i++)
{
CalendarItem _calendaritem = new CalendarItem(calendar1);
_calendaritem._activity = "activity" + i.ToString();
_calendaritem._project = "project" + i.ToString();
_calendaritem._client = "client" + i.ToString();
_calendaritem.Text = "Title" + i.ToString();
_calendaritem._price = r.Next(0, 200);
_calendaritem._variouscosts = r.Next(0, 1000);
_calendaritem._Kilprice = r.Next(0, 5);
_calendaritem.BackgroundColor = Color.Yellow;
//_calendaritem.
_calendaritem._note = "note" + i.ToString();
DateTime _newdate = new DateTime(r.Next(2000, 2015), r.Next(1, 12), r.Next(1, 28));
_calendaritem.StartDate = _newdate;
_calendaritem.EndDate = _newdate.AddHours(5);
_items.Add(_calendaritem);
}
}
Calendar仍然可以处理这么多项目,但是性能真的很差。Calendar控件变得非常慢。
有人知道是什么原因引起的吗?
顺便说一下,我认为有一件事可能会导致这个问题,那就是windows日历使用视图范围只在该视图内加载项目。我稍微调整了一下这个机制,否则我就不能保存和打开当前日历控件中所有可能的日历项目日期。例如place items方法是这样的:
private void PlaceItems()
{
foreach (CalendarItem item in _items)
{
if (calendar1.ViewIntersects(item))
{
calendar1.Items.Add(item);
}
}
}
现在我使用下面的代码:
private void PlaceItems()
{
foreach (CalendarItem item in _items)
{
//if (calendar1.ViewIntersects(item))
//{
calendar1.Items.Add(item);
//}
}
}
是否有解决这个问题的方法,而不会失去保存和打开日历中所有日历项的能力?
提前感谢!
各位程序员,我想我自己找到了答案。如果我使用放置项目方法与视图相交函数(就像我编辑它之前一样),当有超过100,000个日历项目时,它也能正常工作。
所以我过去常常通过直接遍历日历来进行保存。像这样的项集合:
foreach (CalendarItem item in calendar1.Items)
{
}
这不起作用,因为只有当前视图中的日历项被保存。但是如果我这样做,所有的项目都按照计划保存,并且没有性能下降:
foreach (CalendarItem item in _items)
{
}
所以它现在工作了!我希望这个答案能对遇到同样问题的人有所帮助。