Trong System.ComponentModel, có một lớp được gọi là CancelEventArgs chứa một thành viên Hủy có thể được đặt trong trình lắng nghe sự kiện. Tài liệu trên MSDN giải thích cách sử dụng điều đó để hủy sự kiện từ bên trong một người nghe, nhưng làm cách nào để sử dụng nó để thực hiện các sự kiện có thể hủy của riêng tôi? Có cách nào để kiểm tra thành viên Hủy sau mỗi vụ cháy người nghe hay tôi phải đợi cho đến sau khi sự kiện đã kích hoạt tất cả người nghe của mình?Làm cách nào để triển khai sự kiện có thể hủy?
9
A
Trả lời
16
Để kiểm tra từng nghe đến lượt nó, bạn cần phải tự có được xử lý qua GetInvocationList:
class Foo
{
public event CancelEventHandler Bar;
protected void OnBar()
{
bool cancel = false;
CancelEventHandler handler = Bar;
if (handler != null)
{
CancelEventArgs args = new CancelEventArgs(cancel);
foreach (CancelEventHandler tmp in handler.GetInvocationList())
{
tmp(this, args);
if (args.Cancel)
{
cancel = true;
break;
}
}
}
if(!cancel) { /* ... */ }
}
}
Các vấn đề liên quan
- 1. Có cách nào tiêu chuẩn để triển khai các sự kiện "Có thể phủ nhận" không?
- 2. Làm cách nào để hủy sự kiện bubbling trong ASP.net?
- 3. Làm cách nào để bạn tạo sự kiện có thể hủy trong vb.net
- 4. Làm cách nào để triển khai các sự kiện thông qua giao diện trong C#?
- 5. Cách triển khai sự kiện 'có thể thực hiện' trong Javascript?
- 6. Làm cách nào để triển khai bộ?
- 7. Làm cách nào để triển khai jScroll?
- 8. Làm cách nào để hủy sự kiện lịch bằng tệp ics?
- 9. Làm cách nào để triển khai FileTimeToSystemTime?
- 10. Làm cách nào để triển khai IEnumerable?
- 11. Làm thế nào để thực hiện một sự kiện hủy bỏ trong C#
- 12. Làm cách nào để tự động triển khai Node.js?
- 13. Tôi có thể sử dụng thư viện nào để triển khai lập trình hướng sự kiện bằng Python?
- 14. Windows Sự kiện triển khai trong Linux bằng các biến có điều kiện?
- 15. Làm cách nào để hủy đăng ký sự kiện .NET này?
- 16. Làm cách nào để hủy sự kiện CellEnter/CellLeave trong C#?
- 17. Làm cách nào để triển khai tab có thể kéo bằng cách sử dụng Java Swing?
- 18. Tôi làm cách nào để hủy gửi biểu mẫu trong nút gửi khi sự kiện nhấp?
- 19. Làm cách nào để hủy đăng ký khỏi sự kiện sử dụng biểu thức lambda?
- 20. Có cách nào để hủy TabControl.Items.CurrentChanging không?
- 21. Bạn có thể buộc một sự kiện chạm để hủy sau khi chạm vàoBan không?
- 22. Làm cách nào để hủy liên kết sự kiện bên ngoài khi bộ điều khiển/phạm vi $ bị hủy?
- 23. Hủy sự kiện báo chí chính
- 24. Làm cách nào để tôi có thể triển khai kiểu ngoại lệ của riêng mình?
- 25. Làm cách nào để triển khai gọi lại trong C++?
- 26. Làm cách nào để tôi có thể triển khai Modularization trong ứng dụng Rails?
- 27. Hủy bỏ ListBox SelectedIndexThay đổi sự kiện
- 28. Làm thế nào để hủy một Menu ngữ cảnh Đã mở sự kiện?
- 29. Khi nào cần hủy các sự kiện trong Silverlight
- 30. Triển khai mẫu Sự kiện miền trong Java?
Trong khi mã này sẽ làm việc, đó là hoạt động bình thường của một CancelEventHandler? Không phải chúng thường được sử dụng trong một mẫu BeforeX, AfterX, nếu bất cứ điều gì trong Before đặt Canel, thì X không xảy ra nên AfterX không được gọi. Tại sao việc dừng các thính giả khác lại nhận được sự kiện Trước là điều quan trọng? –
Tôi cũng muốn biết câu trả lời cho nhận xét ở trên về việc tại sao điều quan trọng là phải dừng những người nghe khác nhận được sự kiện Trước đó. – MPavlak
Hãy tưởng tượng hai người đăng ký vào cùng một sự kiện (trong cùng một đối tượng). Một bộ 'cancel = true' và cái thứ hai là" cancel = false ". Bạn nghĩ điều gì sẽ xảy ra? Câu trả lời cho thấy cách tránh tình huống như vậy. Nếu ít nhất một người đăng ký hủy sự kiện thì sự kiện đó sẽ bị hủy. Giai đoạn. – Joel