DataGridView и календарь - C#
Формулировка задачи:
Как в один из столбцов DataGridView вставить раскрывающийся календарь?Может с помощью DateTimePicker?
Решение задачи: «DataGridView и календарь»
textual
Листинг программы
public class CalendarColumn : DataGridViewColumn { 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))) { throw new InvalidCastException("Must be a CalendarCell"); } base.CellTemplate = value; } } } public class CalendarCell : DataGridViewTextBoxCell { public CalendarCell() : base() { // Use the short date format. this.Style.Format = "d"; } public override void InitializeEditingControl(int rowIndex, objectinitialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); CalendarEditingControl ctl = DataGridView.EditingControl asCalendarEditingControl; // Set row value when Value property is not null if (this.Value != null) { ctl.Value = (DateTime)this.Value; } } public override Type EditType { get { // Return the type of the editing control that CalendarCell uses return typeof(CalendarEditingControl); } } public override Type ValueType { get { // Return the type of the value that CalendarCell contains return typeof(DateTime); } } } public class CalendarEditingControl : DateTimePicker,IDataGridViewEditingControl { private DataGridView _dataGridView; private bool _valueChanged; private int _rowIndex; public CalendarEditingControl() { this.Format = DateTimePickerFormat.Short; } // Implements the IDataGridViewEditingControl.EditingControlFormattedValue property public object EditingControlFormattedValue { get { return this.Value.ToShortDateString(); } set { if (value is String) { try { // This will throw an exception of the string is null, empty, or not in the format of a date this.Value = DateTime.Parse((String)value); } catch { // In the case of an exception, just use the default value so we're not left with a null value this.Value = DateTime.Now; } } } } // Implements the IDataGridViewEditingControl.GetEditingControlFormattedValue method public object GetEditingControlFormattedValue(DataGridViewDataErrorContextscontext) { return EditingControlFormattedValue; } // Implements the IDataGridViewEditingControl.ApplyCellStyleToEditingControl method public void ApplyCellStyleToEditingControl(DataGridViewCellStyledataGridViewCellStyle) { 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, booldataGridViewWantsInputKey) { // 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 !dataGridViewWantsInputKey; } } // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit method public void PrepareEditingControlForEdit(bool selectAll) { } // 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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д