私のSharepoint 2010 WebPartには、次のコードがあります:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (this.dpsvisWebPart != null && this.dpsvisWebPart.CustomTitleProp != null)
{
lbl_Title.Text = String.Format("<h1>{0}</h1>", this.dpsvisWebPart.CustomTitleProp.ToString());
if (this.dpsvisWebPart.CheckboxGenSection1)
{
GenerateSection1();
}
if (this.dpsvisWebPart.CheckboxGenSection2)
{
GenerateSection2();
}
if (this.dpsvisWebPart.CheckboxGenSection3)
{
GenerateSection3();
}
if (this.dpsvisWebPart.CheckboxGenSection4)
{
GenerateSection4();
}
if (this.dpsvisWebPart.CheckboxGenSection5)
{
GenerateSection5();
}
if (this.dpsvisWebPart.CheckboxGenSection6)
{
GenerateSection6();
}
if (this.dpsvisWebPart.CheckboxGenSection7)
{
GenerateSection7();
}
if (AnyCheckboxSelected())
{
// Create Save button
this.Controls.Add(new LiteralControl("<br />"));
Button btnSave = new Button();
btnSave.Text = "Save";
btnSave.Click += new EventHandler(btnSave_Click);
this.Controls.Add(btnSave);
AddVerticalSpace();
}
}
}
WebPart をテストすると (ボタンをクリックして、おそらく btnSave_Click ハンドラーを実行すると、何も保存されていないことがわかりました。
コードをステップ実行すると、OnPreRender に到達していることがわかります - 実際、何度も何度も。
そこで、これを WebPart クラスに追加しました。
private bool PreRenderAlreadyRun = false;
...そして、OnPreRender() の先頭を次のように変更しました。
protected override void OnPreRender(EventArgs e)
{
if (PreRenderAlreadyRun) return;
PreRenderAlreadyRun = true;
base.OnPreRender(e);
. . .
...しかし、OnPreRender が入力されると、PreRenderAlreadyRun は常に false になり、これが何度も発生します。おそらくページが無限ループにあるため、他のブレークポイント (ボタンのクリックなど) に到達していません。
OnPreRender() を 1 回だけ実行するにはどうすればよいですか? または、このコードを OnPreRender() ではなく Page_Load() に入れる必要がありますか、それとも...???