私は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;
}
ありがとうございました。 –