我正在学习自定义DataGridViewCell,我希望我的用户只能输入可以解析为DateTime的字符串,否则将Value设置为2222-2-22(仅用于测试)。我从DataGridViewTextBoxCell继承了一些简单的东西。我已经覆盖了SetValue和GetFormattedValue方法。
代码如下。但是,在运行时,会非常频繁地调用GetFormattedValue方法,而
尝试(Convert.ToDateTime)catch
有一些性能问题。我认为我的代码存在一些问题。
请好好检查一下,非常感谢。
class WMZDGVDateCell : DataGridViewTextBoxCell
{
protected override bool SetValue(int rowIndex, object value)
{
if (value != null) System.Diagnostics.Debug.WriteLine("------in SetValue-------" + value.ToString());
DateTime valueAsDate;
try
{
valueAsDate = Convert.ToDateTime(value);
}
catch
{
valueAsDate = new DateTime(2222, 2, 22);
//throw;
}
return base.SetValue(rowIndex, valueAsDate.ToShortDateString());
}
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
{
if (value != null) System.Diagnostics.Debug.WriteLine("------in GetFormattedValue-------" + value.ToString());
DateTime valueAsFormatted;
try
{
valueAsFormatted = Convert.ToDateTime(value);
}
catch
{
valueAsFormatted = new DateTime(2222, 2, 22);
}
return base.GetFormattedValue(valueAsFormatted.ToShortDateString(), rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
}
}
答案 0 :(得分:2)
我会避免使用Try
Catch
块,除非它们是必要的,因为它们会影响程序的性能。我想出了以下内容:
class WMZDGVDateCell : DataGridViewTextBoxCell
{
protected override bool SetValue(int rowIndex, object value)
{
if (value != null) System.Diagnostics.Debug.WriteLine("------in SetValue-------" + value.ToString());
DateTime valueAsDate;
if (value != null && DateTime.TryParse(value.ToString(), out valueAsDate))
{
//succeeded
}
else
{
valueAsDate = new DateTime(2222, 2, 22);
//failed
}
return base.SetValue(rowIndex, valueAsDate.ToShortDateString());
}
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
{
if (value != null) System.Diagnostics.Debug.WriteLine("------in GetFormattedValue-------" + value.ToString());
DateTime valueAsFormatted;
if (value != null && DateTime.TryParse(value.ToString(), out valueAsFormatted))
{
//succeeded
}
else
{
valueAsFormatted = new DateTime(2222, 2, 22);
//failed
}
return base.GetFormattedValue(valueAsFormatted.ToShortDateString(), rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
}
}
您可以做的另一件事是使用DataGridView
CellEndEdit
事件,检查值是否有效,如果没有,请将其更改为默认值。