2

ここと Web でいくつかの記事を読みましたが、新しいコントロールをページに動的に追加し、それをハンドラーに接続し、それが機能することを期待することはできないと教えてくれました。

毎回与えられる解決策は、毎回 Init で動的コントロールをページに追加する必要があるということです。

私の問題は、コントロールが初期化時にページに追加されず、別のポストバック後に追加されることです。

ワークフローは次のとおりです。

  1. ページ読み込み
  2. ユーザーがテキストボックスに入力し、ボタンをクリックします
  3. 入力に基づいてbutton_clickイベントで動的リンクコントロールを作成し、ページポストバック
  4. ユーザーは、これらのリンク コントロールのいずれかをクリックして、次の手順に進みます。

これが私がサポートする必要がある動作である場合、これを行う方法はありますか? 動的コントロールはステップ 2 でユーザーが入力した入力に基づいているため、ステップ 2 の button_click で発生する必要があります。

私はここで隅に自分自身を描きましたか? このようなワークフローを他にどのように処理できますか?

4

1 に答える 1

2

リンク ボタンを動的に作成したら、ページのビュー ステートにフラグを設定します。フラグがビュー ステートに設定されている場合は、ポストバック時にリンク ボタンを再作成します。ここにデモがあります:

マークアップ:

<asp:Button runat="server" ID="button1" OnClick="button_Click" Text="Create button A" CommandArgument="A" />
<asp:Button runat="server" ID="button2" OnClick="button_Click" Text="Create button B" CommandArgument="B" />
<asp:PlaceHolder runat="server" ID="placeHolder"></asp:PlaceHolder>

分離コード:

public partial class Default : System.Web.UI.Page
{
    private bool LinkButtonCreated
    {
        get { return ((bool?)this.ViewState["LinkButtonCreated"]).GetValueOrDefault(); }
        set { this.ViewState["LinkButtonCreated"] = value; }
    }

    private string LinkButtonCommandArgument
    {
        get { return (string)this.ViewState["LinkButtonCommandArgument"]; }
        set { this.ViewState["LinkButtonCommandArgument"] = value; }
    }

    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        if (this.LinkButtonCreated)
            this.CreateLinkButton(this.LinkButtonCommandArgument);
    }

    protected void button_Click(object sender, EventArgs e)
    {
        if (!this.LinkButtonCreated)
        {
            string commandArgument = ((Button)sender).CommandArgument;
            this.LinkButtonCreated = true;
            this.LinkButtonCommandArgument = commandArgument;
            this.CreateLinkButton(commandArgument);
        }
    }

    private void CreateLinkButton(string commandArgument)
    {
        LinkButton linkButton =
            new LinkButton
            {
                ID = "linkButton",
                Text = "Click me",
                CommandArgument = commandArgument,
            };
        linkButton.Click += this.linkButton_Click;
        this.placeHolder.Controls.Add(linkButton);
    }

    private void linkButton_Click(object sender, EventArgs e)
    {
        LinkButton linkButton = (LinkButton)sender;
        linkButton.Text = "I was clicked! Argument: " + linkButton.CommandArgument;
    }
}
于 2012-05-04T02:10:17.803 に答える