2009-02-17 16 views
11

Ten jest bardzo dziwne:ListView za DragEnter, DragOver, DragDrop nie podniósł (AllowDrop = True)

Moja aplikacja działa dobrze, ale nagle wydarzenia psiakrew formantu ListView nie są podniesione więcej. Po prostu przychodzi i odchodzi bez wyraźnego powodu. (Oczywiście) Mam ustawić właściwość AllowDrop True i obsługiwane DragEnter, DragOver i dragdrop wydarzenia następująco:

Private Sub lstApplications_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstApplications.DragDrop, Me.DragDrop 
    m_fileNames = CType(e.Data.GetData(DataFormats.FileDrop), String()) 
    mnuType.Show(Cursor.Position, ToolStripDropDownDirection.BelowLeft) 
End Sub 

Private Sub lstApplications_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstApplications.DragEnter, Me.DragEnter, lstApplications.DragOver, Me.DragOver 
    If chkMode.Checked OrElse Not e.Data.GetDataPresent(DataFormats.FileDrop, True) Then 
     e.Effect = DragDropEffects.None 
    Else 
     e.Effect = DragDropEffects.Copy 
    End If 
End Sub 

Nie ma znaczenia, jaki kod pisałem w tych dwóch metod, ponieważ żaden z wydarzeń są podniesiony. Czy czegoś tu brakuje?


Uruchomiłem tę samą aplikację na innej maszynie i działało dobrze. Następnie uruchomiłem ponownie własną maszynę i wszystko zaczęło działać. Nie jestem pewien, ale wydaje się, że coś jest nie tak z Windows.

Odpowiedz

1

Czy w formularzu ustawiono właściwość AllowDrop na wartość true?

+0

Tak. To dziwne, że działa przez jakiś czas, ale nagle się łamie. – TheAgent

+0

Czy coś może zmienić wartość AllowDrop gdzieś w kodzie? –

+0

Sprawdziłem. Właściwość ma wartość True i jest nienaruszona. – TheAgent

0

Czy próbowałeś usunąć kody pośredniczące metod, rekompilując je, a następnie odkładając je i kompilując ponownie? Wiem, że to brzmi dziwacznie, ale zdarzały się czasy, kiedy potrzebowałem tylko zresetować swoje kopie robocze.

1

Jeśli występuje przerywane działanie, może być możliwe, że wyjątek zostanie usunięty z obsługi i nieumyślnie zostanie usunięty spadek oporu. Spróbuj dodać koc Korek/Catch wokół kodu i wykonaj plik Debug.Fail w bloku Catch. To przynajmniej wykluczy możliwość wystąpienia nieobsługiwanego wyjątku jako problemu.

3

Przypomniałem sobie, że rzeczywiście widzieliśmy to już dawno temu.

wierzę, że dzieje się tak:

przeciągnij i upuść działa dobrze, dopóki jakiś kod użytkownik zgłasza wyjątek podczas operacji przeciągania i upuszczania.

Wyjątek zostanie zjedzony; nie dostaniesz żadnego okna dialogowego błędu (spróbuj sam i zobacz). Po tym momencie przeciąganie i upuszczanie przestanie działać.

+0

Nie zaczął działać nawet po zamknięciu aplikacji i uruchomieniu jej ponownie. Nie sądzę, że chodzi o wyjątek, który został rzucony. Ale nie jestem pewien. – TheAgent

1

Możliwe, że twoje sterowanie zostało w jakiś sposób zmącone. Czy jesteś pewien, że uchwyt istnieje i że uruchomiono pełny zestaw kodu inicjującego?

Niedawno napotkałem podobny problem, gdy Control.OnHandleCreated nie był uruchamiany z powodu błędu, który popełniłem, a to spowodowało wszelkiego rodzaju zło, w tym dokładnie to, co opisujesz tutaj.

+1

+1 Właśnie poprawiłem błąd z tymi samymi objawami, tj. Przeciąganie i upuszczanie przestało działać. Okazało się, że nadpisałem OnHandleCreated, ale nie zadzwoniłem do podstawowej wersji. Miało to również dziwny wpływ, że zdarzenie DragEnter przechodziło do kontroli nadrzędnej. –

4

Miałem ten problem podczas uruchamiania Visual Studio 2008 w systemie Windows 7. VS2008 musi działać z uprawnieniami administratora w systemie Windows 7, więc uruchamiam go jako inny użytkownik. Jestem prawie pewien, że to zapobiega działaniu 'przeciągnij i upuść', ponieważ aplikacja działa poprawnie po uruchomieniu jako aplikacja, ale funkcja przeciągnij i upuść nie będzie działała podczas uruchamiania z programu Visual Studio.

+0

Dziwne, to właśnie spowodowało moje problemy. Nie mogłem znaleźć żadnych szczegółów, dlaczego tak się dzieje. Dzięki i tak! – Spyros

8

miałem tylko godziny nędzy z podobnym problemem. trzy obowiązkowe wymagania dla przeciągnij i upuść do pracy:

  1. upewnić się, że docelowy element UI ma AllowDrop="True", nie musisz tego dla całej aplikacji, tylko element, który chcesz chcesz włączyć.
  2. Niektóre elementy nie otrzymują pewnych zdarzeń myszy (w tym d & d), jeśli ich tło nie jest ustawione. Background="Transparent" zrobi.
  3. Uruchamianie dowolnego programu z uprawnieniami administratora będzie powodowało bałagan z przeciąganiem i upuszczaniem. upewnij się, że uruchamiasz studio graficzne bez uprawnień administratora.
+0

Głupi mnie! Zapomniałem o właściwościach AllowDrop. Dziękuję Ci bardzo. –

+0

Ta część administracyjna jest kluczem. Szaleje, próbując ustalić, w jaki sposób ja i mój kolega używamy tego samego kodu, ale wydarzenia nie były dla mnie wyzwaniem (ponieważ działałem jako administrator), ale były dla niego. –