Question

Je crée une webpart qui agit comme une nouvelle forme.Basé sur une vue, je me promène sur des champs et je les rendant dans mon webPart en utilisant SPFIELD.FIELDRENDONTROL.

Mes colonnes sont des colonnes de site, à ce niveau, certaines ont été faites obligatoire, ajoutées à un type de contenu, qui a été ajouté à une liste.Après avoir ajouté à la liste, certaines colonnes qui n'étaient pas requises ont été faites obligatoire et certaines nécessaires au niveau de la colonne Site ne sont maintenant pas.

ci-dessous est le code que j'utilise pour rendre mon formulaire.Peu importe ce que j'ai essayé, le rendu du contrôle semble être saisi au niveau de la colonne Site, et non le niveau de type de contenu de la liste.Je suis incapable de rendre le contrôle d'un SPFIEDLINK.

J'ai mis des commentaires dans le code autour de la zone que je pense avoir besoin de modifier.

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

Si quelqu'un a des idées, je serais très reconnaissant.J'ai même essayé de réfléchir sur le code Microsoft avec un succès limité.

Était-ce utile?

La solution 2

J'ai examiné plus loin dans cela, et il semble que le SPFIELD ait lu dans l'état requis du champ Liste. Toutefois, sur une liste personnalisée, vous pouvez modifier le champ requis en cliquant sur le nom de la colonne dans les paramètres de la liste.

Pour une bibliothèque de documents, le paramètre de champ requis est manquant. La seule façon de définir le champ requis est soit dans le type de contenu du site, puis appuyez sur la modification (ce qui modifierait le champ requis partout que vous l'utilisez, non seulement sur la liste donnée) ou que vous code, en utilisant .NET ou PowerShell Pour définir le champ sur la liste requise. Ensuite, supprimez toute référence dans mon code d'origine sur SPFIEDLINK.

$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

Il est étrange comment le code d'origine i posté des actes très différents dans une liste personnalisée par rapport à une bibliothèque de documents.

J'ai découvert cela, en affichant la description du champ dans mon webpart. Si la description locale était différente de la description de la colonne Site, lorsque vous appelez le champ.description Vous avez toujours obtenu la description locale. Ce qui signifiait appeler SPFIELD de la liste vous a donné les valeurs de la colonne indiquée dans la liste non de la colonne Site. Donc, j'ai PowerSheled une requête si la colonne de la liste était requise, et bien que c'était dans la colonne Site, ce n'était pas pour la liste.

Correction alternative au lieu d'utiliser PowerShell consiste à créer une page de mise en page à partir de paramètres de la bibliothèque qui vous permet de modifier la valeur requise pour chacune des colonnes de la liste, car il est clair que Microsoft a raté cette fonctionnalité. (Peut-être pour une bonne raison que je n'ai pas encore trouvé).

Autres conseils

Peut-être voir comment le projet Codépleplex Batchedit le fait: http://sp2010batchédit.codeplex.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top