2009-04-27 41 views
6

Tôi tự động tải UserControl vào Chế độ xem trong điều khiển MultiView. Mặc dù UserControl thêm một trình xử lý sự kiện, sự kiện này không bao giờ cháy.Trình xử lý sự kiện của UserControl không kích hoạt

Tôi thiếu gì ở đây? Cảm ơn!

Chứa trang ASPX:

protected override void OnPreRender(EventArgs e) 
{ 
    if (MultiView1.ActiveViewIndex == 2) //If the tab is selected, load control 
    { 
     Control Presenter = LoadControl("Presenter.ascx"); 
     (MultiView1.ActiveViewIndex.Views[2].Controls.Add(Presenter); 
    } 
    base.OnPreRender(e); 
} 

Presenter.ascx.cs

override protected void OnInit(EventArgs e) 
{ 
    Retry.Click += this.Retry_Click; //This is a .Net 2.0 project 
    base.OnInit(e); 
} 


protected void Retry_Click(object sender, EventArgs e) 
{ 
    //This never fires 
} 

Trả lời

8

Tôi nghĩ rằng nó không kích hoạt vì bạn đang tải điều khiển trong sự kiện trước trên trang của bạn. Khi đăng lại, điều khiển bị mất vì không có trạng thái xem cho nó. Do đó không có quyền kiểm soát để kích hoạt sự kiện của nó. Thử tải điều khiển trong sự kiện init của trang. Cho chúng tôi biết chuyện gì đã xảy ra!

+0

Đó là nó. Cám ơn! Tôi cũng phải loại bỏ câu lệnh If vì tại OnPreInit, MultiView1.ActiveViewIndex không được thiết lập. –

+0

bạn được chào đón. –

+0

Cảm ơn bạn rất nhiều! –

1

Có vẻ như sự kiểm soát không được thêm vào sau mỗi lần gửi trở lại, tôi sẽ đưa ra các nếu tuyên bố trong trang aspx có chứa để xem nếu đó sửa chữa vấn đề ... im giả sử Retry là một nút?

+0

Tôi đã thử xóa câu lệnh If - không có sự khác biệt. Có, Thử lại là một nút. –

6

Xử lý sự kiện đăng lại được thực hiện trước khi hiển thị để kiểm soát không có trong trang trong trường hợp của bạn.

Các sự kiện vòng đời được bắn theo thứ tự này (bỏ qua một vài):

  1. Init
  2. tải
  3. PreRender
  4. Unload

Và sự kiện xử lý được thực hiện giữa Tải và PreRender (trong trường hợp một số sự kiện thay đổi cách trang được hiển thị, nó có ý nghĩa).

Vì vậy, chỉ cần di chuyển mã của bạn sẽ tải kiểm soát Thử lại để Tải hoặc Tắt.

tham khảo: Asp.Net Page Life Cycle Overview

2

Việc kiểm soát phải được hiển thị ban đầu để có thể nhập vào sự kiện OnPreRender. nhưng có thể bạn muốn nó không hiển thị. đảm bảo có EnableViewState = false;

Các vấn đề liên quan