2010-11-25 57 views
1

的子列我有從SPFieldMultiColumn繼承的自定義SharePoint字段。該字段的值顯示如下:的SharePoint自定義字段渲染模式:循環遍歷多個列字段

「; #column一個值; #column 2 值; #column 3個值;#」

我想在一個單獨的顯示每個項目行,並刪除

;#

我檢查這個環節http://msdn.microsoft.com/en-us/library/ms411957(office.12).aspx ,發現這可以通過覆蓋領域的渲染模式類似這樣的

<RenderPattern Name="DisplayPattern" DisplayName="DisplayPattern"> 
    <Switch> 
    <Expr> 
     <GetVar Name="FreeForm"/> 
    </Expr> 
    <Case Value="TRUE"> 
     <Column/> 
    </Case> 
    <Default> 
     <HTML> 
     <![CDATA[ <DIV ALIGN=RIGHT> ]]> 
     </HTML> 
     <Column/> 
     <HTML> 
     <![CDATA[ </DIV> ]]> 
     </HTML> 
    </Default> 
    </Switch> 
</RenderPattern> 

BU這需要進行預定義子列的數量,在我的情況下,它可以是任何數量來實現。

所以我需要一個for循環來遍歷我的多列字段中的每個子列?

這怎麼辦? 謝謝

回答

0

您可以創建一個自定義字段控件。 請參閱herehere以瞭解如何執行此操作的信息。

這給你在顯示領域極大的靈活性,但它確實涉及更多的代碼。

+0

感謝例子,我已經創建的自定義字段,但是我需要一個CAML循環來在多列字段中的每個子欄來調整它的appearence – 2010-11-28 09:52:58

+0

我想的一個自定義字段.asx控件,您可以完全控制渲染體驗。 – Nat 2010-11-28 20:06:16

+0

切換到xslt。它有更深刻的特徵 – 2011-12-12 15:23:32

1

米娜,

我在幫你跑出來的氣體,這裏是我的XML及相關類的頭供你參考,好運氣的全部內容。

<?xml version="1.0" encoding="utf-8"?> 
<FieldTypes> 
    <FieldType> 
    <Field Name="TypeName">CountryStateCityAddress1Field</Field> 
    <Field Name="TypeDisplayName">CountryStateCityAddress1Field</Field> 
    <Field Name="TypeShortDescription">CountryStateCityAddress1Field</Field> 
    <Field Name="ParentType">MultiColumn</Field> 
    <Field Name="UserCreatable">TRUE</Field> 
    <Field Name="FieldTypeClass">c0d4e972-cae4-4320-b13b-83ed0bf8cedc</Field> 
    <RenderPattern Name="DisplayPattern"> 
     <Switch> 
     <Expr> 
      <Column /> 
     </Expr> 
     <Case Value="" /> 
     <Default> 
      <Column SubColumnNumber="0" HTMLEncode="TRUE" /> 
      <HTML><![CDATA[<br/>]]></HTML> 
      <Column SubColumnNumber="1" HTMLEncode="TRUE" /> 
      <HTML><![CDATA[<br/>]]></HTML> 
      <Column SubColumnNumber="2" HTMLEncode="TRUE" /> 
      <HTML><![CDATA[<br/>]]></HTML> 
     </Default> 
     </Switch> 
    </RenderPattern> 
    </FieldType> 
    <FieldType> 
    <Field Name="TypeName">EMailFieldTypeField</Field> 
    <Field Name="TypeDisplayName">EMailFieldTypeField</Field> 
    <Field Name="TypeShortDescription">EMailFieldTypeField</Field> 
    <Field Name="ParentType">MultiColumn</Field> 
    <Field Name="UserCreatable">TRUE</Field> 
    <Field Name="FieldTypeClass">0e8a370a-0388-4b78-9e5c-ffbb8a481391</Field> 
    <RenderPattern Name="DisplayPattern"> 
     <Switch> 
     <Expr> 
      <Column /> 
     </Expr> 
     <Case Value="" /> 
     <Default> 
      <Column SubColumnNumber="0" HTMLEncode="TRUE" /> 
      <HTML><![CDATA[<br/>]]></HTML> 
      <Column SubColumnNumber="1" HTMLEncode="TRUE" /> 
      <HTML><![CDATA[<br/>]]></HTML> 
      <Column SubColumnNumber="2" HTMLEncode="TRUE" /> 
      <HTML><![CDATA[<br/>]]></HTML> 
     </Default> 
     </Switch> 
    </RenderPattern> 
    </FieldType> 
</FieldTypes> 

接頭:

namespace CustomFieldTypeAddress1 
{ 
    [CLSCompliant(false)] 
    [Guid("0e8a370a-0388-4b78-9e5c-ffbb8a481391")] 
    public class EMailFieldTypeField : SPFieldMultiColumn 
    ... 

namespace CustomFieldTypeAddress1 
{ 
    [CLSCompliant(false)] 
    [Guid("dc20d765-2d36-4396-83aa-f063166d8fcc")] 
    public class EMailFieldTypeFieldControl : BaseFieldControl 
    ... 
0

SPFieldMultiColumn對象使用的方法override BaseFieldControl FieldRenderingControl它加載哪個繼承BaseFieldControlBaseFieldControl繼承對象,

所以,該對象具有調用一個方法

protected override void RenderFieldForDisplay(HtmlTextWriter output){} 

在此方法可以使你適合你的控制。

您可以使用下面

namespace SharePointTestApplication 
{ 
    public class UserChoiceColumn:SPFieldMultiColumn 
    { 
     public UserChoiceColumn(SPFieldCollection fields, string fname) 
      : base(fields, fname) { } 

     public UserChoiceColumn(SPFieldCollection fields, string tname, string dname) 
      : base(fields, tname, dname) { } 

     public override BaseFieldControl FieldRenderingControl 
     { 
      get 
      { 
       BaseFieldControl ctr = new UserChoiceColumnControlType(); 
       ctr.FieldName = this.InternalName; 
       return ctr; 
      } 
     } 

     public override string GetFieldValueAsHtml(object value) 
     { 

      SPFieldMultiColumnValue mcv = new SPFieldMultiColumnValue(value.ToString()); 

      return string.Format("{0} , {1}",mcv[0],mcv[1]); 
     } 


    } 

    public class UserChoiceColumnControlType : BaseFieldControl 
    { 
     #region Protected Members 

     protected TextBox TextBox1; 
     protected TextBox TextBox2; 

     #endregion 

     protected override string DefaultTemplateName 
     { 
      get 
      { 
       return "UserChoiceColumnTemplate"; 
      } 
     } 

     protected override void CreateChildControls() 
     { 
      base.CreateChildControls(); 
      TextBox1 = (TextBox)this.TemplateContainer.FindControl("TextBox1"); 
      TextBox2 = (TextBox)this.TemplateContainer.FindControl("TextBox2"); 
     } 

     public override object Value 
     { 
      get 
      { 
       this.EnsureChildControls(); 
       SPFieldMultiColumnValue mcv = new SPFieldMultiColumnValue(2); 
       mcv[0] = TextBox1.Text; 
       mcv[1] = TextBox2.Text; 
       return mcv; 
      } 
      set 
      { 
       this.EnsureChildControls(); 
       SPFieldMultiColumnValue mcv = (SPFieldMultiColumnValue)this.ItemFieldValue; 
       TextBox1.Text = mcv[0]; 
       TextBox2.Text = mcv[1]; 
      } 
     } 

     **protected override void RenderFieldForDisplay(HtmlTextWriter output) 
     { 
      output.Write("hello world"); 
      // base.RenderFieldForDisplay(output); 
     }** 

    } 
}