private void UpdateTimeSpan(int value) { _fireSelectionChangedEvent = false; DateTimeInfo info = _selectedDateTimeInfo; //this only occurs when the user manually type in a value for the Value Property if (info == null) { info = _dateTimeInfoList[0]; } TimeSpan?result = null; try { switch (info.Type) { case DateTimePart.Day: result = (( TimeSpan )Value).Add(new TimeSpan(value, 0, 0, 0, 0)); break; case DateTimePart.Hour24: result = (( TimeSpan )Value).Add(new TimeSpan(0, value, 0, 0, 0)); break; case DateTimePart.Minute: result = (( TimeSpan )Value).Add(new TimeSpan(0, 0, value, 0, 0)); break; case DateTimePart.Second: result = (( TimeSpan )Value).Add(new TimeSpan(0, 0, 0, value, 0)); break; case DateTimePart.Millisecond: switch (this.FractionalSecondsDigitsCount) { case 1: value = value * 100; break; case 2: value = value * 10; break; default: value = value * 1; break; } result = (( TimeSpan )Value).Add(new TimeSpan(0, 0, 0, 0, value)); break; default: break; } } catch { //this can occur if the date/time = 1/1/0001 12:00:00 AM which is the smallest date allowed. //I could write code that would validate the date each and everytime but I think that it would be more //efficient if I just handle the edge case and allow an exeption to occur and swallow it instead. } result = ((result != null) && result.HasValue) ? result.Value.TotalMilliseconds > 0 ? result.Value : this.DefaultValue : result; this.Value = this.CoerceValueMinMax(result); //we loose our selection when the Value is set so we need to reselect it without firing the selection changed event this.TextBox.Select(info.StartPosition, info.Length); _fireSelectionChangedEvent = true; }
private void UpdateDateTime(int value) { _fireSelectionChangedEvent = false; DateTimeInfo info = _selectedDateTimeInfo; //this only occurs when the user manually type in a value for the Value Property if (info == null) { info = _dateTimeInfoList[0]; } DateTime?result = null; try { switch (info.Type) { case DateTimePart.Year: { result = (( DateTime )Value).AddYears(value); break; } case DateTimePart.Month: case DateTimePart.MonthName: { result = (( DateTime )Value).AddMonths(value); break; } case DateTimePart.Day: case DateTimePart.DayName: { result = (( DateTime )Value).AddDays(value); break; } case DateTimePart.Hour12: case DateTimePart.Hour24: { result = (( DateTime )Value).AddHours(value); break; } case DateTimePart.Minute: { result = (( DateTime )Value).AddMinutes(value); break; } case DateTimePart.Second: { result = (( DateTime )Value).AddSeconds(value); break; } case DateTimePart.Millisecond: { result = (( DateTime )Value).AddMilliseconds(value); break; } case DateTimePart.AmPmDesignator: { result = (( DateTime )Value).AddHours(value * 12); break; } default: { break; } } } catch { //this can occur if the date/time = 1/1/0001 12:00:00 AM which is the smallest date allowed. //I could write code that would validate the date each and everytime but I think that it would be more //efficient if I just handle the edge case and allow an exeption to occur and swallow it instead. } this.Value = this.CoerceValueMinMax(result); //we loose our selection when the Value is set so we need to reselect it without firing the selection changed event TextBox.Select(info.StartPosition, info.Length); _fireSelectionChangedEvent = true; }
protected override void InitializeDateTimeInfoList() { DateTimeInfo dayInfo = _dateTimeInfoList.FirstOrDefault(x => x.Type == DateTimePart.Day); bool hasDay = dayInfo != null; _dateTimeInfoList.Clear(); if (this.Value.HasValue && this.Value.Value.Days != 0) { int dayLength = this.Value.Value.Days.ToString().Length; _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Day, Length = dayLength, Format = "dd" }); _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Other, Length = 1, Content = ".", IsReadOnly = true }); // Day has been added, move TextBox.Selection to keep it on current DateTimeInfo if (!hasDay && (this.TextBox != null)) { this.TextBox.SelectionStart += (dayLength + 1); } } // Day has been removed, move TextBox.Selection to keep it on current DateTimeInfo else if (hasDay) { this.TextBox.SelectionStart = Math.Max(0, this.TextBox.SelectionStart - (dayInfo.Length + 1)); } _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Hour24, Length = 2, Format = "hh" }); _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Other, Length = 1, Content = ":", IsReadOnly = true }); _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Minute, Length = 2, Format = "mm" }); _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Other, Length = 1, Content = ":", IsReadOnly = true }); _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Second, Length = 2, Format = "ss" }); if (this.FractionalSecondsDigitsCount > 0) { _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Other, Length = 1, Content = ".", IsReadOnly = true }); string fraction = new string( 'f', this.FractionalSecondsDigitsCount ); //If the "f" custom format specifier is used alone, specify "%f" so that it is not misinterpreted as a standard format string. if (fraction.Length == 1) { fraction = "%" + fraction; } _dateTimeInfoList.Add(new DateTimeInfo() { Type = DateTimePart.Millisecond, Length = this.FractionalSecondsDigitsCount, Format = fraction }); } if (this.Value.HasValue) { this.ParseValueIntoTimeSpanInfo(); } }
protected override void InitializeDateTimeInfoList() { _dateTimeInfoList.Clear(); _selectedDateTimeInfo = null; string format = GetFormatString(Format); if (string.IsNullOrEmpty(format)) { return; } while (format.Length > 0) { int elementLength = GetElementLengthByFormat(format); DateTimeInfo info = null; switch (format[0]) { case '"': case '\'': { int closingQuotePosition = format.IndexOf(format[0], 1); info = new DateTimeInfo { IsReadOnly = true, Type = DateTimePart.Other, Length = 1, Content = format.Substring(1, Math.Max(1, closingQuotePosition - 1)) }; elementLength = Math.Max(1, closingQuotePosition + 1); break; } case 'D': case 'd': { string d = format.Substring(0, elementLength); if (elementLength == 1) { d = "%" + d; } if (elementLength > 2) { info = new DateTimeInfo { IsReadOnly = true, Type = DateTimePart.DayName, Format = d } } ; else { info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Day, Format = d } }; break; } case 'F': case 'f': { string f = format.Substring(0, elementLength); if (elementLength == 1) { f = "%" + f; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Millisecond, Format = f }; break; } case 'h': { string h = format.Substring(0, elementLength); if (elementLength == 1) { h = "%" + h; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Hour12, Format = h }; break; } case 'H': { string H = format.Substring(0, elementLength); if (elementLength == 1) { H = "%" + H; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Hour24, Format = H }; break; } case 'M': { string M = format.Substring(0, elementLength); if (elementLength == 1) { M = "%" + M; } if (elementLength >= 3) { info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.MonthName, Format = M } } ; else { info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Month, Format = M } }; break; } case 'S': case 's': { string s = format.Substring(0, elementLength); if (elementLength == 1) { s = "%" + s; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Second, Format = s }; break; } case 'T': case 't': { string t = format.Substring(0, elementLength); if (elementLength == 1) { t = "%" + t; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.AmPmDesignator, Format = t }; break; } case 'Y': case 'y': { string y = format.Substring(0, elementLength); if (elementLength == 1) { y = "%" + y; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Year, Format = y }; break; } case '\\': { if (format.Length >= 2) { info = new DateTimeInfo { IsReadOnly = true, Content = format.Substring(1, 1), Length = 1, Type = DateTimePart.Other }; elementLength = 2; } break; } case 'g': { string g = format.Substring(0, elementLength); if (elementLength == 1) { g = "%" + g; } info = new DateTimeInfo { IsReadOnly = true, Type = DateTimePart.Period, Format = format.Substring(0, elementLength) }; break; } case 'm': { string m = format.Substring(0, elementLength); if (elementLength == 1) { m = "%" + m; } info = new DateTimeInfo { IsReadOnly = false, Type = DateTimePart.Minute, Format = m }; break; } case 'z': { string z = format.Substring(0, elementLength); if (elementLength == 1) { z = "%" + z; } info = new DateTimeInfo { IsReadOnly = true, Type = DateTimePart.TimeZone, Format = z }; break; } default: { elementLength = 1; info = new DateTimeInfo { IsReadOnly = true, Length = 1, Content = format[0].ToString(), Type = DateTimePart.Other }; break; } } _dateTimeInfoList.Add(info); format = format.Substring(elementLength); } }