Torna al Thread

using System; using System.ComponentModel; using System.Globalization; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace FormControls { /// <summary> /// Represents a Windows date time picker control. It enhances the .NET standard <b>DateTimePicker</b> /// control with a ReadOnly mode as well as with the possibility to show empty values (null values). /// </summary> [ComVisible(false)] public class NullableDateTimePicker : System.Windows.Forms.DateTimePicker { #region Member variables // true, when no date shall be displayed (empty DateTimePicker) private bool _isNull; // If _isNull = true, this value is shown in the DTP private string _nullValue; // The format of the DateTimePicker control private DateTimePickerFormat _format = DateTimePickerFormat.Long; // The custom format of the DateTimePicker control private string _customFormat; // The format of the DateTimePicker control as string private string _formatAsString; #endregion #region Constructor /// <summary> /// Default Constructor /// </summary> public NullableDateTimePicker() : base() { base.Format = DateTimePickerFormat.Custom; NullValue = " "; Format = DateTimePickerFormat.Long; } #endregion #region Public properties /// <summary> /// Gets or sets the date/time value assigned to the control. /// </summary> /// <value>The DateTime value assigned to the control /// </value> /// <remarks> /// <p>If the <b>Value</b> property has not been changed in code or by the user, it is set /// to the current date and time (<see cref="DateTime.Now"/>).</p> /// <p>If <b>Value</b> is <b>null</b>, the DateTimePicker shows /// <see cref="NullValue"/>.</p> /// </remarks> public new Object Value { get { if (_isNull) return null; else return base.Value; } set { if (value == null || value == DBNull.Value) { SetToNullValue(); } else { SetToDateTimeValue(); base.Value = (DateTime)value; } } } /// <summary> /// Gets or sets the format of the date and time displayed in the control. /// </summary> /// <value>One of the <see cref="DateTimePickerFormat"/> values. The default is /// <see cref="DateTimePickerFormat.Long"/>.</value> [Browsable(true)] [DefaultValue(DateTimePickerFormat.Long), TypeConverter(typeof(Enum))] public new DateTimePickerFormat Format { get { return _format; } set { _format = value; SetFormat(); OnFormatChanged(EventArgs.Empty); } } /// <summary> /// Gets or sets the custom date/time format string. /// <value>A string that represents the custom date/time format. The default is a null /// reference (<b>Nothing</b> in Visual Basic).</value> /// </summary> public new String CustomFormat { get { return _customFormat; } set { _customFormat = value; } } /// <summary> /// Gets or sets the string value that is assigned to the control as null value. /// </summary> /// <value>The string value assigned to the control as null value.</value> /// <remarks> /// If the <see cref="Value"/> is <b>null</b>, <b>NullValue</b> is /// shown in the <b>DateTimePicker</b> control. /// </remarks> [Browsable(true)] [Category("Behavior")] [Description("The string used to display null values in the control")] [DefaultValue(" ")] public String NullValue { get { return _nullValue; } set { _nullValue = value; } } #endregion #region Private methods/properties /// <summary> /// Stores the current format of the DateTimePicker as string. /// </summary> private string FormatAsString { get { return _formatAsString; } set { _formatAsString = value; base.CustomFormat = value; } } /// <summary> /// Sets the format according to the current DateTimePickerFormat. /// </summary> private void SetFormat() { CultureInfo ci = Thread.CurrentThread.CurrentCulture; DateTimeFormatInfo dtf = ci.DateTimeFormat; switch (_format) { case DateTimePickerFormat.Long: FormatAsString = dtf.LongDatePattern; break; case DateTimePickerFormat.Short: FormatAsString = dtf.ShortDatePattern; break; case DateTimePickerFormat.Time: FormatAsString = dtf.ShortTimePattern; break; case DateTimePickerFormat.Custom: FormatAsString = this.CustomFormat; break; } } /// <summary> /// Sets the <b>DateTimePicker</b> to the value of the <see cref="NullValue"/> property. /// </summary> private void SetToNullValue() { _isNull = true; base.CustomFormat = (_nullValue == null || _nullValue == String.Empty) ? " " : "'" + _nullValue + "'"; } /// <summary> /// Sets the <b>DateTimePicker</b> back to a non null value. /// </summary> private void SetToDateTimeValue() { if (_isNull) { SetFormat(); _isNull = false; base.OnValueChanged(new EventArgs()); } } #endregion #region MouseAndKeyEvent /// <summary> /// This member overrides <see cref="DateTimePicker.OnCloseUp"/>. /// </summary> /// <param name="e"></param> protected override void OnCloseUp(EventArgs e) { if (Control.MouseButtons == MouseButtons.None) { if (_isNull) { SetToDateTimeValue(); _isNull = false; } } base.OnCloseUp (e); } /// <summary> /// This member overrides <see cref="Control.OnKeyDown"/>. /// </summary> /// <param name="e"></param> protected override void OnKeyUp(KeyEventArgs e) { if (e.KeyCode == Keys.Delete) { this.Value = null; OnValueChanged(EventArgs.Empty); } base.OnKeyUp(e); } #endregion } }
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5