Domanda

Sto creando un WebPart che agisce come una nuova forma.Basato su una vista che sto ottenendo nei campi e rendonoli nel mio WebPart usando Spfield.FieldrenderingControl.

Le mie colonne sono colonne del sito, a questo livello sono state effettuate richieste, aggiunte a un tipo di contenuto, che è stato aggiunto a un elenco.Dopo aver aggiunto all'elenco, alcune colonne non richieste non sono state rese necessarie e alcune richieste a livello di colonna del sito non sono ora.

Sotto è il codice che sto usando per rendere il mio modulo.Non importa quello che ho provato, il rendering del controllo sembra essere afferrato dal livello della colonna del sito, non il livello del tipo di contenuto elenco.Non riesco a rendere il controllo da un SpfieldLink.

Ho messo i commenti all'interno del codice intorno all'area che penso potrebbe aver bisogno di modificarsi.

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

Se qualcuno ha idee, sarei molto grato.Ho anche provato a riflettere su Codice Microsoft con un successo limitato.

È stato utile?

Soluzione 2

Ho guardato ulteriormente in questo, e sembra che lo Spfield abbia letto nello stato richiesto del campo Elenco. Tuttavia in un elenco personalizzato, è possibile modificare il campo obbligatorio facendo clic sul nome della colonna nelle impostazioni dell'elenco.

Per una libreria documenti è mancante l'impostazione del campo richiesta. L'unico modo in cui è possibile impostare il campo richiesto è nel tipo di contenuto del sito e spingere verso il basso la modifica, (che cambierebbe il campo richiesto ovunque tu lo usi, non solo nell'elenco specificato) o si effettua il codice, utilizzando .NET o PowerShell per impostare il campo nell'elenco per richiesto. Quindi rimuovere qualsiasi riferimento nel mio codice originale su 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
.

È strano come il codice originale che ho pubblicato Atti molto diversi in un elenco personalizzato rispetto a una libreria di documenti.

Ho scoperto questo, visualizzando la descrizione del campo nel mio WebPart. Se la descrizione locale era diversa dalla descrizione della colonna del sito, quando si chiama campo.Descrizione Hai sempre ottenuto la descrizione locale. Il che significava chiamare SPFIELD dall'elenco ha dato i valori dalla colonna indicata nell'elenco non dalla colonna del sito. Quindi povederò una query se è stata richiesta la colonna sulla lista, e sebbene fosse nella colonna del sito non è stato per la lista.

La correzione alternativa invece di utilizzare PowerShell è quella di creare una pagina Layout che si chiama Dalle impostazioni della libreria che consente di modificare il valore richiesto per ciascuna delle colonne nell'elenco, poiché chiaramente Microsoft ha perso questa funzionalità. (Forse per una buona ragione per cui non ho ancora trovato).

Altri suggerimenti

Forse vedi come il progetto Codeplex Bitchedit lo fa: http://sp2010Batchedit.codeplex.com/ .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top