2009-08-24 38 views
8

Tôi có một câu hỏi tại sao chúng ta chỉ có thể thêm điều khiển động bằng LoadControl. Ví dụ:LoadControl vs Construct Kiểm soát ASP.Net

public partial class wucReportParam : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
      wucDate() ctrl = new wucDate(); 
      pnl.Controls.Add(ctrl); 
    } 
} 

Khi trong phương thức Page_Load của wucDate, kiểm soát con của wucDate là null nhưng khi tôi sử dụng các phương pháp sau đây:

public partial class wucReportParam : System.Web.UI.UserControl 
    { 
     public Report Report; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
       ctrl = (wucDate)LoadControl(@"Reports\wucDate.ascx"); 
       pnl.Controls.Add(ctrl); 
     } 
    } 

Trong phương thức Page_Load của wucDate, đứa trẻ kiểm soát của wucDate không phải là null. Có ai có thể giải thích cho tôi tại sao asp .net không tạo ra bất kỳ điều khiển con nào của wucDate khi tôi sử dụng contructor ??? Cảm ơn bạn

Trả lời

8

Khi tải động điều khiển người dùng, điều quan trọng là phải đảm bảo rằng đường dẫn sự kiện trang ASP.NET chuẩn được bắt đầu và tiến triển bình thường. Khi bạn sử dụng toán tử mới để tạo một thể hiện của điều khiển người dùng, điều khiển người dùng đó không được thêm vào hệ thống sự kiện của ASP.NET một cách chính xác. Nếu các sự kiện (Init, Load, PreRender, vv) không kích hoạt, thì điều khiển của bạn sẽ không bao giờ hoạt động đúng. Đó là lý do tại sao nó là cần thiết để sử dụng LoadControl, vì điều đó sẽ đảm bảo rằng thể hiện của điều khiển người dùng của bạn được tạo ra đúng và gắn liền với ASP.NET.

0

Khi tôi nhớ lại, nó liên quan đến cách ASP.NET xây dựng các thành phần trang tại thời gian chạy. Trong ASP.NET mặc dù các trang của bạn có một lớp được định nghĩa trong tệp mã-đằng sau của bạn, các kiểu của chúng không thực sự tồn tại cho đến khi thời gian chạy. Giống như một trang, mặc dù bạn có một điều khiển được xác định loại wucDate không được tạo cho đến khi nó được bao gồm trong thời gian chạy. Vì lý do này, điều khiển phải được nạp với LoadControl để khởi tạo cả kiểu và chạy đúng trong vòng đời của trang.

Đây là bộ nhớ tốt nhất của tôi, vì vậy nếu tôi không chính xác ở đây, vui lòng cho tôi biết.

4

Rõ ràng, việc sử dụng LoadControl với typeof (hoặc GetType) có cùng vấn đề với việc sử dụng 'mới' nơi các điều khiển con không được khởi tạo. Sử dụng LoadControl với một chuỗi vào tệp ASCX hoạt động.

Không khởi tạo điều khiển con.

LoadControl(typeof(MyReport), null); 

Hoạt động!

LoadControl("Report.ascx"); 
+0

Có giải thích tại sao bạn nhìn thấy điều này trên trang web tài liệu/kết nối: http://msdn.microsoft.com/en-us/library/ewtd66a0.aspx (cuộn đến nội dung Cộng đồng) hoặc https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=103456 –

2

Việc khởi tạo các điều khiển bên trong điều khiển người dùng được điều khiển bởi tệp ASCX. Chỉ sử dụng "SomeControl mới" sẽ không làm khởi chạy này, và ngay cả khi nó đã làm, tất cả các thiết kế (đánh dấu) trong tập tin ascx sẽ bị mất.

Hãy nhớ rằng lớp "wucDate" chỉ là lớp cơ sở mà toàn quyền kiểm soát người dùng được kế thừa từ đó. Nó không phải là cùng một lớp như bạn sẽ nhận được khi sử dụng LoadControl ("wucDate.ascx").

Và thành thật mà nói, LoadControl không có nhiều, nếu có, liên quan đến vòng đời của trang. Phần đó được xử lý khi bạn thêm điều khiển vào bộ sưu tập Điều khiển của vùng chứa.

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