4 votes

Ordre d'appel des méthodes CreateChildControls() et ApplyChanges() dans une webpart SharePoint

Je suis en train de créer une partie web pour SharePoint. J'ai une partie éditeur personnalisée qui surcharge 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 (propeties) qui ont été modifiées dans la partie éditeur et enregistrées dans la méthode ApplyChanges() ne sont pas mises à jour. Je dois à nouveau "entrer dans la page" (recharger sans poster à nouveau les données) pour voir les modifications apportées.

Je l'ai débogué et j'ai compris ce qu'il faisait - après avoir cliqué sur OK en mode é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 ont été affichées.

Je me suis dit qu'il y avait autre chose dans ce comportement : L'ajout d'un contrôle spécifique à mon WebPart dans CreateChildControls() entraîne un mauvais ordre d'appel de WebPart.CreateChildControls() et EditorPart.ApplyChanges(). Dans mon cas, il s'agit de l'ajout des contrôles WebDataTree ou UltraWebTree (d'Infragistics), mais cela peut également se produire avec la simple TextBox ASP.NET (comme décrit en détail ici) : Fil de discussion ASP.net ).

Ainsi, si j'ajoute l'arbre, CreateChildControls() est appelé en premier et ApplyChanges en second, ce n'est donc pas réel. Je dois actualiser pour voir les modifications que j'ai apportées dans la partie éditeur.

Si je commente l'ajout de l'arbre à la collection de contrôles, ApplyChanges est appelé en premier et tout va bien (sauf que j'ai besoin de cet arbre :) )...

Quelqu'un sait-il ce qui peut provoquer ce comportement étrange ?

4voto

Shaun Ghulam Points 21

L'ordre d'appel des méthodes et des événements est le suivant : CreateChildControls (Créer des contrôles enfants) Appliquer les changements OnPreRender

Par conséquent, si vous accédez aux propriétés dans CreateChildControls, elles ne sont pas actuelles. J'ai donc déplacé le code qui accède aux propriétés du webpart de CreateChildControls à OnPreRender et tout fonctionne correctement.

2voto

Kirk Liemohn Points 3489

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

J'ai des problèmes de synchronisation dans les parties de mon éditeur avec certains types de contrôles d'interface utilisateur (notamment les menus déroulants). Mon problème est que la propriété de ma partie web contient la valeur/clé de la liste déroulante, mais lorsque je construis ma partie éditeur, elle n'a pas encore les éléments de la liste déroulante lorsque SynchChanges() est appelé, je ne peux donc pas définir la valeur de la liste déroulante à ce moment-là. Je gère cela en utilisant une variable 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;
    }
}

0voto

Ciprian Grosu Points 1181

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

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

0voto

user3386930 Points 1

L'ordre d'utilisation des méthodes est le suivant

protected override void CreateChildControls()
{

}

public override void SyncChanges()
{

}

public override bool ApplyChanges()
{

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X