2009-07-23 6 views
4

Je crée un composant WebPart pour SharePoint. J'ai une partie de l'éditeur personnalisé qui remplace les méthodes SyncChanges() et ApplyChanges() (entre autres). Le problème est que lorsque je clique sur OK en mode édition, la page passe en mode navigation, mais les données (propriétés) qui ont été modifiées dans EditorPart et enregistrées dans la méthode ApplyChanges() ne sont pas mises à jour. Je dois à nouveau «entrer dans la page» (recharger sans POSTing les données à nouveau) pour voir la modification qui a été faite. Je l'ai débogué et j'ai compris ce qu'il faisait - après avoir cliqué sur OK en mode d'édition, WebPart.CreateChildControls() est appelé en premier, et EditorPart.ApplyChanges() en second. Les données ont donc été mises à jour mais les données non mises à jour étaient affichées.Ordre d'appel des méthodes CreateChildControls() et ApplyChanges() dans un composant WebPart SharePoint

J'ai figuré autre chose dans ce comportement: Ajout d'un contrôle spécifique à mon WebPart dans CreateChildControls() provoque l'ordre incorrect d'appel WebPart.CreateChildControls() et EditorPart.ApplyChanges(). Dans mon cas cela provoque l'ajout des contrôles WebDataTree ou UltraWebTree (de Infragistics) mais cela peut aussi arriver avec le TextBox ASP.NET commun (comme décrit le même problème en détail ici: ASP.net forum thread). Donc, si j'ajoute l'arborescence, CreateChildControls() est appelée en premier et ApplyChanges en second, donc ce n'est pas réel. Je dois actualiser pour voir les changements que j'ai faits dans la partie éditeur.

Si je commente en ajoutant l'arbre à la collection de contrôles, ApplyChanges est appelé en premier et tout est ok (sauf que je dois cet arbre :)) ...

Est-ce que quelqu'un sait ce qui peut causer ce comportement bizarre?

+0

Pas de réponse, juste une reconnaissance du fait que vous n'êtes pas le seul que la douleur va bien. Après des heures d'efforts pour lutter contre ce problème spécifique, j'ai abandonné et rendu les contrôles à l'intérieur de la partie web elle-même en mode édition. – Tom

+0

Ran dans ce aussi bien. A dû déplacer le code à OnPreRender. –

Répondre

2

Je ne suis pas sûr si c'est ce que vous rencontrez, mais un problème que j'ai eu semble quelque peu similaire, donc je vais le décrire ici avec ma solution.

J'ai des problèmes de synchronisation dans mes parties de l'éditeur avec certains types de contrôles de l'interface utilisateur (à savoir des listes déroulantes). Mon problème est que ma propriété de partie Web a la valeur/clé déroulante, mais quand je construis ma partie d'éditeur elle n'a pas encore les éléments de liste déroulante quand SynchChanges() est appelée, ainsi je ne peux pas placer mon menu déroulant valeur à ce moment-là. Je gère cela en utilisant une variable de membre de synchronisation comme suit.

private DropDownList _dropDownList; 
private string _syncDropDownId; 

public override SyncChanges() 
{ 
    // This will make sure CreateChildControls() is called 
    // but that doesn't help me with my drop down list data 
    // which is loaded in OnPreRender() 
    this.EnsureChildControls(); 

    MyWebPart webPart = this.WebPartToEdit as MyWebPart; 

    // Temporarily store the drop down value for now 
    // since our drop down is not fully built yet 
    _syncDropDownId = myWebPart.SomeId; 
} 

protected override void CreateChildControls() 
{ 
    base.CreateChildControls(); 

    // Create our drop down list, but don't populate it yet 
    _dropDownList = new DropDownList(); 
    this.Controls.Add(_dropDownList); 
} 

protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 

    // Load drop down list items 
    _dropDownList.Items.AddRange(GetListItems()); 

    // Select item in drop down list based on web part property 
    if (_syncDropDownId != null) 
    { 
     if (_dropDownList.Items.FindByValue(_syncDropDownId) != null) 
     { 
      _dropDownList.SelectedValue = _syncDropDownId; 
     } 
     _syncDropDownId = null; 
    } 
} 
0

Vous pouvez forcer un rafraîchissement de la page en utilisant:

Page.Response.Redirect (Page.Request.Url.ToString());

4

L'ordre d'appel des méthodes et evetns est ceci: CreateChildControls applyChanges OnPreRender

Donc, si vous accédez aux propriétés en CreateChildControls ils ne sont pas en cours. J'ai donc déplacé le code qui accède aux propriétés webpart de CreateChildControls à OnPreRender et tout fonctionne correctement.

0

L'ordre d'utiliser les méthodes serait

protected override void CreateChildControls() 
{ 

} 

public override void SyncChanges() 
{ 

} 

public override bool ApplyChanges() 
{ 

} 
Questions connexes