0

パラメータを使用して、動的に作成されるいくつかの UserControls があります。

foreach (DataRow dr in drc)
{
    question = (from ques in bdd.QUESTION where ques.ID_QUESTION == idQuestion select ques).FirstOrDefault();
    List<Object> listParams = new List<Object>();
    listParams.Add(question);
    AdminQuestion qa = (AdminQuestion)(Controller.LoadControl(Page, "~/UserControls/AdminQuestion.ascx", listParams.ToArray()));
    pnl_question_list.Controls.Add(qa);
}

これは私が SoF で見つけた方法で、うまく機能します。ボタンをクリックするとこのメソッドが呼び出され、すべてのユーザーコントロールが正しく作成されます。このユーザーコントロールには、ボタンがあります:

<asp:Button ID="btn_validation_modify_question" runat="server" Text="Modifier" 
            CssClass="clear_left_float_left myBouton myBoutonEnvoyer" 
            OnClick="btn_validation_modify_question_Click"/>

そして私の方法:

protected void btn_validation_modify_question_Click(object sender, EventArgs e)
{
    QUESTION q = (from m in bdd.QUESTION where m.ID_QUESTION == question.ID_QUESTION select m).FirstOrDefault();
    q.MESSAGE = txt_modify_question_message.InnerText;
    q.ID_THEME = new Guid(ddl_modify_question_theme.SelectedValue);
    bdd.ApplyCurrentValues<QUESTION>("QUESTION", q);
    bdd.SaveChanges();
}

しかし、ボタンをクリックすると、メソッドが適用されず、宣言されたメソッドがないかのようにページがリロードされます。

私が知らない何かがありますか?私はすでにこの手法を使用しており、すべてがうまくいきました...

4

2 に答える 2

3

コントロールを動的に追加する場合は、通常、イベントInitまたはPreInitページ イベントで行う必要があります。そうしないと、イベント ハンドラーが機能しません。

そのため、動的に追加されたコントロールは、ページにアクセスするたびにプログラムで Web ページに追加する必要があります。これらのコントロールを追加する最適なタイミングは、ページ ライフ サイクルの初期化段階であり、ビュー ステートの読み込み段階の前に発生します。つまり、ビュー ステートのロード ステージに到達する前に、コントロール階層を完成させたいと考えています。このため、コード ビハインド クラスで Page クラスの Init イベントのイベント ハンドラーを作成し、そこに動的コントロールを追加することをお勧めします。

Page_Load イベント ハンドラーでコントロールをロードし、ビュー ステートを適切に維持することで回避できる場合があります。それはすべて、動的に読み込まれたコントロールのプロパティをプログラムで設定しているかどうかに依存します。設定している場合は、Controls.Add(dynamicControl) 行に対して相対的に設定している場合です。これについての詳細な説明は、この記事の範囲を少し超えていますが、それが機能する理由は、Controls プロパティの Add() メソッドが、ビュー ステートの読み込み段階を過ぎても、親のビュー ステートをその子に再帰的に読み込むためです。

ここに詳しい情報があります。

編集

同じことを話していることを確認するために、ここにコードがどのように見えるかを示します

protected void Page_Init(object sender, EventArgs e)
{
    ...
    foreach (DataRow dr in drc)
    {
        question = (from ques in bdd.QUESTION where ques.ID_QUESTION == idQuestion select ques).FirstOrDefault();
        List<Object> listParams = new List<Object>();
        listParams.Add(question);
        AdminQuestion qa = (AdminQuestion)(Controller.LoadControl(Page, "~/UserControls/AdminQuestion.ascx", listParams.ToArray()));
        pnl_question_list.Controls.Add(qa);

    }
    ...
}
于 2012-05-21T14:07:47.257 に答える
0
  PageLoad(){
 If(!Page.IsPostBack())    
    foreach (DataRow dr in drc)
        {
            question = (from ques in bdd.QUESTION where ques.ID_QUESTION == idQuestion select ques).FirstOrDefault();
            List<Object> listParams = new List<Object>();
            listParams.Add(question);
            AdminQuestion qa = (AdminQuestion)(Controller.LoadControl(Page, "~/UserControls/AdminQuestion.ascx", listParams.ToArray()));
            pnl_question_list.Controls.Add(qa);
        }
}

このソリューションを試しましたか?Page_Init() を使用しませんか?

于 2013-01-26T03:32:53.243 に答える