Пользовательское поле SharePoint BCS Edit и NewForm

Сценарий: Ive получил источник данных, поступающих через BCS, и представлен как всегда представленный из коробки с BCS. Я хотел бы сделать это, чтобы настроить New и EditForms, чтобы позволить DropDown в одном из моих полей.

Я попытался: создать настраиваемое поле на основе SPFieldChoide (проверено в пользовательском списке, и оно отлично работает), а через XML файл конфигурации BCS (.bdcm) добавлено свойство SPCustomFieldType в поле, которое я хочу настроить.

Ошибка: я могу открыть страницы ReadItem/NewForm/EditForm, а настраиваемые полевые рендеринги просто прекрасны, но при этом открывается ошибка при открытии страницы ReadList

Ошибка при выполнении веб-части: System.NotSupportedException: метод GetFieldAttributeValue не поддерживается на BiConvenioGrupoChoiceField для внешних списков. в Microsoft.SharePoint.SPExternalList.ThrowNotSupportedExceptionForMethod(String sMethodName, Тип typeTrowing) в Microsoft.SharePoint.SPFieldChoice.get_Sortable() в Microsoft.SharePoint.SPField.AnnotateField (поле XmlNodeRefNode) в Microsoft.SharePoint.WebPartPages.XsltListViewWebPart.AddInFieldSchema(XmlNodeList fieldRefNodes, список SPList) в Microsoft.SharePoint.WebPartPages.XsltListViewWebPart.AddInTypeInfoIntoViewXml(XmlNode viewXml) в Microsoft.SharePoint.WebPartPages.XsltListViewWebPart.ModifyXsltArgumentList(ArgumentClassWrapper argList) в Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)

Позвольте пройти через код.

Пользовательское поле.cs

class BiConvenioGrupoChoiceField : SPFieldChoice
{ #region Constructors public BiConvenioGrupoChoiceField(SPFieldCollection fields, string fieldName) : base(fields, fieldName) { } public BiConvenioGrupoChoiceField(SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName) { } #endregion #region Properties public override string TypeDisplayName { get { return "BiConvenioGrupoChoiceField"; } } public override BaseFieldControl FieldRenderingControl { get { BaseFieldControl fieldControl = new BiConvenioGrupoChoiceFieldControl(); fieldControl.FieldName = InternalName; return fieldControl; } } #endregion
}

Пользовательское поле управления

class BiConvenioGrupoChoiceFieldControl : BaseFieldControl
{ DropDownList customDropDown; protected override string DefaultTemplateName { get { return "DropDownRenderingTemplate"; } } protected override void CreateChildControls() { try { base.CreateChildControls(); customDropDown = (DropDownList)TemplateContainer.FindControl("customDropDown"); if (customDropDown != null) { customDropDown.ID = this.FieldName; if (this.ControlMode == SPControlMode.New || this.ControlMode == SPControlMode.Edit) { customDropDown.Items.Add(new ListItem("Option 0", "0")); customDropDown.Items.Add(new ListItem("Option 1", "1")); customDropDown.Items.Add(new ListItem("Option 2", "2")); customDropDown.Items.Add(new ListItem("Option 9", "9")); } } } catch (Exception ex) { SystemLogger.Logger.Log(ex, LoggingLevel.Fatal); } } public override object Value { get { EnsureChildControls(); return customDropDown.SelectedValue; } set { this.EnsureChildControls(); customDropDown.SelectedValue = (string)ItemFieldValue; } }
}

BCS.bdcm

<method name="Create"> <parameters> <parameter name="returnCCCadastrados" direction="Return"> <typedescriptor name="ReturnCCCadastrados" typename="Models.ConvenioBI, CCCadastradosBDC"> <typedescriptors> <typedescriptor name="Dbico_sq" defaultdisplayname="Id" identifiername="Dbico_sq" typename="System.Int32"> <typedescriptor name="Descricao" defaultdisplayname="Descrição" typename="System.String"> <typedescriptor name="CodigoCorporativo" defaultdisplayname="Código Corporativo" typename="System.String"> <typedescriptor name="Login" defaultdisplayname="Criado Por" typename="System.String"> <typedescriptor name="Grupo" defaultdisplayname="Grupo" typename="System.String"> <properties> <property name="SPCustomFieldType" type="System.String">BiConvenioGrupoChoiceField</property> </properties> </typedescriptor> <typedescriptor name="DtCriacao" defaultdisplayname="Data Criação" iscollection="false" typename="System.DateTime"> <interpretation> <normalizedatetime lobdatetimemode="UTC"> </normalizedatetime></interpretation> </typedescriptor> <typedescriptor name="DtAtualizacao" defaultdisplayname="Data Atualização" iscollection="false" typename="System.DateTime"> <interpretation> <normalizedatetime lobdatetimemode="UTC"> </normalizedatetime></interpretation> </typedescriptor> </typedescriptor></typedescriptor></typedescriptor></typedescriptor></typedescriptors></typedescriptor></parameter> <parameter name="newCCCadastrados" direction="In"> <typedescriptor name="NewCCCadastrados" typename="Models.ConvenioBI, CCCadastradosBDC"> <typedescriptors> <typedescriptor name="Descricao" defaultdisplayname="Descrição" typename="System.String" creatorfield="true"> <typedescriptor name="CodigoCorporativo" defaultdisplayname="Código Corporativo" typename="System.String" creatorfield="true"> <typedescriptor typename="System.String" name="Grupo" defaultdisplayname="Grupo" creatorfield="true"> <properties> <property name="SPCustomFieldType" type="System.String">BiConvenioGrupoChoiceField</property> </properties> </typedescriptor> </typedescriptor></typedescriptor></typedescriptors> </typedescriptor> </parameter> </parameters> <methodinstances> <methodinstance name="Create" type="Creator" returnparametername="returnCCCadastrados" returntypedescriptorpath="ReturnCCCadastrados"> </methodinstance></methodinstances> </method>
1 ответ

Я просто переопределяю свойство Sortable в моем настраиваемом полевом классе.

public override bool Sortable
{ get { return false; }
}

Работает как шарм.

licensed under cc by-sa 3.0 with attribution.