C#和月历,选择多个日期

时间:2009-11-15 21:02:33

标签: c# winforms monthcalendar

我正在制作一个程序,帮助人们“预订”C#部门的订单。他们需要能够在不同的月份选择多个日期。

我更愿意拥有它,以便他们可以点击日期,然后按住另一个选择这两个之间的所有日期,并控制点击,进行单一选择/取消选择。他们必须能够在几个月之间移动,同时仍然保留他们上个月点击的所有日期,这样他们就可以概览他们选择的日期以使其更容易。

最好的方法是什么?我应该使用Visual Studio的默认月份日历还是存在更灵活的日历?

3 个答案:

答案 0 :(得分:8)

您可以通过检测日期点击,然后在加粗日期中添加或删除点击日期来使其工作。实现MonthCalendar的MouseDown事件:

private void monthCalendar1_MouseDown(object sender, MouseEventArgs e) {
  MonthCalendar.HitTestInfo info = monthCalendar1.HitTest(e.Location);
  if (info.HitArea == MonthCalendar.HitArea.Date) {
    if (monthCalendar1.BoldedDates.Contains(info.Time))
      monthCalendar1.RemoveBoldedDate(info.Time);
    else 
      monthCalendar1.AddBoldedDate(info.Time);
    monthCalendar1.UpdateBoldedDates();
  }
}

这只是一个问题,它像一个便宜的汽车旅馆一样闪烁。没有解决方法。

答案 1 :(得分:2)

WinForms MonthCalendar支持从开始到结束选择范围,但不支持使用Ctrl选择(de)各个日期。所以它似乎不符合你的要求。

快速说明:如果您调整MonthCalendar的大小,它将显示更多月份。加上nobugz的回答可能会给你一个有效的解决方案。

答案 2 :(得分:0)

假设您正在使用WPF ...

我建议您创建一个简单的ListBox并将ItemsSource属性绑定到Calendar的SelectedDates属性。当用户从日历中选择和取消选择日期时,它们将被添加到列表中或从列表中删除。

此外,您可以创建一个DateSpan类和一个ValueConverter,将一系列日期分组到DateSpan类中。然后,您可以将转换器应用于SelectedDates属性,以便当用户使用Shift-Select时,它们将看到日期跨度而不是一堆日期(假设这是一件坏事)。逻辑不会太复杂。

有很多第三方工具,但无论您使用哪种控件,核心问题都将保留:您希望用户了解所有选定的项目,但您不希望每个月都显示包含选定日期的同一天。我能想到的最佳答案就是清单。