Quantcast
Channel: DevExpress Support Center (Examples)
Viewing all articles
Browse latest Browse all 7205

DateEdit - How to select multiple dates

$
0
0

This example shows how to create a DateEdit descendant that will allow date unit selection, and multiple dates and periods selection.

See Also:
Forcing DateEdit to select multiple dates and periods

Question Comments

Added By: Torr Wash at: 12/7/2015 11:52:55 PM    

Example 15.2.3 absolutely stupid and does not correspond to the functional old version!
How to make DateEdit function as DatePeriodEdit?
You have successfully broke what worked for several years.
As it is now, edit  Period or PeriodSet ??
DatePeriodEdit is now impossible to compile because you have cut the necessary classes!

Added By: Nadezhda (DevExpress Support) at: 12/8/2015 7:01:55 AM    

Hello Torr,

We have introduced a calendar control in version 15.2 - CalendarControl. This control has the SelectionMode property.
Now, this calendar is used in DateEdit's popup. Thus, SelectedMode is available in the RepositoryItemDateEdit class. However, there is no way to obtain selection of multiple dates for DateEdit.EditValue at the moment.
If you wish to get or set a selected range, you can use CalendarControl.SelectedRanges. I have modified the example to illustrate it.
Do not hesitate to contact us if you need any further assistance. 

Added By: Torr Wash at: 12/9/2015 8:28:21 AM    

Надежда, я переписал  DatePeriodEdit, чтобы он работал с новой версией DevExpress. Можете обновить Example :)
   
public sealed class DatePeriodEdit : DateEdit
   {
       static DatePeriodEdit() { RepositoryItemDatePeriodEdit.RegisterDatePeriodEdit(); }

       public DatePeriodEdit()
       {
           EditValue = new PeriodsSet();
       }

       public override object EditValue
       {
           get
           {
               var value = base.EditValue as PeriodsSet;
               return value ?? new PeriodsSet();
           }
           set
           {
               if (value is PeriodsSet)
               {
                   base.EditValue = value;
                   return;
               }
               var s = value as string;
               if (s != null)
               {
                   base.EditValue = PeriodsSet.Parse(s);
               }
           }
       }

       public override string EditorTypeName => RepositoryItemDatePeriodEdit.DatePeriodEditName;

       [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
       public new RepositoryItemDatePeriodEdit Properties => base.Properties as RepositoryItemDatePeriodEdit;

       protected override void AcceptPopupValue(object val)
       {
           var calendar = ((PopupDatePeriodEditForm)PopupForm).Calendar;
           var periods = new PeriodsSet();
           foreach (var range in calendar.SelectedRanges)
           {
               periods.Periods.Add(new Period(range.StartDate, range.EndDate.AddDays(-1)));
           }
           EditValue = periods;
       }

       protected override PopupBaseForm CreatePopupForm() { return new PopupDatePeriodEditForm(this); }
       protected override object ExtractParsedValue(ConvertEditValueEventArgs e) { return e.Value; }
   }
   public class PopupDatePeriodEditForm : PopupDateEditForm
   {
       public PopupDatePeriodEditForm(DateEdit ownerEdit) : base(ownerEdit)
       {
       }

       public override void ShowPopupForm()
       {
           base.ShowPopupForm();
           SetSelectedRange();
       }

       protected override void SubscribeCalendarEvents()
       {
           base.SubscribeCalendarEvents();
           Calendar.SelectionChanged += calendar_SelectionChanged;
       }

       protected override void UnsubscribeCalendarEvents()
       {
           base.UnsubscribeCalendarEvents();
           Calendar.SelectionChanged -= calendar_SelectionChanged;
       }

       protected override void AssignCalendarProperties()
       {
           base.AssignCalendarProperties();
           Calendar.SelectionMode = CalendarSelectionMode.Multiple;
           Calendar.CaseWeekDayAbbreviations = TextCaseMode.SentenceCase;
           Calendar.ShowMonthHeaders = false;
           Calendar.ShowYearNavigationButtons = DefaultBoolean.True;
           Calendar.SyncSelectionWithEditValue = false;
       }

       private void SetSelectedRange()
       {
           var value = OwnerEdit.EditValue as PeriodsSet;
           if (value != null && value.Periods.Count > 0)
           {
               Calendar.EditValue = ((Period)value.Periods[value.Periods.Count - 1]).End;
               Calendar.SelectedRanges.BeginUpdate();
               foreach (Period period in value.Periods)
               {
                   Calendar.SelectedRanges.Add(new DateRange(period.Begin, period.End));
               }
               Calendar.SelectedRanges.EndUpdate();
           }
           else
           {
               Calendar.EditValue = OwnerEdit.DateTime;
           }
       }

       private void calendar_SelectionChanged(object sender, EventArgs e)
       {
           //TODO Хотелось бы сразу отображать выбранные периоды в OwnerEdit.Text без дерганий событий
       }
   }
   [UserRepositoryItem("RegisterDatePeriodEdit")]
   public sealed class RepositoryItemDatePeriodEdit : RepositoryItemDateEdit
   {
       public const string DatePeriodEditName = nameof(DatePeriodEdit);
       char _separatorChar = ',';

       static RepositoryItemDatePeriodEdit()
       {
           RegisterDatePeriodEdit();
       }

       public RepositoryItemDatePeriodEdit()
       {
           TextEditStyle = TextEditStyles.DisableTextEditor;
       }

       public override string EditorTypeName => DatePeriodEditName;

       [Description("Gets or sets the character separating periods"), Category(CategoryName.Format), DefaultValue(',')]
       public char SeparatorChar
       {
           get { return _separatorChar; }
           set
           {
               if (SeparatorChar == value) return;
               _separatorChar = value;
               OnPropertiesChanged();
           }
       }

       [Browsable(false)]
       public override MaskProperties Mask => base.Mask;

       [Browsable(false)]
       public override FormatInfo EditFormat => DisplayFormat;

       [Browsable(false)]
       public new DefaultBoolean VistaEditTime => base.VistaEditTime;

       [Browsable(false)]
       public new DefaultBoolean VistaDisplayMode => base.VistaDisplayMode;

       [Browsable(false)]
       public new string EditMask => base.EditMask;

       public static void RegisterDatePeriodEdit()
       {
           EditorRegistrationInfo.Default.Editors.Add(new EditorClassInfo(DatePeriodEditName,
               typeof(DatePeriodEdit), typeof(RepositoryItemDatePeriodEdit),
               typeof(DateEditViewInfo), new ButtonEditPainter(), true));
       }

       public override void Assign(RepositoryItem item)
       {
           base.Assign(item);
           var source = item as RepositoryItemDatePeriodEdit;
           if (source != null) _separatorChar = source.SeparatorChar;
       }

       protected override bool IsNullValue(object editValue)
       {
           var value = editValue as PeriodsSet;
           if (value != null)
               return value.Periods.Count == 0;
           var s = editValue as string;
           if (s == null) return false;

           return PeriodsSet.Parse(s)?.Periods.Count == 0;
       }

       public override string GetDisplayText(FormatInfo format, object editValue)
       {
           var displayText = string.Empty;
           var set = editValue as PeriodsSet;
           if (set != null)
               displayText = set.ToString(format.FormatString, SeparatorChar);
           else
           {
               var s = editValue as string;
               if (s != null)
                   displayText = PeriodsSet.Parse(s).ToString(format.FormatString, SeparatorChar);
           }
           var e = new CustomDisplayTextEventArgs(editValue, displayText);
           if (format != EditFormat)
               RaiseCustomDisplayText(e);
           return e.DisplayText;
       }
   }

Added By: Nadezhda (DevExpress Support) at: 12/10/2015 7:26:04 AM    Hello,

Thank you for your cooperation. I think it would be useful for our customers.

Viewing all articles
Browse latest Browse all 7205

Trending Articles