2011-07-07 6 views
0

これは面白い小さな問題です。私はその理由がページオブジェクト/イベント生成のライフサイクルの背後にあると考えていますが、問題はどうやって解決するのでしょうか? Default.aspxのでLoadControl(ctr)を使用してUserControl.ascxをロードした場合、イベントは機能しません

は、いくつかの面白いのコントロールが存在するだけでなく、
<asp:PlaceHolder runat="server" id="phUserContent"></asp:PlaceHolder>

このプレースホルダは実行時まで空です。コードの背後には、場合によっては、UserControlをその中にロードしています。この
Control ctr = LoadControl("~/UserControl/Note.ascx"); phUserContent.Controls.Add(ctr);

枚このNote.ascxは、いくつかの興味深いコントロールとイベントを発生させ、最終的LinkBut​​tonコントロールが含まれています。 LinkBut​​tonコントロール・コードは、私がイベントのコードを持ってASCXための背後にあるコードで
<asp:LinkButton runat="server" ID="lbUpdate" OnClick="lbUpdate_Click" Text="Update"></asp:LinkButton>

protected void lbUpdate_Click(object sender, EventArgs e)
{ ... }

私はwrotedとして、非常に簡単かつ正確であるgramaticallyポストバックが発生すると、疑わしいページが再生成されますが、lbUpdate_Clickイベントは実行されません。もちろん、ブレークポイントが試されます。

私は2つの可能性のあるシナリオを探しています。 1つは、私が本当に簡単なことを忘れていたことです(間違ったコードのファイルに書き込まれたようなものです)。また、ページ生成サイクルの重要な部分を見逃していました。私は(私はちょうどここだと思う。)このように、主に第二によ
1ページ(ASCX)が、それはのGot

は 2. Submitを変更 3. ASCXが 4再生成されたクリックされました。イベントはクリアされましたが、存在していてエラーをキャストしませんでした。 5.リロード後、最初のコンテンツが再ロードされました

コンパイラがブレークポイントを認識できず、値が "空のイベントの実行"によって保存されなかったことが原因です。しかし、これはまさにアマチュアの推測です。アドバイスをお願いします。

[回答数ごとに更新] これは、私がそれを解決した方法です。これは以下の回答に基づいています。

List<Control> ctr; 
public User() 
{ 
    ctr = new List<Control>(); 
} 
protected void Page_PreInit(object sender, EventArgs e) 
{ 
    ctr.Add(LoadControl("~/UserControl/Note.ascx")); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    ctr.ForEach(d => phUserContent.Controls.Add(d)); 
} 

はまもなく..
1.クラスは、Page_LoadのでUC(uはここではそれらのXを持つことができます)
3.(場所を追加(作成前)Page_PreInitのコントロール
2のリストを得ましたすべてのctrが作成されます)、各UCをPHに追加します。また

答えて

2

:-)また、作業していない魔法のUCでのイベントや無ダム合併症を作る

それは、ライフサイクルの問題です。

は覚えておいて、すべてのページリクエストが新しい Pageオブジェクトを作成し、その上のすべてのコントロールの新しいインスタンス。動的にコントロールを作成する場合は、すべてのポストバックに対してまったく同じ方法で行う必要があります。新しいコントロールでイベントを発生させたい場合は、古いイベントと同じIDを持っていなければならず、コントロールイベントがライフサイクルで処理される前にイベントがフックされている必要があります。

ViewStateを処理した後に発生するページライフサイクルのポイントでコントロールを動的に作成する場合は、独自の状態も管理する必要があります。つまり、PreInitフェーズでコントロールを動的に作成していない場合は、リストア状態を手動で処理する必要があります。

+0

ご意見ありがとうございます。私はあなたのテキストに自分の問題を見つけるために少し考えなければなりませんでした。あなたの説明にソリューションを接続するのがより簡単になりました。そしてそれを見つけた。私はQで答えを更新します。 – Independent

関連する問題