2012-05-03 18 views
3

私は.NETの初心者で、昨日の朝から検索して解決策を見つけることなく問題を解決します。ここでASPXとASCXの間のイベント

は私の問題です:

私はいくつかのユーザーコントロールは、私がパラメータ与える必要があるため、この方法によって動的に作成します。このASCXで

List<ANNOUNCEMENT> listAnnouncement = getAnnoucements(); 
foreach(ANNOUNCEMENT ann in listAnnouncement) 
{ 
    if(ann.IS_CURRENT_ANNOUNCEMENT && currentAnnouncement == null) 
    { 
     currentAnnouncement = ann; 
    } 
    List<Object> listParams = new List<Object>(); 
    listParams.Add(ann); 
    AnnouncementPresentation ap = (AnnouncementPresentation)(Controller.LoadControl(Page, "~/UserControls/AnnouncementPresentation.ascx", listParams.ToArray())); 
    /* important for the end of the method */ 
    ap.modifyAnnouncementButtonClick += new EventHandler(modifyAnnouncementButtonClick); 
    pnl_announcements.Controls.Add(ap); 
} 

を、私はボタンがあり、ときに、ユーザーがしますそれをクリックし、私は私のASPXに含まれるメソッドを呼び出すようにしたいので、私はASCXでこれを行う:ASPXで

public event EventHandler modifyAnnouncementButtonClick; 
protected void btn_modify_announcement_Click(object sender, EventArgs e) 
{ 
    PageAdminAnnonces.currentAnnouncement = annonce; 
    modifyAnnouncementButtonClick(sender, e); 
} 

そして、この:

protected void modifyAnnouncementButtonClick(object sender, EventArgs e) 
{ 
    initListOfAnnouncement(); 
    lbl_errors.Text = currentAnnouncement.TITLE; 
} 

私はすべてがうまくいっていると思っていますが、問題があります。一度は動作し、メソッドの最後に、ASCXを削除して新しいASCXを作成します。しかし、彼らはメソッドを持っていないし、もう一度クリックすると何も動作しないので、ASPXがリロードされます。再読み込み後、再び動作します。

私は何か問題がありますか?

+0

あなたが少し遅れページのライフサイクルである 'initListOfAnnouncement'方法、で動的に作成されたコントロールを追加しているようです。 'Page_Init'または' Page_Load'メソッドの中に必要なコントロールをすべて追加することをお勧めします。 –

+0

Page_Loadにこれらのコントロールを追加しています。私のメソッドinitListOfAnnouncement()はPage_Loadで呼び出されます。問題は、クリックしたときにユーザーコントロールを変更する必要があります(たとえば、太字のテキストを貼り付けるなど)。すべてのページを読み込まないでください。これを行うと、すべてのパラメータが失われるためですUserControlを太字で表示する必要があります。私の説明が十分明確であるかどうかはわかりません。 – algelos

+1

私はまだ 'Page_Load'でコントロールを作成し、クリック処理イベントでそれらを削除/再作成するのではなく、そこにある既存のコントロールのプロパティを設定することをお勧めします**。 'Page_Load'にいくつかの追加パラメータが必要な場合は、' Button.PostBackUrl'プロパティを使ってクエリ文字列に渡すことで、ページにいくつかの追加パラメータを渡すことができると思います。 –

答えて

1

コメントの情報によると、私はあなたの解決策が動作しないと考えています.のイベント処理メソッドでコントロールを再作成しています。これはページライフサイクルの非常に遅いため、コントロールの追加には使用しないでください。

コメントで述べたように、私はボタンのClick処理方法でそれらを再作成Page_InitPage_Loadでコントロールを作成することを提案し、ない。また、それぞれに固有のIDを割り当てる必要があります。次に、Clickハンドラでは、FindControlメソッドを使用して、作成されたコントロールにアクセスできます。また、作成時にコントロールへの参照を保存するだけで、後から簡単にアクセスすることができます。

便利なリンク:

+1

私はすべてのUserControlsでアクションを作成する必要があるので、私は 'FindControl()'テクニックを使用せず、私の問題を解決するために 'UserControls 'コンテナに' foreach() 'を使用しました。しかし、助けてくれてありがとう、今私はそれがうまくいかなかった理由を理解する:)。 – algelos

関連する問題