关于Value、ValueType、FormattedValue、FormattedValueType、GetFormattedValue、CellFormatting的思考

Google  FormattedValueType  结果搜到的信息少得可怜,决定自己认真总结一下,但一提笔,啊不应该是一一键盘才知道写文章比敲代码难多了....看不下去的话欢迎拍砖。

看着标题估计大伙就晕了,其实,这标题还是不够完整........




下面说一下DataGridView从绑定数据源到整个显示在我们眼前是到底是怎样的流程

首先第一步,绑定数据源,这是最底层的步骤,最先发生的事

然后显示

DataGridView里面的单元格也就是Cell ,是一个一个画出来的

当DataGridView绑定了数据源,也就确定了它每一行每一列每个Cell 应该显示什么值,啊不,这么说也许为时过早,下面我们会知道为什么这么说不完全正确,但暂且先这么以为倒也无可厚非



上面说了,DataGridView里的Cell是一个一个画的,这里要再补充一句,“画完一个显示一个”

于是其实我们红字部分要讨论的问题其实也可以说成在某一个Cell将要显示的时候,上面的事件与属性涉及的顺序



不带卖关子的,首先呢, DataGridVeiw会触发它的CellPaitting事件来画DataGridViewCell,

然后 ,Cell会调用自己的 Paint事件来画自己,画完了,就要显示值了

所以接下来就是GetFormattedValue()

这点很好理解,画Cell的时候Cell要显示值,显示什么值呢?当然是数据库里和它绑定的值,那是把数据库里的值丝毫不动的搬过来吗?

不是

一定要将库里的值转换成Cell里能显示的值才行,Cell里能显示的值一般来说,绝大部分是String类型的值,例外是CheckBoxCell和ImageCell, 一个是Boolean类型的值,一个是ImageCell类型的值



好了,继续说GetFormattedValue() ,这个函数的第一个参数(别怕,我只说这一个参数,后面的参数与本文没啥关系)

是 object value,这就是绑定到数据源时,这个Cell被分配到的值

咱们就得对它操作,把他变成FormattedValueType所指定的类型

变好了之后

这个函数会引发CellFormatting事件(在这个事件l里通过e.DesiredType属性你可以看到一般Cell的DesiredType为String,而CheckBoxCell为Boolean)进行相应操作,你可以在这个事件里将已经被GetFormattedValue() format过了的值进行更进一步的format ,比如说,设置一下e.Format , 让原来的"12345" 在单元格里显示为 "12345.000"

这里要说一下Value和ValueType, Value 的值就是 GetFormatedValue里面 object value 参数的值

但至于这个Value 是在何时获得数据源里的值(也就是 objcet value)的,这我就不知道了,反正不是在 GetFormattedValue里面(我检测过,不必质疑),应该是再 GetFormattedValue之后的某个事件中



CellFormatting可以通过e.Value和e.Formatz这两个属性修改最终显示到Cell中的值,但是他并不能修改Cell的Value这个属性,你可以做个实验,在CellFormatting里把原本显示到2行2列单元格的值由 “pig”改为“dog”,再加个按钮,

写上 MessageBox.Show(dataGridView1.Rows[2].Cells[2].Value.ToString());

然后等DataGridView全都显示出来了,按一下按钮,必定会弹出"pig" , 而不是 “dog”

这也就说明了 在CellFormatting 事件中 的 e.Value 并不是这个 Cell的FormattedValue (其实是ConvertEventArgs.Value, 详情参考MSDN或是我在百度上的前几篇文章http://hi.baidu.com/ulquiorra_sifo/blog)


你可能感兴趣的:(.Net)