65.9K
CodeProject 正在变化。 阅读更多。
Home

日视图日历控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (148投票s)

2005 年 11 月 9 日

CPOL

3分钟阅读

viewsIcon

1827002

downloadIcon

25064

一个日历 DayView 控件。

引言

本文介绍了如何创建一个日视图控件,以便在所需的应用程序中可视化日程安排功能。 我克隆了 Outlook 日视图的外观以供类似使用。 这是一个屏幕截图

Office 12 主题

Sample Image

Office XP 主题

Sample Image

背景

在编写这个控件之前,我需要一个看起来像 Outlook 中的日视图控件。 我找到了一些商业工具包,但没有一个满足我的要求。 其中一些要求在显示控件之前给出所有约会,有些不是开源的等等。 所以我写了这个控件,是 "匆忙开发"的,我认为其他人可以使用它。 回报使用 CodeProject 的时间 :)

我们有什么?

  • 您可以创建您的约会类来保存特殊信息(除了开始、结束日期和标题之外)。
  • 您不需要从数据库或类似的东西中读取所有约会。
  • 您可以指定将显示多少天。
  • 您可以对约会进行着色以显示不同的视图。
  • 就地编辑。
  • 拖放操作。
  • 没有 Win32 API。
  • 基于主题的渲染。

顺便说一句,它是在 .NET 2.0 的最终版本下编译的。 如果您没有,您需要重新编译该项目。

使用代码

该控件使用一个名为 "Appointment" 的类来可视化视图。 DayView 控件不关注将约会保存到数据库或获取它们。 因此,您需要编写自己的数据库逻辑并响应事件。

该控件实现了这些事件以与宿主应用程序交互

  • dayView1.NewAppointment
  • dayView1.ResolveAppointments
  • dayView1.SelectionChanged

示例应用程序使用列表集合作为约会的容器。 您也可以使用缓存的数据库源。

NewAppointment 事件

当用户想要创建一个约会时,会引发此事件。 事件参数包含新约会的开始日期、结束日期和标题值。 您可以创建从 DayView.Appointment 基类继承的约会类。

示例应用程序只是创建一个新约会,并将其添加到列表集合中。

void dayView1_NewAppointment(object sender, NewAppointmentEventArgs args)
{
    Appointment m_Appointment = new Appointment();

    m_Appointment.StartDate = args.StartDate;
    m_Appointment.EndDate = args.EndDate;
    m_Appointment.Title = args.Title;

    m_Appointments.Add(m_Appointment);
}

ResolveAppointments 事件

DayView 控件需要在某个日期显示约会时,会引发此事件。 事件参数包含所需日期范围的开始日期和结束日期。

示例应用程序扫描列表集合以查找指定的日期范围。 您也可以从您自己的数据库中获取它们。

private void dayView1_ResolveAppointments(object sender, 
                      ResolveAppointmentsEventArgs args)
{
    List<Appointment> m_Apps = new List<Appointment>();

    foreach (Appointment m_App in m_Appointments)
        if ((m_App.StartDate >= args.StartDate) && 
            (m_App.StartDate <= args.EndDate))
            m_Apps.Add(m_App);

    args.Appointments = m_Apps;
}

Selection Changed 事件

当用户选择一个约会时,会引发此事件。

private void dayView1_SelectionChanged(object sender, EventArgs e)
{
    label3.Text = dayView1.SelectionStart.ToString() + 
                  ":" + dayView1.SelectionEnd.ToString();
}

示例应用程序在标签中显示所选约会的开始日期和结束日期。

关注点

当我编写这个控件时,最困难的部分是在屏幕上对约会进行排序而不交叉。 该控件在内部使用 "AppointmentView" 类来保存屏幕上约会的状态。 其余代码是绘制和与外部应用程序隔离。

您可能会看到一些关于全天事件的注释代码,但目前全天事件尚未完成。 当我完成它时,我会更新这篇文章。(感谢 Claus Espersen 实施 Office 12 主题和错误修复。)

历史

  • 14.07.2006
    • 错误修复。
    • 已实现开始小时和开始分钟属性。
    • 已实现基于主题的渲染。
    • 已实现 AllowNew 属性。
    • 修复了鼠标拖放错误。
    • 全天事件的内部更改。
    • 已实现缩放功能。
  • 11.09.2005
    • 初始发布。
© . All rights reserved.