我的datagridview中有那么一列
因为我绑定了数据库,而且字段属性是datetime,所以在datagridview中修改这一列的单元格,是一件很头疼的事情。
我自写了一个textbox,光标定位到这一列的单元格时,就显示textbox,将值放在textbox中修改,然后定义textbox_Leave事件,textbox内容将转成日期格式后赋给CurrentCell
问题是,当我在textbox中写入“2013”,写到“0”时,光标没有动过,就触发Leave事件啊。
清空textbox,首次写入时候会出现这个问题,再次写入时候,就能将“2013”全部写完,才触发Leave事件。
对于这个问题,谁遇到过,能否给点意见。我试过,把textbox直接放在页面上,没有问题,但是放在datagridview里面,就会出现以上问题了。datagridviewtextbox

解决方案 »

  1.   

    其实你应该自定义列的类型,定义一个datetime类型的列,那样方便    public class DateTimeCell : DataGridViewTextBoxCell
        {
            private DateTimeEdit dtEdit;
            public DateTimeCell()
            {
                //this.Value = "";
            }
            public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
            {
                base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
                this.dtEdit = DataGridView.EditingControl as DateTimeEdit;
                if (this.Value == null)
                {
                    this.dtEdit.Value = (DateTime)this.DefaultNewRowValue;
                }
                else
                {
                    this.dtEdit.Value = Convert.ToDateTime(this.Value);
                }
                //this.dtEdit.Value = Convert.ToDateTime(this.Value);
                //if (this.dtEdit != null)
                //{
                //    this.dtEdit.Format = DateTimePickerFormat.Custom;
                //    this.dtEdit.CustomFormat = dataGridViewCellStyle.Format;
                //    //this.dtEdit.ShowUpDown = ((DateTimeColumn)this.OwningColumn).ShowUpDown;
                //}
            }
            public override Type EditType
            {
                get
                {
                    return typeof(DateTimeEdit);
                }
            }        public override Type ValueType
            {
                get
                {
                    return typeof(DateTime);
                }
            }        protected override object GetValue(int rowIndex)
            {
                return Convert.ToDateTime(base.GetValue(rowIndex)).ToShortDateString();
            }        public override object DefaultNewRowValue
            {
                get
                {
                    return DateTime.Now;
                }
            }
            public override object ParseFormattedValue(object formattedValue, DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.ComponentModel.TypeConverter valueTypeConverter)
            {
                return base.ParseFormattedValue(formattedValue.ToString(), cellStyle, formattedValueTypeConverter, valueTypeConverter);
            }
        }    public class DateTimeColumn : DataGridViewColumn
        {
            public DateTimeColumn() : base(new DateTimeCell()) { }
            public override DataGridViewCell CellTemplate
            {
                get
                {
                    return base.CellTemplate;
                }
                set
                {
                    if (value != null && !value.GetType().IsAssignableFrom(typeof(DateTimeCell)))
                        base.CellTemplate.Value = DateTime.Now.ToShortDateString();
                    base.CellTemplate = value;
                }
            }
        }    public class DateTimeEdit : DateTimePicker, IDataGridViewEditingControl
        {
            private DataGridView gridview;
            private bool valuechanged = false;
            int rowindex;
            public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
            {
                this.Font = dataGridViewCellStyle.Font;
                this.ForeColor = dataGridViewCellStyle.ForeColor;
                this.BackColor = dataGridViewCellStyle.BackColor;
            }
            public DataGridView EditingControlDataGridView
            {
                get
                {
                    return gridview;
                }
                set
                {
                    gridview = value;
                }
            }        public object EditingControlFormattedValue
            {
                get
                {
                    return this.Value.ToShortDateString();
                }
                set
                {
                    if (value != null)
                        this.Value = Convert.ToDateTime(value);
                }
            }        public int EditingControlRowIndex
            {
                get
                {
                    return rowindex;
                }
                set
                {
                    rowindex = value;
                }
            }        public bool EditingControlValueChanged
            {
                get
                {
                    return valuechanged;
                }
                set
                {
                    valuechanged = value;
                }
            }
            public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
            {
                switch (keyData & 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;
                }
            }
            public Cursor EditingPanelCursor
            {
                get { return base.Cursor; }
            }        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
            {
                return EditingControlFormattedValue;
            }        public void PrepareEditingControlForEdit(bool selectAll)
            {        }        public bool RepositionEditingControlOnValueChange
            {
                get { return false; }
            }
            protected override void OnValueChanged(EventArgs eventargs)
            {
                valuechanged = true;
                this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
                base.OnValueChanged(eventargs);
            }
        }