问题描述
有谁研究过Calculated字段是怎么更新值的?这个字段的值是根据其他字段的值计算出来的,但是当其他字段的值变化的时候,这个字段是怎么样被更新的?看了下反编译后的代码,既没有发现eventreceiver,也没有工作流或者其他方法。
解决方案
解决方案二:
https://msdn.microsoft.com/en-us/library/office/bb862071(v=office.14).aspxhttps://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.spfieldcalculated(v=office.14).aspx可以看看
解决方案三:
看看看msdn的文档,然后反编译了一下dll,我觉得应该是保存Item或者更新field的时候,会刷新这个值;而这个值也像其他值一样,存在数据库中,至于怎样显示存在字段的SchemaXml中;这个是我用控制台读取的值,前面是字段展示类型,后面是值,正好跟反编译里面展示的方法吻合;然后我又去sql里查了一下,里面只有这个值,如下图:
解决方案四:
感谢版主详细的回复,你说的对,确实是在保存Item或者更新field的时候,刷新这个值。但是一直没有找到刷新这个值的代码,一开始猜测可能是用了eventreceiver来捕捉item的保存,然后刷新这个值,结果没有找到eventreceiver,然后猜测可能是用了FormContext的OnSaveHandler,结果反编译代码里也没有找到。同样在SPItem.Update里也没找到哪里更新了calculatedfield。。。会不会是在COM里或者在数据库里刷新的这个值?
解决方案五:
引用3楼shrenk的回复:
感谢版主详细的回复,你说的对,确实是在保存Item或者更新field的时候,刷新这个值。但是一直没有找到刷新这个值的代码,一开始猜测可能是用了eventreceiver来捕捉item的保存,然后刷新这个值,结果没有找到eventreceiver,然后猜测可能是用了FormContext的OnSaveHandler,结果反编译代码里也没有找到。同样在SPItem.Update里也没找到哪里更新了calculatedfield。。。会不会是在COM里或者在数据库里刷新的这个值?
基类SPField里找到下面的方法,可以看看,我估计不一定是这个方法,也是这种方式操作的;privatevoidUpdateInWeb(boolbToggleSealed){SPFieldCalculatedcalculated=thisasSPFieldCalculated;if(calculated!=null){List<Guid>fids=newList<Guid>();List<string>fldTitles=newList<string>();if(calculated.Formula!=null){ParseFormula(this.Fields.Web,calculated.Formula,fids,fldTitles);}this.UpdateSchemaXmlInWeb(this.Node.OuterXml,bToggleSealed,false,false,calculated.Formula,fldTitles,fids);}else{stringnamedStringItem=SPGlobal.GetNamedStringItem(this.Node,"RelationshipDeleteBehavior");if(!string.IsNullOrEmpty(namedStringItem)&&(string.Compare(namedStringItem,"None",true,CultureInfo.InvariantCulture)!=0)){thrownewSPException(SPResource.GetString("LookupRelationshipsSiteColumnsCannotHaveRI",newobject[0]));}stringstr2=SPGlobal.GetNamedStringItem(this.Node,"EnforceUniqueValues");if(!string.IsNullOrEmpty(str2)&&(string.Compare(str2,"true",true,CultureInfo.InvariantCulture)==0)){GuidfieldId=newGuid(SPGlobal.GetNamedStringItem(this.Node,"ID"));if(SPUtility.IsBuiltInFieldDisallowingUniqueness(fieldId)){thrownewSPException(SPResource.GetString("EnforceUniqueValuesDisallowedOnBuiltInFieldId",newobject[0]));}}this.UpdateSchemaXmlInWeb(this.Node.OuterXml,bToggleSealed,false,false,string.Empty,null,null);}}
解决方案六:
之前有个问题问的是计算列不更新的问题,应该跟这个是一个事情,在点编辑item属性的时候会更新计算列,好像是这样,当时我还试了一下