2012-01-16 3 views
1

私はSharePoint 2010をだまされてしまいました。正に、私はイベントフローの処理方法を除いて何の問題もありません。私は何かが足りないかもしれない。Sharepointのイベントフローが私に問題をもたらした

今の私は視覚的なウェブパーツを持っています。視覚的なウェブパーツにはコントロールのボタンとシンプルなテキスト出力用のラベルがあります。そこで私は自分自身をテストモデルオブジェクト(CounterModelという名前の単純オブジェクトクラス、intという名前)にしました。そのため、ビューステートで簡単に追跡できるようになりました。

私のWebパーツのinit関数では、ViewState[ID_COUNTER_MODEL]がnullに等しいかどうかチェックします。それは私が新しいCounterModelandを作成してviewstateに追加し、nullでない場合はViewState[ID_COUNTER_MODEL]を自分のプライベートプロパティのCounterModelに追加するだけです。

initの後に、マウスのタイプのイベントリスナーをボタンに追加します。私が直面している問題は、ボタンを押すとフォームが破棄され、再作成され、イベントリスナーがCounterModelオブジェクトをViewState[ID_COUNTER_MODEL]から再割り当てすることになります。したがって、イベントリスナーの変更は実際には決して登録されません。私は間違って何をしているのですか、私はどのようにこれらの状況を処理する必要があります。ここで

は、いくつかのコードの例です:

TestCounterオブジェクト

class CounterModel 
{ 
    public int number; 

    public CounterModel() { 
     number = 0; 
    } 
} 

のVisual Webパーツ

private CounterModel counterModel; 

public CounterWebPart() { 
    if (ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] != null){ 
     counterModel = (CounterModel)ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL]; 
    } else { 
     counterModel = new CounterModel(); 
     ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] = counterModel; 
    } 
} 

    protected override void CreateChildControls(){ 
     CounterWebPartUserControl control = (CounterWebPartUserControl)Page.LoadControl(_ascxPath); 
     Controls.Add(control); 

     control.GetBtnChangeLabel().Click += OnBtnChangeLabelClicked; 
     control.GetLabel().Text = counterModel.number.ToString(); 
    } 



    public void OnBtnChangeLabelClicked(object sender, EventArgs e) { 
     counterModel.number++; 
     (CounterModel)ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] = counterModel; 
    } 

答えて

1

はこれだ、SharePointのイベントモデルとの問題ではありませんASP.Net WebFormsのイベントモデルに問題があります。詳細については、http://msdn.microsoft.com/en-us/library/ms178472.aspxをご覧ください。しかし、ViewStateはコントロールのコンストラクタに決して配置されないため、常に新しい番号counterModelを構築しています。そのため、番号の増分が表示されません。そのコードをOnLoadで実行してみてください。

また、CreateChildControlsがイベントハンドラに対して相対的に呼び出されるときには依存しないでください(特定の条件の下では、プロセスの別の場所で呼び出されます)。これを使用して、コントロールを作成してツリーに追加し、イベントを配線する必要があります。つまりcontrol.GetLabel().Text = counterModel.number.ToString();に電話しないでください。OnPreRenderで行ってください。

+0

ありがとうございました。 –

関連する問題