ページの最初の読み込み時とその後のポストバック時に動的コントロールを作成して永続化することには慣れていますが、ユーザーが開始した次のシナリオで問題が発生しています...
私のデモでは、プレースホルダー、2 つのボタン、およびリテラルがあります。
<div>
<asp:PlaceHolder ID="phResponses" runat="server" />
</div>
<div>
<asp:Button ID="btnAdd" Text="Add" runat="server" OnClick="Add"/>
<asp:Button ID="btnInspect" Text="Inspect" runat="server" OnClick="Inspect"/>
</div>
<div>
<asp:Literal ID="litResult" runat="server"/>
</div>
ユーザーが追加ボタンをクリックして応答できるようにしたいので...
protected void Page_Init(object sender, EventArgs e)
{
BuildControls();
}
protected void Add(object sender, EventArgs e)
{
BuildControls();
}
protected void BuildControls()
{
phResponses.Controls.Add(new LiteralControl { ID = "response_" + _Count.ToString() });
_Count++;
}
_Count は、新しいコントロールに一意の ID を持たせるための静的メンバー変数です。Page_Init で動的コントロールを再構築する必要があることはわかっていますが、問題は、すべてのポストバックで 2 つの新しいリテラル コントロールになってしまうことです。また、Text プロパティが新しいコントロールに配置された場合、コントロールが再構築されると失われます。
では、複数のコントロールを追加しないようにするにはどうすればよいでしょうか。また、これらのコントロールを再構築するときに、新しく追加されたプロパティを保持するにはどうすればよいでしょうか?
以下を使用して応答を検査します
protected void Inspect(object sender, EventArgs e)
{
foreach (var control in phResponses.Controls)
{
if (control is LiteralControl)
{
litResults.Text += "<p>" + control.Text + " : " + control.ID + "</p>";
}
}
}
Page_Init での再構築のために、それ自体が別の不要なコントロールを追加します