2010-03-26 30 views
6

Trong khi phát triển một ứng dụng WinForms, tôi bắt gặp những gì tôi tin là một lỗi trong các điều khiển OpenFileDialog và SaveFileDialog. Tìm kiếm của Google đã bật lên một người khác nhận thấy cùng một vấn đề, nhưng cả giải pháp lẫn cách giải quyết đều không được cung cấp. Bạn có thể xem chủ đề này tại: http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event.FileDialog Hành vi DoubleClick

Tôi có một điều khiển tùy chỉnh trên biểu mẫu xử lý sự kiện MouseDown. Nếu tôi doubleclick một tập tin trong một điều khiển FileDialog trong khi con chuột trên kiểm soát này (với hộp thoại giữa chúng, rõ ràng), sự kiện MouseDown được kích hoạt. Tôi không nghĩ rằng đây là một vấn đề với sự kiểm soát của tôi, bởi vì người tôi đã đề cập trước đó nhận thấy điều này xảy ra với một điều khiển PictureBox. Có vẻ như rằng mặc dù nút chuột đã được nhấn xuống (cho nhấp chuột thứ hai để mở tệp) trong khi trên hộp thoại, sự kiện được chuyển đến biểu mẫu và điều khiển của tôi khi hộp thoại đóng.

Tôi đã thử vô hiệu hóa điều khiển của mình trong khi hộp thoại đang hoạt động, nhưng điều đó đã không ngăn điều khiển chụp sự kiện. Tôi cho rằng điều này là do sự kiện được chuyển xuống sau khi hộp thoại đóng, do đó điều khiển của tôi sẽ được kích hoạt lại. Có ai biết cách nào để ngăn chặn nhấp chuột đó đến được biểu mẫu và, lần lượt, điều khiển của tôi không? Ngoài ra, bất cứ ai có thể xác nhận nếu điều này thực sự là một lỗi trong các điều khiển FileDialog, hoặc nếu tôi chỉ có một số thiết lập cấu hình không chính xác?

Trả lời

1

Tôi đã thử nghiệm các sự kiện MouseDown và MouseMove khi tôi nhận ra tại sao sự cố của tôi đã xảy ra. Khi hộp FileDialog biến mất, sự kiện MouseMove đã được kích hoạt. Trong một (thừa nhận ngớ ngẩn) cố gắng tránh viết cùng một khối mã hai lần, tôi đã gọi trình xử lý MouseDown của mình từ bên trong trình xử lý MouseMove, nghĩ rằng một số điều kiện nhất định (chẳng hạn nút chuột bị giữ) sẽ khiến trình xử lý MouseDown thực hiện hiệu quả không có gì. Vấn đề là nút chuột đã được giữ lại, bởi vì hộp FileDialog biến mất trên MouseDown (không phải MouseClick). Điều này làm cho trình xử lý MouseDown thực thi mã có điều kiện của nó khi tôi không mong đợi nó.

Bài học để học hỏi từ điều này: cẩn thận khi xử lý sự kiện chuỗi. Hoặc tốt hơn, kéo chức năng chung vào một phương thức và xử lý sự kiện chuỗi KHÔNG BAO GIỜ. :-)

Nhờ Jelly Amma đã cho tôi ý tưởng xem xét các sự kiện thực tế chặt chẽ hơn.

3

Tôi đã nghe về vấn đề này trước và theo tôi biết đó là vấn đề đảm bảo rằng bạn xử lý hàng đợi Sự kiện một cách chính xác. Nếu không nhìn thấy mã của bạn, rất khó để kiểm tra rằng việc thực hiện kiểm soát người dùng của bạn là chính xác nhưng khá thường xuyên, ghi đè các sự kiện chuột mà không cho phép các sự kiện cơ sở cũng xảy ra có thể dẫn đến loại hành vi này.

+0

Tôi đang gọi base.OnMouseDown (e) từ bên trong trình xử lý OnMouseDown (MouseEventArgs e) đã ghi đè của tôi. Tôi đã thử gọi nó cả trước đây (ở trên cùng) và sau (ở dưới cùng) của người xử lý của tôi, nhưng không vị trí nào dường như có bất kỳ ảnh hưởng nào đến vấn đề này. Tôi sẽ phải xem xét hàng đợi Sự kiện chặt chẽ hơn và xem liệu tôi có thể tìm thấy thứ gì đó ở đó không. –