2011-09-14 41 views
5

Tôi gặp sự cố với việc đặt cùng một trình xử lý sự kiện cho tất cả các điều khiển trên biểu mẫu. Tôi muốn xử lý các nút nhấn f5-f7 đồng nhất trong ứng dụng của mình, vì vậy tôi cố gắng đăng ký cùng một trình xử lý sự kiện cho tất cả các điều khiển trên biểu mẫu. tôi chènMột trình xử lý sự kiện cho tất cả các điều khiển trên biểu mẫu

foreach (System.Windows.Forms.Control cont in this.Controls) 
       cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress); 

trong InitializeComponent() chức năng ngay trước khi tự động tạo ra ResumeLayout/PerformLayout gọi. Đừng bận tâm đến cái tên MainForm_KeyPress, nó thực sự là một trình xử lý sự kiện KeyDown ngay bây giờ.

Tôi cũng đã cố gắng chèn mã vào hàm init() của tôi được gọi từ hàm tạo. Nhưng kết quả là như nhau: sự kiện không xảy ra khi tôi bấm phím. Tập trung vào một trong các nút của biểu mẫu. Nhưng nếu tôi triển khai trình xử lý cho một trong các nút bằng cách sử dụng công cụ thiết kế (tên hàm sao chép vào trường sự kiện KeyPress), sự kiện sẽ tăng lên một cách chính xác nếu nút đó được lấy nét.

Mọi ý tưởng tại sao foreach không hoạt động?

+3

Một trình xử lý sự kiện để quy tắc tất cả? – jason

+0

Vui lòng không thêm tiền tố vào tiêu đề của bạn bằng "C#:". Đó là những gì các thẻ cho. –

+0

@ Jason - và trong dữ liệu bóng tối liên kết chúng. – TrueWill

Trả lời

6

MSDN cho biết bạn có thể thực hiện với cài đặt KeyPreview thành true.

+0

Điều này dường như là cách để đi, bạn sẽ chỉ có một đăng ký sự kiện, ở cấp biểu mẫu. Chỉ cần đảm bảo bạn đặt e.Handled thành true cho các sự kiện quan trọng bạn thực sự xử lý (để tránh tác vụ kép) và false cho tất cả những người khác (hoặc bạn sẽ tắt tất cả tương tác bàn phím khác mà tôi nghĩ).Mã ví dụ trong MSDN là một chút đơn giản trong cách nó đặt nó thành false trong mọi trường hợp. – rice

+0

@Ingenu cảm ơn bạn! Một câu trả lời dễ dàng như vậy! – HtonS

+0

@Ingenu cảm ơn rất nhiều –

1

Có thể bạn cần phải recurse và đăng ký nó cho các điều khiển con của mỗi kiểm soát bạn gặp phải, trên cây?

Điều đầu tiên tôi thực hiện khi gặp sự cố này được đặt vào khoảng {} quanh đăng ký và đầu ra "hiện đang đăng ký" + tên kiểm soát. Bằng cách đó bạn có thể xem và xem có bao nhiêu điều khiển đang được đăng ký và những gì họ đang có. Có lẽ nó chỉ là bảng điều khiển chính, và các subcontrols xử lý khóa xuống? Tôi đã gặp rắc rối với các trình xử lý sự kiện nhấn phím khi làm việc trong dockmanager, dockmanager đang xử lý bàn phím ở một cấp độ khác và định tuyến sự kiện cho điều khiển con cụ thể mà nó nghĩ sẽ nhận được nó.

Nếu bạn vẫn không hình dung ra, điều tiếp theo tôi muốn làm là kết nối các sự kiện của biểu mẫu hoặc thậm chí có thể giám sát các sự kiện thông báo của cửa sổ WM_. Tại một số điểm, WM_ được dịch sang một sự kiện .NET theo mã, và điều này có thể được thực hiện theo cách bạn không mong đợi và bị tấn công bởi các điều khiển của bên thứ ba, v.v. Hệ điều hành phải định tuyến các sự kiện WM_ cho quá trình của bạn , vì vậy hãy theo dõi chúng bằng trình xử lý sự kiện thông qua để ghi lại những gì diễn ra.

Tôi quên chính xác cách thức hoạt động nhưng khi xử lý sự kiện như nhấn phím, bạn có thể trả về một bool hoặc đặt cờ trên sự kiện cho biết bạn đã xử lý nó và trong triển khai dockmanager tôi thấy nếu bạn nói xử lý nó, vòng lặp đã chuyển sự kiện đến các điều khiển con sẽ dừng lại, thực thi ý tưởng rằng chỉ một hành động sẽ được kích hoạt bởi sự kiện bàn phím.

+0

Tôi đã xem câu trả lời của bạn trước tiên và làm theo lời khuyên của bạn để kiểm tra xem tất cả các điều khiển có được xử lý trong foreach hay không. Bạn đã đúng, điều khiển con không được đăng ký. Vì vậy, tôi đã thêm một đệ quy, và tất cả đều làm việc tốt. Nhưng câu trả lời của Ingenu đơn giản hơn vì vậy tôi sẽ sử dụng nó =) Cảm ơn bạn một lần nữa! Thật đáng tiếc là tôi không thể đánh dấu hai bài viết là một câu trả lời – HtonS

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