문제

새 양식과 같이 작동하는 웹 파트를 만듭니다.보기를 기반으로 필드에 들어가서 Spfield.FieldRenderingControl을 사용하여 내 웹 파트에서 렌더링합니다.

내 열은 사이트 열에 있으며이 레벨에서는 목록에 추가 된 콘텐츠 형식에 추가 된 일부가 만들어졌습니다.목록에 추가 한 후에는 필요하지 않은 특정 열이 필요하며 사이트 열 레벨에서 필요한 일부는 이제는 그렇지 않습니다.

아래의 코드는 제가 사용하는 코드입니다.내가 무엇을 시도했는지, 컨트롤의 렌더링은 목록 콘텐츠 유형 레벨이 아닌 사이트 열 레벨에서 사용할 수있는 것으로 보입니다.SpfiledLink에서 컨트롤을 렌더링 할 수 없습니다.

나는 수정해야 할 일이 필요하다고 생각하는 해당 지역 주변의 코멘트를 넣었습니다.

                try
                {
                    Table table = new Table();
                    table.CssClass = "hlwp_DSCreateEditTable";
                    TableRow row;
                    TableCell cell;
                    SPContentType ct = spList.ContentTypes[ContentTypeName];


                for (int i = 0; i < spView.ViewFields.Count; i++)
                {
                    string fieldName = spView.ViewFields[i];
                    //The flink holds the information at the content type level in the list.
                    SPFieldLink flink = ct.FieldLinks[fieldName];
                    SPField field = spList.Fields.GetField(fieldName);

                    row = new TableRow();
                    row.CssClass = "hlwp_DSCreateEditRow";
                    cell = new TableCell();
                    cell.CssClass = "hlwp_DSCreateEditTitleCell";



    //Even tried setting the field.required to match the flink.required.
    //When debugging and following the code through it stays the same as flink.required, 
    //but if you call Page.Validate() it displays errors on the controls 
    //that are required at the site column level not list content type level.

                    if (flink != null)
                    {
                        field.Required = flink.Required;
                    }

                    if (field.Required)
                    {
                        cell.Text = field.Title + "<font color='red'>*</font>";
                    }
                    else
                    {
                        cell.Text = field.Title;
                    }

                    row.Cells.Add(cell);
                    cell = new TableCell();
                    cell.CssClass = "hlwp_DSCreateEditControlCell";
                    Control cntrl = HelperClass.GetSharePointControls(field, spList, itemId);
                    if (cntrl == null) continue;
                    cell.Controls.Add(cntrl);
                    row.Cells.Add(cell);
                    table.Rows.Add(row);

                }
.

HelperClass.GetSharePointControls

public static Control GetSharePointControls(SPField field, SPList list, int itemId)
        {
          // check if the field is a buildIn field, or can be rendered by a SharePoint Control
            if (field == null || field.FieldRenderingControl == null || field.Hidden) return null;

        Control ctrl = null;
        SPControlMode mode = SPControlMode.Invalid;

        if (itemId > 0)
            mode = SPControlMode.Edit;
        else
            mode = SPControlMode.New;

//Wondering if it's something to do with the context, as later on you set this context to the RenderingContext.
            var controlContext = SPContext.GetContext(System.Web.HttpContext.Current, itemId, list.ID, SPContext.Current.Web);



        SPContext.Current.FormContext.SetFormMode(mode, true);
        controlContext.FormContext.SetFormMode(mode, true);


        try
        {
                BaseFieldControl webControl = field.FieldRenderingControl;
                webControl.ListId = list.ID;
                webControl.ControlMode = mode;
                webControl.ItemId = itemId;
                webControl.FieldName = field.Title;
                webControl.ID = GetControlID(field); //Creates a unique ID.

                webControl.RenderContext = controlContext;
                webControl.ItemContext = controlContext;

                ctrl = webControl;
            }
            return ctrl;
        }
        catch (Exception ex)
        {
            var errorLabel = new Label
            {
                ID = "ErrorLabel",
                Text = String.Format("Error in GetSharePointControls:<br/>{0}", ex)
            };
            return errorLabel;
        }
    }
.

누구든지 아이디어가있는 경우 매우 감사 할 것입니다.나는 한정된 성공으로 Microsoft 코드를 반영하려고 노력했습니다.

도움이 되었습니까?

해결책 2

이 추가로 보았으며 Spfield가 목록 필드의 필수 상태에서 읽는 것처럼 보입니다. 그러나 사용자 정의 목록에서는 목록 설정에서 열 이름을 클릭하여 필수 필드를 편집 할 수 있습니다.

문서 라이브러리의 경우 필수 필드 설정이 누락되었습니다. 필요한 필드를 설정할 수있는 유일한 방법은 사이트 콘텐츠 형식에 있으며 변경 사항을 누르거나 (주어진 목록에뿐만 아니라 필요한 필드를 변경하는 필수 필드를 변경합니다) .NET 또는 PowerShell을 사용하여 코드를 사용하여 코드를 누르십시오. 목록에서 필드를 설정하려면. 그런 다음 원래 코드의 참조를 spfieldLink로 제거하십시오.

$web = Get-SPWeb "[YourSite]"
$list = $web.GetListFromUrl("[Your List URL]")
$field = $list.Fields["[Field Name"]
Write-Host "Previous Value:" $field.Required
$field.Required = $true
$field.Update()
Write-Host "The field" $field.Title "is now set to" $field.Required
.

문서 라이브러리와 비교하여 원래 코드가 게시 된 원래 코드가 사용자 정의 목록에서 매우 다른 방법으로 어떻게 작동하는지 이상합니다.

내 WebPart에 필드 설명을 표시하면이 기능을 발견했습니다. 로컬 설명이 사이트 열 설명과 다르면 Field.Description을 호출 할 때 항상 로컬 설명이 있습니다. 목록에서 spfield를 호출하는 것은 사이트 열에없는 목록에있는 열의 값을 제공했습니다. 그래서 목록의 열이 필수이면 쿼리를 전원을 둡니다. 그리고 사이트 열에 있지만 목록이 아니 었습니다.

PowerShell을 사용하는 대신 대체 수정은 목록의 각 열에 필요한 값을 수정할 수있는 라이브러리 설정에서 호출하는 레이아웃 페이지를 작성하는 것입니다. Microsoft는이 기능을 놓쳤습니다. (어쩌면 내가 아직 발견하지 못한 좋은 이유로).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top