2009-06-09 31 views
6

Tôi có ứng dụng WinForms nơi tôi đang thực hiện kéo và thả giữa 2 TreeViews.Ngoại lệ bị nuốt khi kéo và thả

Tại một thời điểm nào đó, tôi muốn từ chối hành động trong triển khai kinh doanh cơ bản, vì vậy tôi ném Ngoại lệ. Tôi có thể thấy ngoại lệ trong cửa sổ Output nhưng vấn đề là tôi không thể nhìn thấy nó trong giao diện người dùng và nó không bị treo.

Trường hợp ngoại lệ xảy ra ở đâu?

Dưới đây là một số mã mô tả các vấn đề:

private TreeView tvLeft; 
private TreeView tvRight; 
private Dictionary<string, int> dico = new Dictionary<string, int>(); 

void tvLeft_DragDrop(object sender, DragEventArgs e) { 

    if (e.Data.GetDataPresent(typeof(TreeNode))) { 

    var tnSource = (TreeNode) e.Data.GetData(typeof(TreeNode)); 
    var tnDestination = tvLeft.GetNodeAt(tvLeft.PointToClient(new Point(e.X, e.Y))); 

    // if I drag-drop the same node twice, there sould be an Exception 
    // since the key is already in the dictionary... 
    // ...but I get no Exception in the UI, the Application.ThreadException 
    // or Appomain.CurrentDomain.UnhandledException handlers 
    dico.Add(tnSource.Name, (new Random()).Next()); 

    } 

} 
+2

Có thể bạn sẽ muốn chia sẻ một số mã cho số này – AlexCuse

Trả lời

10

tôi tìm thấy lời giải thích này trong Internet:

Thậm chí với chức năng kéo-và-thả trong cùng một ứng dụng, kéo-và-thả được xử lý thông qua cơ chế OLE kéo-thả chuẩn. Từ quan điểm của OLE, nó xử lý hai ứng dụng, nguồn và đích và tách chúng một cách thích hợp. Vì OLE đã tồn tại lâu hơn .NET, nên OLE không có khái niệm về ngoại lệ .NET và do đó không thể giao tiếp ngoại lệ từ đích tới nguồn. Ngay cả khi nó có thể, tại sao các nguồn chăm sóc mà mục tiêu không thể thực hiện thả? Nếu bạn muốn xử lý một ngoại lệ trong một sự kiện DragDrop, bạn phải xử lý nó trong trình xử lý sự kiện DragDrop của bạn, nó sẽ không lan truyền ngoài trình xử lý sự kiện đó vì có quản lý không được quản lý để chuyển mã được quản lý giữa nguồn và đích.

Xem here câu trả lời đầu tiên sau câu hỏi.

+0

Cảm ơn, bài đăng rất thú vị –

0

Trường hợp ngoại lệ có lẽ xảy ra trên một sợi nền ở đâu đó. bạn cần tạo một trình xử lý cho AppDomain.CurrentDomain.UnhandledException hoặc sự kiện Application.ThreadException.

Xem here để biết thêm chi tiết.

+0

Tôi đã tạo cả hai trình xử lý nhưng Ngoại lệ không hiển thị trong bất kỳ trình xử lý nào. Có cái nào khác không? –

+0

Trong phòng thu trực quan, nhấn Debug-> Ngoại lệ, và đánh dấu vào ô "ném" cùng bên "Ngoại ngữ thời gian chạy ngoại lệ". Điều này sẽ làm cho trình gỡ lỗi xâm nhập vào mã của bạn ngay sau khi ngoại lệ được ném và bạn có thể sử dụng F10/F11 để đi dọc theo đường dẫn sau. –