【问题标题】:Custom field type derived from SPFieldCalculated从 SPFieldCalculated 派生的自定义字段类型
【发布时间】:2011-03-28 18:32:54
【问题描述】:

我正在尝试创建一个自定义字段类型,它将基于同一列表中的另一个字段显示值。 (基本上就是根据源列的值显示一些图片)

由于此列的数据完全基于另一列,我需要确保列值未存储在数据库中。

所以,我想我需要创建一个派生自 SPFieldCalculated 类的自定义字段类型。

但是,当我尝试这样做时,我收到一条错误消息 "'Microsoft.SharePoint.SPFieldCalculated' 类型没有定义构造函数"

如何创建从 SPFieldCalculated 派生的自定义字段 tpye? 如果这是不可能的,至少有人可以告诉我如何满足我的要求吗?

【问题讨论】:

    标签: sharepoint sharepoint-2007 moss


    【解决方案1】:

    在字段类型 xml 中,您可以在模板的 CAML 中添加 LookupColumn。 在您的问题中,您可以使用字段类型文本并在 DisplayPattern 中编写类似这样的内容。

    <RenderPattern Name="DisplayPattern">
        <HTML><![CDATA[<img src="]]></HTML>
          <LookupColumn Name="FileLeafRef" HTMLEncode="TRUE" />
        <HTML><![CDATA["/>]]></HTML>
    </RenderPattern>
    

    【讨论】:

      【解决方案2】:

      不幸的是,无法从 SPCalculatedField 类继承,这就是您收到该错误的原因: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfieldcalculated.aspx

      Windows SharePoint Services 3.0 可以 不支持继承this 类。

      为了在 2007 年显示基于另一列值的图像,您将不得不在 fldtypes...xml 中进行一些令人不快的 CAML 工作(正如 @David A 所提到的)。这是一个很好的起点: http://msdn.microsoft.com/en-us/library/aa544291.aspx

      我还要天真地提到,这个功能可能有商业替代品,我可能帮助创建了其中一个,并且可能在这里提到过: Sharepoint webpart for conditional formatting?

      【讨论】:

        【解决方案3】:

        你想从 SPFieldCalculated 中得到什么 SPField 没有的东西吗?我会通过创建基于 SPField 的自定义字段来解决问题,然后我会:

        1 在字段编辑器中注册一个事件接收器,并使用它来设置字段的值。

        2 如果要预览编辑/新建表单中的值,请计算字段控件中的值。这要求您的字段在您的值所基于的字段下方排序,否则您最终将根据旧数据计算您的值。

        如果重新计算,我还建议您保存计算的值。如果您想在列表视图中显示数据,这是唯一合理的方式,因为您使用 CAML 而不是 C# 编写渲染模式。

        【讨论】:

          【解决方案4】:

          实际上,为列表创建custom view style 可能会获得更多收益。

          这将允许您完全更改列显示 html 的方式,而无需添加计算字段。

          您也可以考虑使用 schemaxml 中的自定义字段定义来做一些非常时髦的事情。作为示例,我在普通发布页面库中包含“名称”字段之一的架构 xml。

          <Field ID="{9d30f126-ba48-446b-b8f9-83745f322ebe}" ReadOnly="TRUE" Type="Computed" Name="LinkFilenameNoMenu" DisplayName="Name" DisplayNameSrcField="FileLeafRef" Filterable="FALSE" AuthoringInfo="(linked to document)" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="LinkFilenameNoMenu" FromBaseType="TRUE"><FieldRefs><FieldRef Name="FileLeafRef" /><FieldRef Name="FSObjType" /><FieldRef Name="Created_x0020_Date" /><FieldRef Name="FileRef" /><FieldRef Name="File_x0020_Type" /><FieldRef Name="ContentTypeId" /><FieldRef Name="PermMask" /><FieldRef Name="CheckoutUser" /><FieldRef Name="IsCheckedoutToLocal" /></FieldRefs><DisplayPattern><IfEqual><Expr1><LookupColumn Name="FSObjType" /></Expr1><Expr2>1</Expr2><Then><FieldSwitch><Expr><GetVar Name="RecursiveView" /></Expr><Case Value="1"><LookupColumn Name="FileLeafRef" HTMLEncode="TRUE" /></Case><Default><SetVar Name="UnencodedFilterLink"><SetVar Name="RootFolder"><HTML>/</HTML><LookupColumn Name="FileRef" /></SetVar><SetVar Name="FolderCTID"><FieldSwitch><Expr><ListProperty Select="EnableContentTypes" /></Expr><Case Value="1"><Column Name="ContentTypeId" /></Case></FieldSwitch></SetVar><FilterLink Default="" Paged="FALSE" /></SetVar><HTML><![CDATA[<A onfocus="OnLink(this)" HREF="]]></HTML><GetVar Name="UnencodedFilterLink" HTMLEncode="TRUE" /><HTML><![CDATA[" onclick="javascript:EnterFolder(']]></HTML><ScriptQuote NotAddingQuote="TRUE"><GetVar Name="UnencodedFilterLink" /></ScriptQuote><HTML><![CDATA[');return false;">]]></HTML><LookupColumn Name="FileLeafRef" HTMLEncode="TRUE" /><IfEqual><Expr1><GetVar Name="ShowAccessibleIcon" /></Expr1><Expr2>1</Expr2><Then><HTML><![CDATA[<img src="/_layouts/images/blank.gif" class="ms-hidden" border=0 width=1 height=1 alt="]]></HTML><HTML>Use SHIFT+ENTER to open the menu (new window).</HTML><HTML><![CDATA[">]]></HTML></Then></IfEqual><HTML><![CDATA[</A>]]></HTML></Default></FieldSwitch></Then><Else><HTML><![CDATA[<A onfocus="OnLink(this)" HREF="]]></HTML><Field Name="ServerUrl" URLEncodeAsURL="TRUE" /><HTML><![CDATA[" onclick="return DispEx(this,event,']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ServerProperty Select="HtmlTransform" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ServerProperty Select="HtmlTrAcceptType"><Column Name="File_x0020_Type" /></ServerProperty></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ServerProperty Select="HtmlTrHandleUrl"><Column Name="File_x0020_Type" /></ServerProperty></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ServerProperty Select="HtmlTrProgId"><Column Name="File_x0020_Type" /></ServerProperty></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ListProperty Select="DefaultItemOpen" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><MapToControl><Column Name="HTML_x0020_File_x0020_Type" /><HTML>|</HTML><Column Name="File_x0020_Type" /></MapToControl></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><Column Name="HTML_x0020_File_x0020_Type" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ServerProperty Select="GetServerFileRedirect"><Field Name="ServerUrl" /><HTML>|</HTML><Column Name="HTML_x0020_File_x0020_Type" /></ServerProperty></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><Column Name="CheckoutUser" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><UserID AllowAnonymous="TRUE" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><ListProperty Select="ForceCheckout" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><Field Name="IsCheckedoutToLocal" /></ScriptQuote><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><Field Name="PermMask" /></ScriptQuote><HTML><![CDATA[')">]]></HTML><UrlBaseName HTMLEncode="TRUE"><LookupColumn Name="FileLeafRef" /></UrlBaseName><IfEqual><Expr1><GetVar Name="ShowAccessibleIcon" /></Expr1><Expr2>1</Expr2><Then><HTML><![CDATA[<img src="/_layouts/images/blank.gif" class="ms-hidden" border=0 width=1 height=1 alt="]]></HTML><HTML>Use SHIFT+ENTER to open the menu (new window).</HTML><HTML><![CDATA[">]]></HTML></Then></IfEqual><HTML><![CDATA[</A>]]></HTML><IfNew Name="Created_x0020_Date"><HTML><![CDATA[<IMG SRC="/_layouts/1033/images/new.gif" alt="]]></HTML><HTML>New</HTML><HTML><![CDATA[">]]></HTML></IfNew></Else></IfEqual></DisplayPattern></Field>
          

          讨厌,但很有效。

          【讨论】:

            【解决方案5】:

            恐怕我之前没有尝试过制作自定义字段..但是我有一个可能可行的建议。该字段可以只是一个图片字段。您可以在列表中使用事件接收器,只要目标字段发生更改,它就会计算必填字段。有点啰嗦,但如果你没有让自定义字段工作,这可能会。

            【讨论】:

              【解决方案6】:

              假设此列实际上只是为了显示,我能想到的两种方法可能会有所帮助:

              1. 使用计算列创建 HTML,然后使用 JavaScript “打开”:http://pathtosharepoint.wordpress.com/2008/09/01/apply-color-coding-to-your-sharepoint-lists/
              2. 您可以使用 SharePoint Designer 和 DataForm webpart 执行此操作:http://masteringsharepoint.com/blogs/beagle/archive/2008/08/13/DFWP1.aspx

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-02-17
                • 1970-01-01
                • 2016-03-27
                • 1970-01-01
                • 2013-05-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-24
                相关资源
                最近更新 更多