Domanda

Ho una parte web che contiene una serie di proprietà personalizzate. Solo una di quelle proprietà dei clienti non devono essere impostati dall'utente. Questa proprietà è un int, che rappresentano un identificatore univoco.

Voglio impostare questo identificatore univoco la prima volta che viene creata la parte web. Certamente questo significa che se l'identificatore è 0, ho impostato un nuovo valore che viene incrementato ogni volta che è stato utilizzato un valore.

Tuttavia, il valore della proprietà non vengono salvate a tutti. E 'disponibile per il momento il webpart è sulla pagina, in aggiornamento, il valore verrà impostato con il successivo valore unico. (In realtà l'identificatore univoco non è altro che un numero autoincremented)

La struttura si presenta come segue: [Personalizable ()] InstanceId public int { ottenere { tornare _instanceId; } impostato { _instanceId = valore; } }

La struttura in sé funziona bene quando viene impostata dal curatore parte ApplyChanges metodo. Ho provato alcuni campioni con la GetLimitedWebPartManager, ma mi solleva un'eccezione che la parte web non è sulla pagina. La maggior parte di quei campioni sono utilizzati per la modifica di un webpart arbitraria, il punto qui, voglio cambiare la proprietà della web part quando viene caricato.

Quindi la mia domanda è, quando le proprietà del WebPart vengono salvati e come? C'è la possibilità di salvare le proprietà del cliente della parte web dall'interno della webpart?

Chiunque un'idea di ciò che sto facendo male?

[Aggiornamento] Grazie per suggerimento djeeg. Provato questa variante: (C'è un motivo per cui i nuovi utenti non sono autorizzati a tag immagine uso?) http://www.freeimagehosting.net/image.php?8eb1892142.jpg e ottenere il messaggio che il webpart non è nella pagina (come prima). Ho già cercato per questa eccezione e sono sicuro, questo è l'unico caso WebPartManager che viene utilizzato.

grazie

Holger

È stato utile?

Soluzione

Prova questo

public class CustomWebPart : System.Web.UI.WebControls.WebParts.WebPart {
    private int _instanceId = 0;
    [Personalizable()] 
    public int InstanceId { 
        get { return _instanceId; } 
        set { _instanceId = value; } 
    }
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        if (!Page.IsPostBack) { 
            if(InstanceId == 0) {
                InstanceId = 0; //set it to something   
                //this.WebPartManager.SaveChanges(this);
                using(SPLimitedWebPartManager manager = SPContext.Current.Web.GetLimitedWebPartManager(Page.Url, PersonalizationScope.Shared)) {
                    foreach(AspNetWebpart webpart in manager.WebParts) {
                        using(webpart) {
                            if(webpart == this) {
                                manager.SaveChanges(this);
                                manager.SaveChanges(webpart);
                            }
                        }
                    }
                }
            }
        }
    }
}

Altri suggerimenti

Finalmente ha trovato la soluzione:

http: //www.sharepointdev .net / sharepoint - sviluppo-programmazione / save-web-part-settings-45128.shtml

Ecco un frammento:

        SPContext.Current.Web.AllowUnsafeUpdates = true;
        SPFile file = SPContext.Current.File;
        SPLimitedWebPartManager mgr = file.GetLimitedWebPartManager(PersonalizationScope.Shared);

        for (int index = 0; index < mgr.WebParts.Count;index++ )
        {
            if (mgr.WebParts[index].ID == this.ID)
            {
               // Do your changes                   
               mgr.SaveChanges(mgr.WebParts[index]);
            }
        }
        SPContext.Current.Web.AllowUnsafeUpdates = false;

Si può anche usare:

base.SetPersonalizationDirty();

Per quanto riguarda trovare la vostra parte web nel SPLimitedWebPartManager, anziché scorrendo è possibile utilizzare la proprietà StorageKey.

using(SPLimitedWebPartManager manager = SPContext.Current.Web.GetLimitedWebPartManager(SPContext.Current.Web.Url, PersonalizationScope.Shared))
{
MyWebPartType part = (MyWebPartType)manager.WebParts[((SPWebPartManager(WebPartManager.GetCurrencWebPartManager(Page))).GetStorageKey(this)];
...the rest of your code.

Se si sta ereditando la tua parte web da Microsoft.SharePoint.WebPartPages.WebPart è semplicemente this.StorageKey.

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