2011-11-08 41 views
6

Tôi mới dùng C# để xin lỗi nếu đây là câu hỏi noob. Tôi đang cố gắng để có được sự rõ ràng xung quanh cú pháp hoặc mẫu để xử lý các sự kiện trong C#.Trình xử lý sự kiện theo cú pháp/mẫu C# -

Vì vậy, tôi có một đối tượng FormForm1Button button1 trong biểu mẫu. Tôi xử lý sự kiện Nhấp chuột với một phương pháp như thế này trong Form1.cs:

hoạt động tốt. Bây giờ ở dạng khác Form2 Tôi có một số TreeView treeView1 và tôi muốn xử lý sự kiện BeforeExpand. Vì vậy, tôi cho rằng đó là:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    Debug.WriteLine("Hello!"); 
} 

thực tế không hoạt động: phương pháp này không bao giờ được gọi khi tôi mở rộng nút. Nhưng một số câu trả lời SO ngụ ý rằng này là cách thực hiện, ví dụ: one.

Dù sao tôi tìm thấy phương pháp thay thế phù hợp với tôi. Trong hàm tạo biểu mẫu, hãy liên kết trình xử lý sự kiện như sau:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike); 

Vậy sự khác biệt giữa hai cách tiếp cận này là gì? Tại sao cú pháp _event không hoạt động cho một lần xem trang? Có sự khác biệt nào giữa các loại sự kiện không?

Cảm ơn

+1

Vì vậy, hãy để tôi có được điều này thẳng: trong phiên bản đó không làm việc bạn chỉ định xử lý và sau đó? Bạn không ràng buộc nó trong phiên bản đó? – Tudor

Trả lời

5

Tôi giả sử bạn đã gắn nút kép trong trình thiết kế Visual Studio. Trình xử lý button1_Click được thêm tự động, giống như bạn đã tạo trình xử lý BeforeExpand bằng tay.

Kiểm tra tập tin Form1.designer.cs của bạn, bạn sẽ thấy một dòng như thế này:

this.button1.Click += new System.EventHandler(this.button1_Click); 
+0

Ok vâng, điều đó đúng. Tôi thực sự có dòng này trong Designer.cs. Làm cho cảm giác bây giờ :) –

4

Điều bạn có là chính xác. Bạn cần thêm trình xử lý vào sự kiện như bạn đã làm trong trường hợp thứ hai.

Phải có một dòng như thế này:

button1.Click += button1_Click; 

(có thể với một wrapper new EventHandler()) ở đâu đó trong mã Form1 của bạn, có lẽ hầu hết trong file designer.cs.

+0

Ah ha có. Cảm ơn vm –

1

Cú pháp đầu tiên, mà không phải là cú pháp ở tất cả, chỉ là một quy ước đặt tên cho xử lý sự kiện . Những gì bạn đang làm với cú pháp thứ hai là thiết lập một đại biểu cho một trình xử lý sự kiện và thêm nó vào sự kiện đó.

Nếu bạn chọn Biểu mẫu 1 và nhấp vào chọn nút và xem các thuộc tính sự kiện của sự kiện, sự kiện có nhiều khả năng được kết nối thông qua nhà thiết kế. Bạn có thể làm tương tự với TreeView trên biểu mẫu của nó, thông qua nhà thiết kế.

0

Đó là cách chính xác để đăng ký một sự kiện. Nhà thiết kế tự động thêm dòng đó vào tệp .designer.cs khi bạn đăng ký sự kiện qua nó.

Dù bằng cách nào, dòng mã này đang được viết ở đâu đó. Sự khác biệt là một sự kiện đang được đăng ký thông qua nhà thiết kế, trong khi sự kiện khác bạn đang đăng ký theo cách thủ công.

1

Hệ thống xử lý sự kiện C# không hoạt động trên bất kỳ loại quy ước đặt tên nào (tôi nghĩ bạn có thể tin rằng đây là trường hợp?).Phương thức được gọi là treeView1_BeforeExpand sẽ không được gọi trên sự kiện BeforeExpand của treeview1 trừ khi bạn yêu cầu nó gọi phương thức đó trên sự kiện cụ thể đó.

Đoạn code dưới đây nói "khi sự kiện BeforeExpand là bắn, gọi phương thức anyMethodNameYouLike.

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike); 

Bạn phải viết phương pháp anyMethodNameYouLike của bạn.

1

link này sẽ giúp bạn tìm ra cách để thiết lập Các trình xử lý sự kiện cụ thể cho các sự kiện cụ thể trong trình thiết kế biểu mẫu của bạn

+0

Cảm ơn tuyệt vời! –

1

Trong WinForms, bạn có thể ràng buộc trình xử lý sự kiện từ trình thiết kế bằng cách sử dụng hộp công cụ "thuộc tính" và bấm nút sét ở trên cùng. mở tab sự kiện. Chỉ cần nhấp đúp vào tên của một sự kiện để tạo trình xử lý trong mã của bạn hoặc chọn phương thức hiện có có chữ ký phù hợp từ menu thả xuống. Điều này sẽ thực sự tạo mã "+ =" cho bạn trong tệp .designer.

Tên Control_Event được tạo tự động. Tuy nhiên, bạn có thể sử dụng bất kỳ tên nào cho trình xử lý của mình và thậm chí đăng ký nhiều hơn một tên.

+0

Cảm ơn mẹo v hữu ích –

+0

Không sao cả. Mọi người dường như không nói về tab này ở bất cứ đâu. Khi tôi bắt đầu với WinForms, tôi đã dành gần 6 tháng để thêm tất cả các trình xử lý của mình vào hàm dựng trước khi tôi tìm ra điều này! –

5

Bạn cần cả hai thứ:
1) một phương pháp có thể xử lý loại sự kiện được đề cập. Đối với một (MSDN) đại biểu TreeViewCancelEventHandler phương pháp chữ ký đúng là:

public void MyMethodNameGoesHere(Object sender,TreeViewCancelEventArgs e) 
{ 
    // do some impressive stuff here 
} 

2) bạn phải đăng ký cho sự kiện:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(MyMethodNameGoesHere); 

Bạn cũng có thể sử dụng chỉ là tên phương pháp :

treeView1.BeforeExpand += MyMethodNameGoesHere; 

Và như một thay thế cuối cùng bạn có thể sử dụng cú pháp này 'inline' cho các chức năng nhỏ:

treeView1.BeforeExpand += (sender, e) => 
{ 
    // do a bit of magic here 
}; 

là gì có thể tốt để biết là đăng ký xử lý không 'chồng' (xin lỗi vì cách diễn đạt kém, đề xuất cải tiến rất được hoan nghênh!). Ý nghĩa khi bạn làm như sau bạn sẽ không nhận các sự kiện hơn nữa sau khi dòng cuối cùng đã thực hiện:

treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand -= MyMethodNameGoesHere; // note the MINUS sign 
+0

Cảm ơn bạn đã trả lời toàn diện –

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