Control.DragOver Zdarzenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Występuje, gdy obiekt jest przeciągany przez granice kontrolki.
public:
event System::Windows::Forms::DragEventHandler ^ DragOver;
public event System.Windows.Forms.DragEventHandler DragOver;
public event System.Windows.Forms.DragEventHandler? DragOver;
member this.DragOver : System.Windows.Forms.DragEventHandler
Public Custom Event DragOver As DragEventHandler
Typ zdarzenia
Przykłady
W poniższym przykładzie kodu pokazano operację przeciągania i upuszczania między dwoma kontrolkami ListBox. Przykład wywołuje metodę DoDragDrop po uruchomieniu akcji przeciągania. Akcja przeciągania rozpoczyna się, jeśli mysz przeniosła się więcej niż SystemInformation.DragSize z lokalizacji myszy podczas zdarzenia MouseDown. Metoda IndexFromPoint służy do określania indeksu elementu do przeciągania podczas zdarzenia MouseDown
.
W przykładzie pokazano również użycie niestandardowych kursorów dla operacji przeciągania i upuszczania. Przykład wymaga, aby dwa pliki kursorów, 3dwarro.cur
i 3dwno.cur
, istniały w katalogu aplikacji, odpowiednio dla niestandardowego przeciągania i bez upuszczania kursorów. Kursory niestandardowe będą używane, jeśli zaznaczono UseCustomCursorsCheck
CheckBox. Kursory niestandardowe są ustawiane w procedurze obsługi zdarzeń GiveFeedback.
Stan klawiatury jest obliczany w procedurze obsługi zdarzeń DragOver dla prawego ListBox
, aby określić, jaka operacja przeciągania będzie oparta na stanie SHIFT, CTRL, ALT lub CTRL+ALT. Lokalizacja w ListBox
, w której występuje spadek, jest również określana podczas zdarzenia DragOver
. Jeśli dane do porzucenia nie są String
, DragEventArgs.Effect jest ustawiona na None
w DragDropEffects. Na koniec stan upuszczania jest wyświetlany w DropLocationLabel
Label.
Dane do upuszczania odpowiedniego ListBox
są określane w procedurze obsługi zdarzeń DragDrop, a wartość String
jest dodawana w odpowiednim miejscu w ListBox
. Jeśli operacja przeciągania przesuwa się poza granice formularza, operacja przeciągania i upuszczania zostanie anulowana w programie obsługi zdarzeń QueryContinueDrag.
Ten fragment kodu przedstawia użycie zdarzenia DragOver. Zobacz metodę DoDragDrop, aby zapoznać się z kompletnym przykładem kodu.
void ListDragTarget_DragOver( Object^ /*sender*/, System::Windows::Forms::DragEventArgs^ e )
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if ( !e->Data->GetDataPresent( System::String::typeid ) )
{
e->Effect = DragDropEffects::None;
DropLocationLabel->Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ( (e->KeyState & (8 + 32)) == (8 + 32) && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 32) == 32 && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// ALT KeyState for link.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 4) == 4 && ((e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move) )
{
// SHIFT KeyState for move.
e->Effect = DragDropEffects::Move;
}
else
if ( (e->KeyState & 8) == 8 && ((e->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy) )
{
// CTRL KeyState for copy.
e->Effect = DragDropEffects::Copy;
}
else
if ( (e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move )
{
// By default, the drop action should be move, if allowed.
e->Effect = DragDropEffects::Move;
}
else
e->Effect = DragDropEffects::None;
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop = ListDragTarget->IndexFromPoint( ListDragTarget->PointToClient( Point(e->X,e->Y) ) );
// Updates the label text.
if ( indexOfItemUnderMouseToDrop != ListBox::NoMatches )
{
DropLocationLabel->Text = String::Concat( "Drops before item # ", (indexOfItemUnderMouseToDrop + 1) );
}
else
DropLocationLabel->Text = "Drops at the end.";
}
private void ListDragTarget_DragOver(object sender, DragEventArgs e)
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e.Data.GetDataPresent(typeof(System.String)))
{
e.Effect = DragDropEffects.None;
DropLocationLabel.Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ((e.KeyState & (8 + 32)) == (8 + 32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 32) == 32 &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// ALT KeyState for link.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 4) == 4 &&
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;
}
else if ((e.KeyState & 8) == 8 &&
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{
// CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy;
}
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new Point(e.X, e.Y)));
// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
{
DropLocationLabel.Text = "Drops before item #" + (indexOfItemUnderMouseToDrop + 1);
}
else
{
DropLocationLabel.Text = "Drops at the end.";
}
}
Private Sub ListDragTarget_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragOver
' Determine whether string data exists in the drop data. If not, then
' the drop effect reflects that the drop cannot occur.
If Not (e.Data.GetDataPresent(GetType(System.String))) Then
e.Effect = DragDropEffects.None
DropLocationLabel.Text = "None - no string data."
Return
End If
' Set the effect based upon the KeyState.
If ((e.KeyState And (8 + 32)) = (8 + 32) And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' KeyState 8 + 32 = CTRL + ALT
' Link drag-and-drop effect.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 32) = 32 And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' ALT KeyState for link.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 4) = 4 And
(e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' SHIFT KeyState for move.
e.Effect = DragDropEffects.Move
ElseIf ((e.KeyState And 8) = 8 And
(e.AllowedEffect And DragDropEffects.Copy) = DragDropEffects.Copy) Then
' CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy
ElseIf ((e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
' Gets the index of the item the mouse is below.
' The mouse locations are relative to the screen, so they must be
' converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(New Point(e.X, e.Y)))
' Updates the label text.
If (indexOfItemUnderMouseToDrop <> ListBox.NoMatches) Then
DropLocationLabel.Text = "Drops before item #" & (indexOfItemUnderMouseToDrop + 1)
Else
DropLocationLabel.Text = "Drops at the end."
End If
End Sub
Uwagi
Zdarzenie DragOver jest wywoływane, gdy kursor myszy porusza się w granicach kontrolki podczas operacji przeciągania i upuszczania.
Poniżej opisano, jak i kiedy są wywoływane zdarzenia związane z operacjami przeciągania i upuszczania.
Metoda DoDragDrop określa kontrolkę w bieżącej lokalizacji kursora. Następnie sprawdza, czy kontrolka jest prawidłowym elementem docelowym upuszczania.
Jeśli kontrolka jest prawidłowym elementem docelowym upuszczania, zdarzenie GiveFeedback jest wywoływane z określonym efektem przeciągania i upuszczania. Aby uzyskać listę efektów przeciągania i upuszczania, zobacz wyliczenie DragDropEffects.
Śledzone są zmiany położenia kursora myszy, stanu klawiatury i stanu przycisku myszy.
Jeśli użytkownik wyjecha z okna, zostanie zgłoszone zdarzenie DragLeave.
Jeśli mysz wejdzie w inną kontrolkę, zostanie podniesiona DragEnter dla tej kontrolki.
Jeśli mysz porusza się, ale pozostaje w tej samej kontrolce, zostanie podniesione zdarzenie DragOver.
W przypadku zmiany stanu klawiatury lub przycisku myszy zdarzenie QueryContinueDrag jest wywoływane i określa, czy kontynuować przeciąganie, upuszczać dane, czy anulować operację na podstawie wartości właściwości ActionQueryContinueDragEventArgszdarzenia .
Jeśli wartość wartości DragAction jest
Continue
, zdarzenie DragOver jest wywoływane w celu kontynuowania operacji, a zdarzenie GiveFeedback jest wywoływane z nowym efektem, dzięki czemu można ustawić odpowiednią opinię wizualną. Aby uzyskać listę prawidłowych efektów upuszczania, zobacz wyliczenie DragDropEffects.Nuta
Zdarzenia DragOver i GiveFeedback są sparowane tak, aby w miarę poruszania się myszą w miejscu docelowym upuszczania użytkownik otrzymał największą up-to- datę opinii na temat położenia myszy.
Jeśli wartość DragAction jest
Drop
, wartość efektu spadku jest zwracana do źródła, aby aplikacja źródłowa mogła wykonać odpowiednią operację na danych źródłowych; na przykład wyciąć dane, jeśli operacja została przeniesiona.Jeśli wartość DragAction jest
Cancel
, zostanie zgłoszone zdarzenie DragLeave.Nuta
Właściwości X i YDragEventArgs znajdują się we współrzędnych ekranu, a nie współrzędnych klienta. Poniższy wiersz kodu języka C# konwertuje właściwości na klienta Point:
Point clientPoint = targetControl.PointToClient(new Point(de. X, de. Y));
Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.