C# и календарь месяца, выбирая несколько дат

Я делаю программу, которая поможет людям "заказывать" заказы для отдела в C#. Они должны иметь возможность выбирать несколько дат в разные месяцы.

Я бы предпочел иметь его, чтобы они могли щелкнуть по дате, а затем сдвинуть щелчок по другой, чтобы выбрать все даты между этими двумя, и также контролировать щелчок, чтобы сделать один выбор / отмена выбора. Они должны иметь возможность перемещаться между месяцами, сохраняя при этом все даты, которые они щелкнули за предыдущий месяц, чтобы они могли просматривать даты, которые они выбрали, чтобы упростить его.

Каков наилучший способ сделать это? Должен ли я использовать календарь месяца по умолчанию в Visual Studio или существует более гибкий?

3 ответа

Вы можете заставить его работать, обнаруживая щелчки по датам, а затем добавляя или удаляя дату щелчка по выделенным датам. Реализуйте событие MouseDown для MonthCalendar:

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

Только одна проблема с этим, он мерцает как дешевый мотель. Не исправить для этого.

WinForms MonthCalendar поддерживает выбор диапазона от начала до конца, но не выбор (де) отдельных дат с помощью Ctrl. Так что, похоже, это не соответствует вашим требованиям.

Просто быстрое примечание: если вы измените размер MonthCalendar, он покажет больше месяцев. Вместе с ответом nobugz, который может дать вам рабочее решение.

Предполагая, что вы используете WPF...

Я бы порекомендовал вам создать простой ListBox и связать свойство ItemsSource со свойством SelectedDates календаря. Когда пользователь выбирает и отменяет выбор дней в Календаре, они будут добавлены или удалены из списка.

Кроме того, вы можете создать класс DateSpan и ValueConverter, чтобы сгруппировать даты в серии в ваш класс DateSpan. Затем вы можете применить конвертер к свойству SelectedDates, чтобы при использовании Shift-Select пользователь мог видеть диапазон дат, а не группу дат (при условии, что это плохо). Логика не будет слишком сложной.

Существует множество сторонних инструментов, но независимо от того, какой элемент управления вы используете, основная проблема останется: вы хотите, чтобы пользователь знал обо всех выбранных элементах, но вы не хотите показывать каждый месяц, содержащий выбранный день в то же время. Лучший ответ, который я могу придумать, - это список.

Другие вопросы по тегам