using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace AIMS.OremrUserControl { public class CalendarColumn : DataGridViewColumn { private bool showUpDown = true; public bool ShowUpDown { get { return showUpDown; } set { showUpDown = value; } } public CalendarColumn() : base(new CalendarCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a CalendarCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(CalendarCell))) { //PublicMethod.WriteLog(new Exception("Must be a CalendarCell")); } base.CellTemplate = value; } } } public class CalendarCell : DataGridViewTextBoxCell { public CalendarCell() : base() { // Use the short date format. this.Style.Format = " ";//MM-dd hh:mm } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); CalendarEditingControl ctl = DataGridView.EditingControl as CalendarEditingControl; if (this.Value == null) { this.Value = DateTime.Now; this.Style.Format = "HH:mm"; this.Tag = this.Value; ctl.Format = DateTimePickerFormat.Custom; ctl.CustomFormat = dataGridViewCellStyle.Format; } else if (this.Value.ToString() != "") { try { ctl.Value = Convert.ToDateTime(this.Value); ctl.Tag = ctl.Value; } catch (Exception) { } this.Style.Format = "HH:mm"; ctl.Format = DateTimePickerFormat.Custom; ctl.CustomFormat = dataGridViewCellStyle.Format; } else { //this.Value = null; this.Style.Format = " "; } ctl.ValueChanged += new EventHandler(ctl_ValueChanged); ctl.Leave += (s, e) => { this.Style.Format = "MM-dd HH:mm"; ((CalendarEditingControl)s).Format = DateTimePickerFormat.Custom; }; } void ctl_ValueChanged(object sender, EventArgs e) { CalendarEditingControl s = sender as CalendarEditingControl; if (s.Tag == null || (DateTime.Parse(s.Tag.ToString()).Hour != DateTime.Parse(s.Text).Hour || DateTime.Parse(s.Tag.ToString()).Minute != DateTime.Parse(s.Text).Minute)) SendKeys.Send("{right}"); s.Tag = s.Text; } public override Type EditType { get { // Return the type of the editing contol that CalendarCell uses. return typeof(CalendarEditingControl); } } public override Type ValueType { get { // Return the type of the value that CalendarCell contains. return typeof(DateTime); } } public override object DefaultNewRowValue { get { // Use the current date and time as the default value. return null;// DateTime.Now.ToString("MM-dd HH:mm"); } } } public class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl { DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public CalendarEditingControl() { //this.ShowUpDown = base.ShowUpDown; } // Implements the IDataGridViewEditingControl.EditingControlFormattedValue // property. public object EditingControlFormattedValue { get { return this.Value.ToString(); } set { String newValue = value as String; if (newValue != null) { this.Value = DateTime.Parse(newValue); } } } // Implements the // IDataGridViewEditingControl.GetEditingControlFormattedValue method. public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } // Implements the // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method. public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; this.CalendarForeColor = dataGridViewCellStyle.ForeColor; this.CalendarMonthBackground = dataGridViewCellStyle.BackColor; } // Implements the IDataGridViewEditingControl.EditingControlRowIndex // property. public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey // method. public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey) { // Let the DateTimePicker handle the keys listed. switch (key & Keys.KeyCode) { case Keys.Left: case Keys.Up: case Keys.Down: case Keys.Right: case Keys.Home: case Keys.End: case Keys.PageDown: case Keys.PageUp: return true; default: return false; } } // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit // method. public void PrepareEditingControlForEdit(bool selectAll) { // No preparation needs to be done. } // Implements the IDataGridViewEditingControl // .RepositionEditingControlOnValueChange property. public bool RepositionEditingControlOnValueChange { get { return false; } } // Implements the IDataGridViewEditingControl // .EditingControlDataGridView property. public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } // Implements the IDataGridViewEditingControl // .EditingControlValueChanged property. public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } // Implements the IDataGridViewEditingControl // .EditingPanelCursor property. public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnValueChanged(EventArgs eventargs) { // Notify the DataGridView that the contents of the cell // have changed. valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnValueChanged(eventargs); } } }