奥德赛F9 发表于 2015-9-27 13:54:53

Sharepoint带自定义属性的FieldType

  先闲话几句,有意义的内容在后面。
  新项目中,很多东西都感觉却要自己写FieldType,如前面所说,在UI可定制方面,FieldType还有很多不足。虽然貌似今天看到TemplateName会起一些作用(未测试),但实际上修改起来也是相当麻烦的。
  今天原本准备写一个DateTime的FieldType的,WSS3自带的的DateTime FieldType在Firefox下没有Calendar来选日期,就为这一个“小小”功能,原准备怎么修改原来的FieldType来实现兼容(可以一改就把原有的List中一并做到兼容了,跟RichText改成TinyMCE编辑一样),结果是失败。另外,WSS3的DateTime FieldType弹出的Calendar并不是无刷新的,点出来的速度之慢——已经超出我忍受的范围。
  另一个是想增加一个更好的Dropdownlist,原来是想增加一个ComboBox的东东的记得某次看到过?在某个同事做的站点上看到过,最终也不知道怎么做出来的。
  WSS自带的Dropdownlist只有一个Value属性,而且,存入的就直接是Value了,估计是为了简化一些细节吧。Value和Text是用的同一个。我想写一个可以同时设置Value和Text属性的Dropdownlist(我的Value需要数字值,要拿来做其它的计算用)。
  之前做的FieldType都只是一个Edit,一个Render而已,并不会在选择到List的时候给初始值(像Dropdownlist的Items),看了几眼那个代码觉得太复杂了。今天实在是无耐,只好自己再硬着头皮看代码,并且写出这样的FieldType。
  最后,我看着网上的代码有不习惯的地方,看WSPBuilder生成的代码也有不习惯的地方,最终么,中和成了一个我习惯一些的代码 :( 成了跟两边都不相同,不知这样会不会生成一些麻烦~~~
  
  可能有点意义的正文
  
  1.FieldType的实现,例子很多,参见末尾的参考
  A.《Inside WSS 3.0》(网上有电子书,各部分内容都很全面)
  B.WSP Builder里面新创建一个FieldType。
  C.VS WSS Extension应该也可以生成,我没有安装,没测过。
  2.需要的文件:
  普通的FieldType(4个文件):
  fldty_TestField.xml(Field的XML定义)
  TestField.cs(Field的定义,会设置调用哪一个FieldControl来编辑或显示)
  TestFieldControl.cs(定义此Field的编辑与显示,以及获取值的方法,在此要区分是否Display状态)
  TestFieldEditor.ascx(会在FieldControl类中被调用(一般只是FindControl方式去找控件而已,并不是一般的UserControl关系)
  有自定义属性的增加2个:
  TestFieldProEditor.ascx(设置属性的UserControl,需要在xml中指明,且有后台代码类)
  TestFieldPro.cs(上一个文件需要的类,基本上跟普通的UserControl一样了)
  多Column的FieldType增加一个:
  TestFieldValue.cs(多Column值的定义)
  3.WSPBuilder生成的代码
  A.WSPBuilder生成的代码没有TestFieldControl.ascx,是自己直接给出控件的,我还是手动把这个添加上去了,觉得这样写起来要容易一些,修改也简便一点。
  B.WSPBuilder生成的为带有自定义属性的FieldType,我想这种一般不会太多吧,删除掉多余的。
  C.WSPBuilder生成的东东,TestField.cs写得很复杂,注册属性等觉得稍显麻烦,貌似还带了缓存OMG,本来就已经够晕了,这样写更晕。我一般修改成很简单的方式。
4.其它
  几个小的细节,我自己开始出错的地方:
  A.TestFieldEditor.ascx里面有个ID,应该与TestFieldControl.cs里的对应,这样才可以用FindControl来找控件。
  B.在xml里只定义TestFieldProEditor.ascx的位置,TestFieldEditor必须放在指定文件夹了,且似乎文件名随便起。(没看到哪里有指定这个对应关系的)
  C.如果要做带属性的FieldType,必须在xml里也把属性定义出来!虽然我实在想不通这两者有什么关联 :(
  但不定出来就会出现值存不起去的情况。
  5.RenderParten
  可能有点复杂,我一直没怎么写。就直接Render了。
  另外可以publish一些属性给外面调用此控件使用,也可以做到更多的自定义。
  6.自定义属性的一个Bug
  新建的时候自定义属性不能保存值,但Update时则能保存结果。
  处理此Bug的方法WSPBuilder自动生成的代码能应对。
  参见另一篇日志:
  About sharepoint custom FieldType bug
  http://www.cnblogs.com/nonlyli/archive/2008/06/01/1211669.html
  
  参考:
  1.创建MOSS2007自定义字段类型实例 (写得简单易懂)
  2.自定义列表字段类型(1)(2)(3) (可惜还是未完待续)
  3.Creating Custom Field Types with a FieldEditorUserControl (attached sample below)
  (详细,且针对Custom Properties)
页: [1]
查看完整版本: Sharepoint带自定义属性的FieldType