Frage

Ich habe einen Webpart, der eine Reihe von benutzerdefinierten Eigenschaften enthält. Nur eines dieser Kundeneigenschaften darf vom Benutzer nicht festgelegt werden. Diese Eigenschaft ist eine INT, die eine eindeutige Kennung darstellt.

Ich möchte diese eindeutige Kennung festlegen, sobald der Webpart erstellt wird. Sicherlich bedeutet dies, dass ich, wenn der Kennung 0 ist, auf einen neuen Wert gesetzt habe, der jedes Mal inkrementiert wird, wenn ein Wert verwendet wurde.

Der Wert in der Immobilie wird jedoch überhaupt nicht gespeichert. Es ist für den Zeitpunkt verfügbar, der sich auf der Seite auf der Seite befindet. Auf Aktualisierung wird der Wert mit dem nächsten eindeutigen Wert festgelegt. (Tatsächlich ist die eindeutige Kennung nichts anderes als eine autoinkrementierte Zahl)

Die Eigenschaft sieht so aus: [Personalizable ()] public intin InstanceId {get {return _instanceId; } set {_instanceId = value; }}

Die Eigenschaft selbst funktioniert einwandfrei, wenn sie von der Editor Part ApplyCangenes -Methode festgelegt wird. Ich habe einige Muster mit dem GetLimitedWebPartManager ausprobiert, aber es bringt mir eine Ausnahme, dass sich der Webpart nicht auf der Seite befindet. Die meisten dieser Beispiele werden zum Ändern eines willkürlichen Webparts verwendet. Der Punkt hier möchte ich die Eigenschaft des Webparts ändern, wenn es geladen wird.

Meine Frage ist also, wenn die Eigenschaften des Webparts gespeichert werden und wie? Gibt es die Möglichkeit, die Kundeneigenschaften des Webparts im Webpart zu speichern?

Jemand eine Idee, was ich falsch mache?

Update] Danke für Hinweis Djeeg. Versuchen Sie diese Variante: (Gibt es einen Grund, warum neue Benutzer keine Image -Tags verwenden dürfen?)http://www.freeimageHosting.net/image.php?8eb1892142.jpgund erhalten Sie die Nachricht, dass sich das Webpart nicht auf der Seite befindet (wie zuvor). Ich habe bereits nach dieser Ausnahme gesucht und ich bin sicher, dies ist die einzige WebPartManager -Instanz, die verwendet wird.

Danke

Holger

War es hilfreich?

Lösung

Versuche dies

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

Andere Tipps

Endlich fand die Lösung:

http://www.sharepointdev.net/sharepoint-development-programming/save-web-parts-settings-45128.shtml

Hier ist ein Ausschnitt:

        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;

Wir können auch verwenden:

base.SetPersonalizationDirty();

Soweit das Finden Ihres Web -Teils in der SPLimitedWebPartManager, Anstatt durchzuschleifen, können Sie die verwenden StorageKey Eigentum.

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.

Oder wenn Sie Ihren Webpart von erben Microsoft.SharePoint.WebPartPages.WebPart Es ist einfach this.StorageKey.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top