Calculated Field是怎么更新值?

计算机器
博客专家认证
2015-07-07 09:50:49
有谁研究过Calculated 字段是怎么更新值的?这个字段的值是根据其他字段的值计算出来的,但是当其他字段的值变化的时候,这个字段是怎么样被更新的? 看了下反编译后的代码,既没有发现event receiver,也没有工作流或者其他方法。
...全文
718 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Justin-Liu 2015-07-08
  • 打赏
  • 举报
回复
之前有个问题问的是计算列不更新的问题,应该跟这个是一个事情,在点编辑item属性的时候会更新计算列,好像是这样,当时我还试了一下
霖雨 版主 2015-07-07
  • 打赏
  • 举报
回复
引用 3 楼 shrenk 的回复:
感谢版主详细的回复,你说的对,确实是在保存Item或者更新field的时候,刷新这个值。 但是一直没有找到刷新这个值的代码,一开始猜测可能是用了event receiver来捕捉item的保存,然后刷新这个值,结果没有找到event receiver,然后猜测可能是用了FormContext的OnSaveHandler,结果反编译代码里也没有找到。同样在SPItem.Update里也没找到哪里更新了calculated field。。。 会不会是在COM里或者在数据库里刷新的这个值?
基类SPField里找到下面的方法,可以看看,我估计不一定是这个方法,也是这种方式操作的;
private void UpdateInWeb(bool bToggleSealed)
{
    SPFieldCalculated calculated = this as SPFieldCalculated;
    if (calculated != null)
    {
        List<Guid> fids = new List<Guid>();
        List<string> fldTitles = new List<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
    {
        string namedStringItem = SPGlobal.GetNamedStringItem(this.Node, "RelationshipDeleteBehavior");
        if (!string.IsNullOrEmpty(namedStringItem) && (string.Compare(namedStringItem, "None", true, CultureInfo.InvariantCulture) != 0))
        {
            throw new SPException(SPResource.GetString("LookupRelationshipsSiteColumnsCannotHaveRI", new object[0]));
        }
        string str2 = SPGlobal.GetNamedStringItem(this.Node, "EnforceUniqueValues");
        if (!string.IsNullOrEmpty(str2) && (string.Compare(str2, "true", true, CultureInfo.InvariantCulture) == 0))
        {
            Guid fieldId = new Guid(SPGlobal.GetNamedStringItem(this.Node, "ID"));
            if (SPUtility.IsBuiltInFieldDisallowingUniqueness(fieldId))
            {
                throw new SPException(SPResource.GetString("EnforceUniqueValuesDisallowedOnBuiltInFieldId", new object[0]));
            }
        }
        this.UpdateSchemaXmlInWeb(this.Node.OuterXml, bToggleSealed, false, false, string.Empty, null, null);
    }
}

计算机器 2015-07-07
  • 打赏
  • 举报
回复
感谢版主详细的回复,你说的对,确实是在保存Item或者更新field的时候,刷新这个值。 但是一直没有找到刷新这个值的代码,一开始猜测可能是用了event receiver来捕捉item的保存,然后刷新这个值,结果没有找到event receiver,然后猜测可能是用了FormContext的OnSaveHandler,结果反编译代码里也没有找到。同样在SPItem.Update里也没找到哪里更新了calculated field。。。 会不会是在COM里或者在数据库里刷新的这个值?
霖雨 版主 2015-07-07
  • 打赏
  • 举报
回复
看看看msdn的文档,然后反编译了一下dll,我觉得应该是保存Item或者更新field的时候,会刷新这个值; 而这个值也像其他值一样,存在数据库中,至于怎样显示存在字段的SchemaXml中; 这个是我用控制台读取的值,前面是字段展示类型,后面是值,正好跟反编译里面展示的方法吻合; 然后我又去sql里查了一下,里面只有这个值,如下图:
霖雨 版主 2015-07-07
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/en-us/library/office/bb862071(v=office.14).aspx https://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.spfieldcalculated(v=office.14).aspx 可以看看

3,242

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 SharePoint
社区管理员
  • SharePoint社区
  • 霖雨
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧