Тип настраиваемого поля, полученный из SPFieldCalculated - PullRequest
1 голос
/ 22 мая 2009

Я пытаюсь создать пользовательский тип поля, который будет отображать значения на основе другого поля в том же списке. (в основном, отображать некоторые изображения на основе значения исходного столбца)

Поскольку этот столбец получает данные целиком на основе другого столбца, я должен убедиться, что значения столбцов не хранятся в базе данных.

Итак, я думаю, мне нужно создать пользовательский тип поля, производный от класса SPFieldCalculated.

Но, когда я пытаюсь это сделать, я получаю сообщение об ошибке «Для типа« Microsoft.SharePoint.SPFieldCalculated »конструкторы не определены»

Как создать настраиваемое поле tpye, полученное из SPFieldCalculated? Если это невозможно, может кто-нибудь хотя бы сказать мне, как мне выполнить мое требование?

Ответы [ 6 ]

2 голосов
/ 28 марта 2011

К сожалению, невозможно наследовать от класса SPCalculatedField, поэтому вы получаете эту ошибку: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfieldcalculated.aspx

Windows SharePoint Services 3.0 делает не поддерживает наследование от этого класс.

Чтобы отобразить изображение на основе значения другого столбца в 2007 году, вам придется выполнить некоторую неприятную CAML-работу в fldtypes ... xml (как упоминает @David A). Вот хорошее место для начала: http://msdn.microsoft.com/en-us/library/aa544291.aspx

Я также собираюсь невинно упомянуть, что могут быть коммерческие альтернативы с этой функциональностью, одну из которых я мог бы помочь создать, и, возможно, упомянул здесь: Веб-часть Sharepoint для условного форматирования?

2 голосов
/ 16 декабря 2009

В fieltype xml вы можете добавить в CAML шаблона LookupColumn. в вашем вопросе вы можете использовать текстовое поле типа и в DisplayPattern написать что-то вроде этого.

<RenderPattern Name="DisplayPattern">
    <HTML><![CDATA[<img src="]]></HTML>
      <LookupColumn Name="FileLeafRef" HTMLEncode="TRUE" />
    <HTML><![CDATA["/>]]></HTML>
</RenderPattern>
1 голос
/ 22 мая 2009

На самом деле вы можете получить больше пробега от создания пользовательского стиля представления для списков.

Это позволит вам полностью изменить способ отображения столбца в HTML-формате, не добавляя вычисляемое поле.

В качестве альтернативы вы также можете подумать, что можно сделать несколько очень забавных вещей с определением пользовательского поля просто в schemaxml. В качестве примера я включил схему xml для одного из полей «name» в обычной библиотеке страниц публикации.

<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>

Гадкий, но мощный.

1 голос
/ 22 мая 2009

Есть ли что-то, что вы хотите от SPFieldCalculated, которого у SPField нет? Я бы решил эту проблему, создав пользовательское поле на основе SPField, а затем либо:

1 Зарегистрируйте получатель событий в редакторе полей и используйте его для установки значения поля.

или

2 Если вы хотите предварительно просмотреть значение в редактируемых / новых формах, рассчитайте значение в поле управления. Это требует, чтобы ваше поле было упорядочено ниже полей, на которых вы основываете свое значение, в противном случае вы в итоге рассчитаете свое значение на основе старых данных.

Я бы также порекомендовал вам сохранить рассчитанное значение, если его пересчитать. Это единственный разумный способ, если вы хотите отобразить данные в виде списков, поскольку вы пишете шаблон рендеринга в CAML, а не в C #.

0 голосов
/ 22 мая 2009

Предполагая, что этот столбец действительно предназначен только для отображения, я могу подумать, что это может помочь в двух случаях:

  1. Используйте вычисленный столбец для создания HTML, а затем JavaScript для «включения»: http://pathtosharepoint.wordpress.com/2008/09/01/apply-color-coding-to-your-sharepoint-lists/
  2. Возможно, вы могли бы сделать это с помощью SharePoint Designer и веб-части DataForm: http://masteringsharepoint.com/blogs/beagle/archive/2008/08/13/DFWP1.aspx
0 голосов
/ 22 мая 2009

Боюсь, я раньше не пробовал создавать настраиваемые поля ... однако у меня есть предложение, которое может сработать. Поле может быть просто полем изображения. Вы можете использовать получатель событий в списке, который вычисляет обязательное поле при каждом изменении целевого поля. Немного затянуто, но если вы не получите способ работы с настраиваемым полем, это может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...