我在一个自定义的DataGridViewColumn
上工作,允许用户输入像1:30
这样的值。
如果用户将其保存到Database
,我有一个函数将其存储为十进制值,因此1:30的值将变为1.5。数据库列是一个float
。
现在,我的问题是,当我输入像1:30这样的时间格式时,单元格不接受。单元格失去焦点后,这些值将消失。那么,是否可以在具有双精度类型的单元格中显示字符串格式(1:30)?多么?你能给我看一些这样做的代码吗?谢谢。
自定义DataGridViewColumn
的代码
public class OptTimeColumn : DataGridViewColumn
{
public OptTimeColumn() : base(new OptTimeCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(OptTimeCell)))
{
throw new InvalidCastException("Must be a OptTimeCell");
}
base.CellTemplate = value;
}
}
}
public class OptTimeCell : DataGridViewTextBoxCell
{
public OptTimeCell() : base()
{
}
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
OptTimeColumnEditingControl ctl = DataGridView.EditingControl as OptTimeColumnEditingControl;
OptTimeColumn col = (OptTimeColumn)this.OwningColumn;
if (this.Value == null)
{
ctl.DecimalValue = Convert.ToDouble(this.DefaultNewRowValue);
}
else
{
ctl.DecimalValue = Convert.ToDouble(this.Value);
}
}
public override Type EditType
{
get
{
return typeof(OptTimeColumnEditingControl);
}
}
public override Type ValueType
{
get
{
//return typeof(string);
return typeof(double);
}
}
public override object DefaultNewRowValue
{
get
{
//return string.Empty;
return DBNull.Value;
}
}
}
public class OptTimeColumnEditingControl : OptTime.OptTime, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
public OptTimeColumnEditingControl()
{
}
public object EditingControlFormattedValue
{
get
{
return this.DecimalValue;
}
set
{
if (value is double)
{
try
{
this.DecimalValue = Convert.ToDouble(value);
}
catch
{
this.DecimalValue = 0;
}
}
}
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
}
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}
public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
{
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;
}
}
public void PrepareEditingControlForEdit(bool selectAll)
{
}
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
protected override void OnTextChanged(EventArgs eventargs)
{
valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(eventargs);
}
}
发布于 2019-06-21 05:09:31
很抱歉这样问:你的db不支持Time或datatypes?
Why-oh-why are you saving time to db as double?
?还有别的吗?UI直接依赖于存储,或者存储依赖于UI,通常是非常糟糕的。在它们之间使用一些层。理想情况下探索MVC、MVVM和DI/IoC。(32)”--然后你在ViewModel中实现的逻辑将需要在两者之间进行转换(希望是无损的)。
https://stackoverflow.com/questions/55738258
复制相似问题