5

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

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

做这个的最好方式是什么?我应该使用 Visual Studio 的默认月历还是存在更灵活的月历?

4

3 回答 3

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();
  }
}

这只是一个问题,它像廉价汽车旅馆一样闪烁。没有解决办法。

于 2009-11-15T23:19:06.267 回答
2

WinForms MonthCalendar 支持从 Start 到 End 选择范围,但不支持使用 Ctrl (取消)选择单个日期。所以它似乎不符合您的要求。

请注意:如果您调整 MonthCalendar 的大小,它将显示更多月份。连同 nobugz 的答案,可能会给你一个可行的解决方案。

于 2009-11-15T21:14:57.013 回答
0

假设您正在使用 WPF ...

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

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

那里有很多第三方工具,但是无论您使用哪个控件,核心问题仍然存在:您希望用户了解所有选定的项目,但您不想显示每个月都包含同一时间选定的日子。我能想到的最好的答案是一个列表。

于 2009-11-15T21:13:44.270 回答