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