DataGridView自定义格式:解析编辑后的值

时间:2016-01-06 16:23:02

标签: c# datagridview iformatprovider

假设我有一个绑定到BindingSource的DataGridView。 BindingSource有一个MyClass类的DataSource

library(data.table)
setDT(a)[, .(count_all = uniqueN(A), count_BisY = uniqueN(A[B == 'Y']))]

DataGridView将百分比显示为double。所以19%的值显示为0.19,这不是我想要的。

幸运的是,我可以更改列的单元格样式:

public class MyClass
{
    public double Percentage {get; set;}
    ...
}

这使得该值根据当前文化显示为百分比。在我的文化中,0.19显示为19%。

到目前为止一切顺利。但是如果操作员将此值更改为18%并结束编辑单元格会发生什么。

  • 事件CellValidating被引发。在这种情况下,我可以检查输入的文本是否是一个完美的百分比。

然而,在那之后我立即得到一个例外,字符串" 18%"无法格式化为双精度。

我想我必须告诉datagridviewCellStyle使用哪个formatprivider:

dataGridViewCellStyle.Format = "p";

问题假设我有以下课程:

datagridVieCellStyle.FormatProvider = new MyFormatProvider();

class MyFormatProvider : IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        // what to return?
    }
}

我的格式提供程序应如何调用此函数?

1 个答案:

答案 0 :(得分:1)

请勿使用格式提供程序,但请使用事件DataGridView.CellParsing

private void OnCellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
    if (e.ColumnIndex == this.percentageDataGridViewTextBoxColumn.Index
        && e.DesiredType == typeof(double)
        && ContainsPercentSign(e.Value.ToString()))
        {   // parsing a percentage to a double
            var formatProvider = this.dataGridView1.Rows[e.RowIndex]
                                     .Cells[e.ColumnIndex]
                                     .InheritedStyle
                                     .FormatProvider;

            try
            {
                e.Value = ParsePercentageToDouble(e.Value.ToString(), formatProvider);
                e.ParsingApplied = true;
            }
            catch (FormatException)
            {
                e.ParsingApplied = false;
            }
        }
        else
        {   // parsing any other column, let the system parse it
            e.ParsingApplied = false;
        }           
    }
}

MSDN example about this event