Не смогла загрузить файл, поэтому прилагаю код:
Код | using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms;
namespace TimeEditControl { #region EditControl public partial class TimeEdit : UserControl, IDataGridViewEditingControl { private int _row; private DataGridView _dgv; private bool _valueChanged = false; private TimeCtr _psForEditSession;
public TimeEdit() { InitializeComponent(); }
private void _mskEdit_Validating(object sender, CancelEventArgs e) { if (this._mskEdit.MaskCompleted) this.OnValueChanged(); e.Cancel = !this._mskEdit.MaskCompleted; }
private void OnValueChanged() { this._valueChanged = true; this._psForEditSession.Number = (this._mskEdit.Text == null ? string.Empty : this._mskEdit.Text); DataGridView dgv = this.EditingControlDataGridView; if (dgv != null) dgv.NotifyCurrentCellDirty(true); }
public void SetupControls(TimeCtr ps) { this._psForEditSession = new TimeCtr(); this._mskEdit.Text = ps.Number; }
#region IDataGridViewEditingControl Members
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { this._mskEdit.Font = dataGridViewCellStyle.Font; this.MinimumSize = this.Size; }
public DataGridView EditingControlDataGridView { get { return this._dgv; } set { this._dgv = value; } }
public object EditingControlFormattedValue { get { return this._psForEditSession; } set { //nothing to do... } }
public int EditingControlRowIndex { get { return this._row; } set { this._row = value; } }
public bool EditingControlValueChanged { get { return this._valueChanged; } set { this._valueChanged = value; } }
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) { switch (keyData & Keys.KeyCode) { case Keys.Down: case Keys.Right: case Keys.Left: case Keys.Up: case Keys.Home: case Keys.End: return true; default: return false; }
}
public Cursor EditingPanelCursor { get { return base.Cursor; } }
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) { return this.EditingControlFormattedValue; }
public void PrepareEditingControlForEdit(bool selectAll) { }
public bool RepositionEditingControlOnValueChange { get { return false; } }
#endregion } #endregion
#region Custom Cell public class DataGridViewPassportCell : DataGridViewTextBoxCell { private const string DEFAULT_STRING = "000000"; private int _heightOfRowBeforeEditMode;
public DataGridViewPassportCell() : base() { }
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); TimeEdit pasCtrl = this.DataGridView.EditingControl as TimeEdit; this._heightOfRowBeforeEditMode = this.OwningRow.Height; this.OwningRow.Height = pasCtrl.Height; TimeCtr pasInCell = this.Value as TimeCtr; if (pasInCell == null) pasInCell = new TimeCtr(); pasCtrl.SetupControls(pasInCell); }
public override void DetachEditingControl() { if (this._heightOfRowBeforeEditMode > 0) this.OwningRow.Height = this._heightOfRowBeforeEditMode; base.DetachEditingControl(); }
public override Type EditType { get { return typeof(TimeEdit); } }
public override Type ValueType { get { return typeof(TimeCtr); } }
public override Type FormattedValueType { get { return typeof(TimeCtr); } }
public override object DefaultNewRowValue { get { return DEFAULT_STRING; } }
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context) { if (value == null) return DEFAULT_STRING; else return TypeDescriptor.GetConverter(value).ConvertToString(value); } } #endregion
#region Custom Column public class DataGridViewPassportColumn : DataGridViewColumn { public DataGridViewPassportColumn() : base(new DataGridViewPassportCell()) { }
public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { if (value != null && !value.GetType().IsAssignableFrom(typeof(DataGridViewPassportCell))) throw new InvalidCastException("Cell must be a PassportCell"); base.CellTemplate = value; } } } #endregion
#region TimeCtr object [TypeConverter(typeof(TimeCtrConverter))] public class TimeCtr { private string _number; public string Number { get { return _number; } set { _number = value; } }
/// <summary> /// Creates a new instance of Passport /// </summary> /// <param name="series">Passport Series</param> /// <param name="number">Number of Passport</param> /// <param name="issueDate">Date of issue</param> public TimeCtr(string number) { this.Number = _number; }
/// <summary> /// Creates a new instance of "default" Passport /// </summary> public TimeCtr() : this("000000") { } } #endregion
#region TimeCtrConverter public class TimeCtrConverter : TypeConverter { private const string DEFAULT_FORMAT_STRING = "{00:00:00}";
// Overrides the ConvertTo method of TypeConverter. public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { TimeCtr pas = value as TimeCtr; return string.Format(DEFAULT_FORMAT_STRING, pas.Number); } return base.ConvertTo(context, culture, value, destinationType); } } #endregion }
|
Здесь библиотека сделана на основе примера из RSDN, только у меня одно поле типа MaskEdit и маска у него должна быть "00:00:00".
Experimenter, может быть посмотришь код? Где то я делаю что-то не так... Когда в проекте использую колонку типа DataGridViewPassportColumn (я её не переименовала), значение у меня не устанавливается |