C#WinForm,DataGridViewCell GetFormattedValue调用过于频繁

时间:2014-01-03 12:30:09

标签: c# winforms datagridview

我正在学习自定义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);
    }



}

1 个答案:

答案 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事件,检查值是否有效,如果没有,请将其更改为默认值。