動的制御の問題
こんにちは皆さん、
いくつかの動的コントロールを作成し、ページの読み込み全体でビューステートを保持させたいと考えています。簡単ですよね?私がしなければならないのは、同じIDを使用して、ページの読み込みごとにコントロールを再作成することだけです。ただし、ここに問題があります。PreRenderイベントで、コントロールコレクションをクリアしてから、新しい値で動的コントロールを再作成したいと考えています。その理由は複雑で、なぜそれをやりたいのかを説明するのに1ページほどかかるでしょう。したがって、簡潔にするために、私が絶対にこれを行わなければならず、他の方法はないと仮定しましょう。
PreRenderイベントでコントロールを再作成した後、問題が発生します。再作成されたコントロールはビューステートにバインドされることはなく、それらの値はページの読み込みを超えて保持されません。なぜこれが起こるのかわかりません。OnLoadイベントですでにコントロールを再作成しています。これを行うと、毎回同じIDを使用する場合、新しく作成されたコントロールはViewStateに正常にバインドされます。ただし、PreRenderイベントで同じことを実行しようとすると、失敗します。
いずれにせよ、ここに私のサンプルコードがあります:
名前空間TestFramework.WebControls{
public class ValueLinkButton : LinkButton
{
public string Value
{
get
{
return (string)ViewState[ID + "vlbValue"];
}
set
{
ViewState[ID + "vlbValue"] = value;
}
}
}
public class TestControl : WebControl
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Controls.Clear();
ValueLinkButton tempLink = null;
tempLink = new ValueLinkButton();
tempLink.ID = "valueLinkButton";
tempLink.Click += new EventHandler(Value_Click);
if (!Page.IsPostBack)
{
tempLink.Value = "old value";
}
Controls.Add(tempLink);
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ValueLinkButton tempLink = ((ValueLinkButton)FindControl("valueLinkButton")); //[CASE 1]
//ValueLinkButton tempLink = new ValueLinkButton(); [CASE 2]
tempLink.ID = "valueLinkButton";
tempLink.Value = "new value";
tempLink.Text = "Click";
Controls.Clear();
Controls.Add(tempLink);
}
void Value_Click(object sender, EventArgs e)
{
Page.Response.Write("[" + ((ValueLinkButton)sender).Value + "]");
}
}
}
それでは、[CASE 1]の隣の行はコメントアウトされていないが、[CASE2]の隣の行はコメントアウトされているケース1を調べてみましょう。ここでは、すべてが正常に機能します。このコントロールをページに配置してページをロードすると、「クリック」というリンクが表示されます。リンクをクリックすると、ページに「[新しい値]」というテキストが出力され、次の行に、おなじみの「クリック」リンクが表示されます。その後、「クリック」リンクをクリックするたびに、同じことが表示されます。ここまでは順調ですね。
しかし、ここで、[CASE 1]の隣の行がコメント化されているが、[CASE2]の隣の行がコメント化されていないケース2を調べてみましょう。ここで問題が発生します。ページをロードすると、「クリック」リンクが表示されます。ただし、リンクをクリックすると、ページに「[newvalue]」ではなく「[]」というテキストが出力されます。クリックイベントは正常に発生しています。ただし、コントロールのValue属性に割り当てた「新しい値」のテキストは保持されません。繰り返しになりますが、これは私には少し謎です。OnLoadでコントロールを再作成すると、すべてが正常でダンディになりますが、PreRenderでコントロールを再作成すると、値が保持されないのはなぜですか?
これを行う方法がなければならないような気がします。PreRenderでコントロールを再作成するときに、新しく作成したコントロールをViewStateにバインドする方法はありますか?
私はこれに何日も苦労してきました。あなたが私に与えることができるどんな助けでもありがたいです。
ありがとう。