Wann wird benutzerdefinierte Eigenschaften eines Webparts gespeichert?
-
16-10-2019 - |
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
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
.