Шаблон визуализации настраиваемого поля Sharepoint: циклически проходить по подколонкам поля с несколькими столбцами - PullRequest
1 голос
/ 25 ноября 2010

У меня есть поле Custom Sharepoint, которое наследуется от SPFieldMultiColumn. значения поля выглядят так:

"; # столбец одно значение; # столбец два значение; значение #column три; # "

Я хочу отобразить каждый элемент в отдельной строке и удалить

; #

Я проверил эту ссылку 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>

но для этого требуется, чтобы число SubColumns было предопределено, в моем случае это может быть любое число.

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

как это можно сделать? спасибо

Ответы [ 4 ]

1 голос
/ 04 января 2011

Мина,

У меня кончается бензин, когда я помогаю вам, вот полное содержание моих заголовков 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 голосов
/ 02 февраля 2011

whan SPFieldMultiColumn объект использует метод override BaseFieldControl FieldRenderingControl он загружает объект, который наследуется от BaseFieldControl,

Итак, объект, который наследует BaseFieldControl, имеет метод, который вызывает

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);
        }**

    }
}
0 голосов
/ 31 декабря 2010

Я получил ту же проблему, которая была вызвана ParentType в файле XML

Перед установкой:

<Field Name="ParentType">Text</Field>"

После исправления:

<Field Name="ParentType">MultiColumn</Field>"

Пожалуйста, обратитесь к http://msdn.microsoft.com/en-us/magazine/dd727508.aspx.

0 голосов
/ 25 ноября 2010

Вы можете создать собственный элемент управления поля.См. здесь и здесь для получения стартовой информации о том, как это сделать.

Это дает вам большую гибкость при отображении поля, однако требует больше кода.*

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