Question

J'ai une partie Web qui contient un certain nombre de propriétés personnalisées. Une seule de ces propriétés du client ne doit pas être défini par l'utilisateur. Cette propriété est un entier, qui représentent un identifiant unique.

Je veux mettre cet identifiant unique la première fois la partie web est créé. Certes, cela veut dire que si l'identifiant est égal à 0, I réglé à une nouvelle valeur qui est incrémentée à chaque fois qu'une valeur a été utilisée.

Toutefois, la valeur de la propriété ne soit pas sauvé du tout. Il est disponible pour le moment le webpart est sur la page, le rafraîchissement, la valeur sera définie avec la prochaine valeur unique. (En fait, l'identifiant unique est rien d'autre qu'un numéro auto-incrémentée)

La propriété ressemble à ceci: [Personalizable ()] InstanceId public int { avoir { retourner _instanceId; } ensemble { _instanceId = valeur; } }

La propriété elle-même fonctionne très bien quand il est fixé par l'éditeur partie applyChanges méthode. J'ai essayé quelques échantillons avec le GetLimitedWebPartManager, mais il me déclenche une exception que la partie web est pas sur la page. La plupart de ces échantillons sont utilisés pour la modification d'un webpart arbitraire, le point ici, je veux changer la propriété de la partie Web quand il est chargé.

Alors ma question est, quand être sauvé les propriétés du comment et WebPart? Est-il possible d'enregistrer les propriétés des clients de la partie web de l'intérieur du webpart?

Toute une idée de ce que je fais mal?

[Mise à jour] Merci pour soupçon djeeg. Essayé cette variante: (Y at-il une raison pour laquelle les nouveaux utilisateurs ne sont pas autorisés à des balises d'image utilisation?) http://www.freeimagehosting.net/image.php?8eb1892142.jpg et le message que le webpart est pas sur la page (comme avant). Je l'ai déjà cherché à cette exception et je suis sûr, c'est la seule instance de WebPartManager qui est utilisé.

Merci

Holger

Était-ce utile?

La solution

Essayer cette

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

Autres conseils

enfin trouvé la solution:

http: //www.sharepointdev .net / sharepoint - développement programmation / sauvegarde Web-partie-settings-45128.shtml

Voici un extrait:

        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;

On peut aussi utiliser:

base.SetPersonalizationDirty();

En ce qui concerne la conclusion de votre partie Web dans le SPLimitedWebPartManager, au lieu de bouclage, vous pouvez utiliser la propriété 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.

Ou si vous héritez votre Webpart Microsoft.SharePoint.WebPartPages.WebPart il est tout simplement this.StorageKey.

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