2009-06-09 13 views
6

Mam aplikacji WinForms, gdzie robię przeciągnij i upuść między 2 TreeViews.Wyjątek połknięcia podczas przeciągania i upuszczania

W pewnym momencie chcę odrzucić działanie w podstawowej implementacji biznesowej, więc zgłaszam wyjątek. Widzę wyjątek w oknie Output, ale problem polega na tym, że nie widzę go w interfejsie i nie ulega awarii.

Gdzie nastąpił wyjątek?

Oto kod, który opisuje problem:

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

Prawdopodobnie będziesz chciał udostępnić kod dla tego kodu. – AlexCuse

Odpowiedz

10

znalazłem to wyjaśnienie w internecie:

Nawet z drag-and-drop w tej samej aplikacji, przeciągnij i upuść jest obsługiwane za pośrednictwem standardowego mechanizmu OLE drag-drop. Z punktu widzenia OLE ma on do czynienia z dwiema aplikacjami: źródłową i docelową i odpowiednio je rozdziela. Ponieważ OLE jest znacznie dłuższa niż .NET, OLE nie ma pojęcia wyjątku .NET i dlatego nie może przekazać wyjątku od celu z powrotem do źródła. Nawet jeśli tak, to dlaczego źródło powinno uważać, że cel nie może wykonać spadku? Jeśli chcesz obsłużyć wyjątek podczas zdarzenia DragDrop, musisz obsłużyć go w ramach procedury obsługi zdarzeń DragDrop, nie będzie on rozprzestrzeniał się poza ten program obsługi zdarzenia, ponieważ istnieje zarządzane niezarządzane przejście kodu zarządzanego między źródłem a celem.

Wyświetl pierwszą odpowiedź po pytaniu za here.

+0

Dzięki, bardzo interesujący post –

0

Wyjątkiem jest prawdopodobnie występuje na wątek w tle gdzieś. należy utworzyć moduł obsługi dla zdarzenia AppDomain.CurrentDomain.UnhandledException lub Application.ThreadException.

Aby uzyskać więcej informacji, zobacz artykuł here.

+0

Utworzono oba programy obsługi, ale wyjątek nie jest wyświetlany w żadnym z nich. Czy jest jakaś inna? –

+0

W studio graficznym naciśnij przycisk Debuguj-> Wyjątki i zaznacz pole "wyrzucony" obok "Wyjątek środowiska wykonawczego języka wspólnego". To powinno spowodować, że debugger włamie się do twojego kodu, gdy tylko zostanie zgłoszony wyjątek i możesz użyć F10/F11, aby przejść wzdłuż ścieżki, którą podąża. –

Powiązane problemy