ユーザーがタグを作成および削除できる再利用可能なユーザー コントロールを作成したいと考えています。
ユーザーがタグ名を入力できるテキストボックスと、タグを送信するためのボタンが必要です。
タグを送信した後、入力されたタグごとにタグを削除するための「X」ボタンが付いたタグ名のラベルを動的に作成する必要があります。
このようなもの:
[ Textbox ] [Submit]
[X] Tag 1
[X] Tag 2
[X] Tag 3
問題は、すべてを適切に機能させる方法がわからないことです。
Selector.ascx
< markup for the textbox >
< markup for the sumbit button >
<asp:Placeholder runat="server" ID="PHList" />
動的コントロールを生成するために asp:Placeholder を使用しています。
Selector.ascx.cs
生成されたコントロールをポストバック間で追跡する必要があります。
List<string>
ビューステートに保存されたものを使用しています:
private List<string> SelectedTags
{
get
{
return (List<string>) ViewState["SelectedTags"];
}
set { ViewState["SelectedTags"] = value; }
}
送信ボタンをクリックすると、新しいタグが SelectedTags リストに追加され、RefreshPlaceholder 関数が呼び出されます。
void RefreshPlaceholder()
{
PHList.Controls.Clear();
foreach(var x in SelectedTags)
{
// generate a label and the "X" button, wiring it with a lambda
}
}
送信ボタンをクリックすると、新しい (ボタン、ラベル) ペアが正しく生成され、ポストバック後に表示されます。
ただし、生成された「X」ボタンのいずれかをクリックすると、エラーが発生します。これは、動的に生成されたボタンによって発生したクリック イベントがまだ生成されていないため、送信者ボタンを見つけることができないためです。
OnLoad でボタンを生成しようとすると、Page.Load の前にポストバック イベントが発生するため、同じ問題が発生します。
OnInit でボタンを生成しようとすると、ViewState がまだ更新されていないため、SelectedTags ビューステート リストがまだ更新されていないため、生成されたリストは古くなっています。
すべてを意図したとおりに機能させるための解決策が見つからないようです。私は何を間違っていますか?