2009-07-23 21 views
4

SharePointのWebパーツを作成しています。 SyncChanges()メソッドとApplyChanges()メソッドをオーバーライドしているカスタムエディタパーツがあります。SharePoint WebパーツのCreateChildControls()およびApplyChanges()メソッドの呼び出しの順序

編集モードで[OK]をクリックするとページがブラウズモードに切り替わりますが、EditorPartで変更され、ApplyChanges()メソッドで保存されたデータ(propeties)は更新されません。変更を確認するには、もう一度[ページを入力]する必要があります(データをもう一度ポストしないでリロード)。

編集モードで[OK]をクリックした後、WebPart.CreateChildControls()が最初に呼び出され、EditorPart.ApplyChanges()が最初に呼び出された後、デバッグして何をしているのかがわかりました。したがって、データは更新されましたが、表示されるのは更新されていないデータでした。

この動作で何か他のものが見つかりました:WebPart.CreateChildControls()とEditorPart.ApplyChanges()を呼び出す間違った順序で、CreateChildControls()のWebPartに特定のコントロールを追加すると、エラーが発生します。私の場合は、WebDataTreeまたはUltraWebTreeコントロール(Infragistics)の追加が行われますが、一般的なASP.NET TextBoxでも同じ問題が発生します(ASP.net forum thread)。

したがって、ツリーを追加するとCreateChildControls()が最初に呼び出され、次にApplyChangesが呼び出されるため、実際ではありません。私はエディタの部分で行った変更を見るために更新する必要があります。

...私はControlsコレクションにツリーを追加するコメント場合は、ApplyChangesは、最初に呼び出され、(私は:)その木が必要除く)すべてがOKです

誰でもこの奇妙な動作を引き起こすことができるか知っていますか?

+0

ないだろう。その特定の問題に取り組もうと数時間を経た後、私は編集モードのときにウェブ部分自体の中のコントロールをあきらめてレンダリングしました。 – Tom

+0

これにもRanを付けます。 OnPreRenderにコードを移動する必要がありました。 –

答えて

2

これはあなたが何をしているのかわかりませんが、私が持っていた問題はやや似ているようですので、ここで私の解決方法とともに説明します。

特定のタイプのUIコントロール(ドロップダウン)で、エディタの部品に同期の問題があります。私の問題は、私のWebパーツのプロパティがドロップダウンの値/キーを持っていることですが、SynchChanges()が呼び出されたときにエディタパーツをビルドしてもまだドロップダウンリスト項目がないので、ドロップダウンを設定できませんその時の価値。私はこれを次のように同期メンバ変数を使用して処理します。

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

あなたは使用して、ページの更新を強制することができます。

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

4

呼び出す方法とevetnsの順序はこれです:あなたはCreateChildControlsの中のプロパティにアクセスする場合

OnPreRender CreateChildControlsの ApplyChanges そこで彼らは、現在ではありません。 そこで、WebpartプロパティにアクセスするコードをCreateChildControlsからOnPreRender に移動し、すべて正常に動作します。

0

メソッドを使用しての順序は無回答、あなたはその痛みかかわら行くだけではありませんだけで確認

protected override void CreateChildControls() 
{ 

} 

public override void SyncChanges() 
{ 

} 

public override bool ApplyChanges() 
{ 

} 
関連する問題