0

私はASP.Netプログラミングの初心者です。
私は小さなトレーニングWebアプリケーションを開発しています。
ユーザーがカートにアイテムを追加できるWebフォームを開発しました。
ユーザーのカートはセッション変数と一致します。

Page_PreRenderイベントハンドラーでユーザーのカートが空かどうかを確認します。
カートが空でない場合は、テーブルがフォームに挿入されます。
カート内の各アイテムは、テーブル内の行と一致します。
アイテム行には、カートからアイテムを削除するためのHtmlInputSubmitが含まれています。

これが、「アイテムの削除」HtmlInputSubmitを動的に作成するために作成したコードです。

submitSupprimerArt = new HtmlInputSubmit();
cellTblCaddie.Controls.Add(submitSupprimerArt);

submitSupprimerArt.Value = "Supprimer " + article.Id;
submitSupprimerArt.Attributes.Add("articleId", article.Id);
submitSupprimerArt.ServerClick += new EventHandler(submitSupprimerArt_Click);

ユーザーがHtmlInputSubmitをクリックすると、ポストバックが作成されますが、submitSupprimerArt_Clickイベントハンドラーは呼び出されません。
誰かが私に理由を教えてもらえますか?

4

1 に答える 1

0

やりたくありませんでしたが、ついにトレーニングアプリケーションのソリューションを検討しました。
問題を解決するために必要な操作を説明することはできますが、操作を実行する必要がある理由を正確に説明することはできません。

秘訣は、ASPXページでPlaceHolderコントロールを宣言することです。
PlaceHolderには、次のようにPage_Loadイベントハンドラーから[アイテムの削除]ボタンを入力する必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    // ...

    caddie = (ListeArticles)this.Session["caddie"];
    if (caddie != null)
    {
        foreach (Article article in caddie)
        {
            btnSupprimerArt = new Button();
            this.phBoutonsSupprArt.Controls.Add(btnSupprimerArt);

            btnSupprimerArt.ID = "btnSupprimerArt" + article.Id;
            btnSupprimerArt.Command += new CommandEventHandler(btnSupprimerArt_Command);
            btnSupprimerArt.CommandName = article.Id;
            btnSupprimerArt.Text = "Supprimer " + article.Id;
        }
    }
}

PlaceHolderのControlsプロパティは、Page_PreRenderイベントハンドラーからクリアされます。
次に、Page_PreRenderイベントハンドラーから[アイテムの削除]ボタンが作成されます。
今回は「アイテムの削除」ボタンがテーブルセルに挿入されます。

結論(おそらく改訂が必要です):
動的制御イベントへのハンドラーの登録は少し注意が必要です。
どうやら、すべてのイベントハンドラーはPage_Loadイベントの後に登録する必要があります。

于 2012-11-12T17:20:36.390 に答える