2009-12-10 30 views
5

có cách nào để tôi có thể tải sự kiện cho System.Windows.Forms.Control giống như System.Windows.Forms.Form.Load không?Thêm sự kiện Tải cho Winforms Kiểm soát giống như lớp Biểu mẫu

Tôi muốn chạy một số mã khởi tạo trước khi điều khiển được hiển thị lần đầu tiên.

Ngoài ra, sẽ tốt hơn nếu có thể thực hiện tương tự cho System.Windows.Forms.ToolStripStatusLabel vốn không thực sự là Điều khiển, nhưng hoạt động giống như Điều khiển.

Lý tưởng nhất, tôi có thể làm điều này: control.OnLoad (() => {dosomething here;});

trong đó OnLoad là một phương pháp tiện ích mở rộng sẽ chạy đối số Hành động khi "điều khiển" "Tải".

Cảm ơn!

Trả lời

4

Form.Load sự kiện được gọi bởi OnLoad phương pháp được gọi là từ OnCreateControl phương pháp đó thuộc về lớp Control. Vì vậy, đối với hình thức trình tự gọi điện thoại sẽ là như sau:

OnCreateControl start 
    OnLoad start 
     Form Load event call 
    OnLoad finish 
OnCreateControl finish 

Tôi đoán bạn có thể ghi đè OnCreateControl cho thành phần của bạn và thêm mã tối ưu hóa của bạn ở đó.

Hy vọng điều này sẽ giúp, Trân trọng.

+0

Cảm ơn lời khuyên của bạn. Theo lời khuyên của bạn, tôi đã tìm thấy sự kiện CreateControl của lớp Control. Có một cái gì đó như thế này trong lớp ToolStripItem? – deerchao

+0

Bạn đang cố gắng tạo ra con cháu ToolStripItem mới? Tôi đoán bạn có thể đặt mã khởi tạo vào contructor của nó –

+0

Không, tôi không thể vì mã có một cái gì đó để làm với cha mẹ của nó: kiểm soát ToolStrip. trong hàm tạo, chúng sẽ rỗng. – deerchao

4

Để kiểm soát, bạn có thể ghi đè lên OnControlCreated hoặc OnHandleCreated. Người thứ hai có thể bắn nhiều lần nếu cần tái tạo cửa sổ điều khiển. Hãy chắc chắn sử dụng nó nếu mã của bạn ảnh hưởng đến chính cửa sổ. Nói cách khác, nếu bạn làm bất cứ điều gì đòi hỏi thuộc tính Xử lý.

Rất ít lựa chọn phù hợp cho điều khiển xuất phát ToolStripItem. Tôi khuyên bạn nên ghi đè SetVisibleCore() hoặc OnAvailableChanged() hoặc sự kiện AvailableChanged. Chúng chạy khi thuộc tính Visible của ToolStripItem thay đổi. Cẩn thận rằng nó có thể cháy nhiều lần, giữ một trường bool theo dõi mã khởi tạo của bạn đã chạy.

Cuối cùng nhưng không kém phần quan trọng, hãy đảm bảo chỉ thực hiện bất kỳ điều này nếu mã của bạn thực sự yêu cầu kiểm soát được tạo. Phần lớn mã init có thể đi vào hàm tạo. Bạn chỉ cần một sự kiện tải nếu mã của bạn phụ thuộc vào vị trí và kích thước thực tế của điều khiển. Mà có thể khác với giá trị thiết kế nếu biểu mẫu tự rescales do một phông chữ hệ thống hoặc thiết lập DPI video khác trên máy đích.

+0

Cảm ơn. Tôi đã thử nghiệm nó, nhưng không hoạt động như tôi mong đợi. Sự kiện VisibleChanged/AvailableChanged kích hoạt khi GetCurrentParent() của chúng là null. – deerchao

0

Tôi cần một giải pháp như thế này cho một TabPage trong một TabControl. Điều duy nhất tôi đưa ra là sử dụng trình xử lý sự kiện sơn. Tôi đã thêm trình xử lý sự kiện cho Paint và trong dòng đầu tiên tôi loại bỏ trình xử lý sự kiện và sau đó thực hiện thêm mã khởi tạo. Điều này chỉ hoạt động nếu bạn không có bất kỳ bức tranh tùy chỉnh nào. Ngoài ra, nếu bạn cần phải làm bức tranh tùy chỉnh, bạn có thể thêm một lá cờ để kiểm tra mỗi lần thực hiện sơn.

//Paint only runs once  
private void tabPage1_Paint(object sender, PaintEventArgs e) 
{ 
    tabPage1.Paint -= tabPage1_Paint;  
    //Do initialization here  
} 

///////////////////////////////////////////////////////////////////////////////// 

//Paint always runs 

private bool IsFirstPaint = true; 

private void tabPage1_Paint(object sender, PaintEventArgs e)  
{  
    if(IsFirstPaint) 
    { 
     IsFirstPaint = false;  
     //Do initialization here 
    }  
    //Do custom painting here 
} 
Các vấn đề liên quan