Laden...

DragDrop Event vs. UserControl

Erstellt von c#nup vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.292 Views
C
c#nup Themenstarter:in
19 Beiträge seit 2017
vor 5 Jahren
DragDrop Event vs. UserControl

Hallo Community,

folgende Problemstellung:
Ich habe ein WinForm, darin ein TableLayoutPanel, 1 Zeile, 2 Spalten. In der linken Spalte sitzt eine Listbox mit string-items. In der rechten Spalte wird zur Laufzeit, aus einer dll, ein UserControl geladen. Das UserControl enthält Textboxen und andere Controls. Ziel ist die Strings aus der Listbox zu draggen und in die Textboxen ( die auf dem UserControl sitzen) zu droppen - wie ihr euch denken könnt scheitere ich genau daran, das DragDrop Event der Textboxen und des UserControls löst nicht aus.

Versucht habe ich unter anderem:

  1. ein neues WinForm Projekt angelegt, wo das UserControl sich im selben Projekt wie das Form befindet - das UserControl wird also wird nicht zur Laufzeit aus einer dll geladen. Ergebnis: D&D funktioniert wenn ich die "AllowDrop" Eigenschaft des UserControls auf false setze und die "AllowDrop" Eigenschaft der TextBox auf true.
  2. In der eingangs beschriebenen Aufstellung, also mit Laden des UserControls aus der dll, habe ich die Events DragEnter und DragLeave der Textboxen (aus dem UserControl) behandelt. Ergebnis: diese Events funktionieren wie erwartet. Wenn ich während dem Draggen mit der Maus in eine Textbox reinfahre wird das DragEnter Event ausgelöst, beim Verlassen der Textbox dann das DragLeave Event.
  3. Ich habe das DragDrop Event der Textboxen im UserControl-Projekt an das UserControl weiter geleitet. Dazu habe das DragDrop Event der Textboxen behandelt und in der Handler-Methode ein eigenes Event des UserControls ausgelöst. Ergebnis: das DragDropEvent der Textboxen löst nicht aus.
  4. Mithilfe der Events DragEnter, DragLeave und MouseUp der Textboxen habe ich versucht "ein eigenes" DragDrop Event zu implementieren. Prinzip: wenn MouseUp nach DragEnter und vor DragLeave ausgelöst wird, dann führe DragDrop Funktionalität aus. Ergebnis:
  • wenn das Event MouseDown (Beginn des Drag-Vorgangs) auf der Listbox ausgelöst wird, dann wird auf dem UserControl und seinen Textboxen kein MouseUp Event ausgelöst wenn ich die Maustaste wieder loslasse.
  • wenn das MouseDown Event auf dem UserControl ausgelöst wird und die Maustaste anschließend wieder auf dem UserControl loslasse, wird das MouseUp Event ausgelöst
    ( - Texte zwischen zwei Textboxen innerhalb des UserControls kann ich trotzdem nicht Dragdroppen da das DragDrop Event der Textboxen nicht auslöst).

Es wundert mich, dass die DragEnter und DragLeave Events der Textboxen wie erwartet funktionieren, während das DragDrop Event spinnt. Meine Vermutung ist, dass das die Fehlfunktion von DragDrop irgendwie mit dem Verhalten des MouseUp Events, wie in 4. beschrieben, zusammenhängt.

Ich bitte um Rat.

C
c#nup Themenstarter:in
19 Beiträge seit 2017
vor 5 Jahren

Hat niemand eine Idee?

Habe ich das Problem unklar beschrieben, oder ist es eher eines dieser Randgruppenprobleme? 😛

C
c#nup Themenstarter:in
19 Beiträge seit 2017
vor 5 Jahren

Hallo Th69, ich hoffe das funktioniert jetzt wie beabsichtigt.

In der propjekte.zip findest du je eine zip mit dem Dll-Projekt für das UserControl und dem Form-Projekt wo dieses UserControl eingebunden ist. Wie in Punkt 3 meines Eröffnungsposts beschrieben, habe ich im Dll-Projekt die Events "DragDrop" und (zu Vorführzwecken) "DoubleClick" der Textboxen behandelt und in den Handlermethoden je ein eigens definiertes Event des UserControls ausgelöst. Die Events des UserControls werden dann im Form behandelt. Die Crux ist nach wie vor, dass das DragDrop Event nicht geht (das DoubleClick Event funktioniert wie gewünscht).

4.931 Beiträge seit 2008
vor 5 Jahren

Das ging ja einfach zu reparieren. 😉

Einfach noch das DragOver-Ereignis behandeln:


this.textBox1.DragOver += new DragEventHandler(this.handleTextBoxDragOver);
this.textBox2.DragOver += new DragEventHandler(this.handleTextBoxDragOver);

private void handleTextBoxDragOver(object sender, DragEventArgs e)
{
	e.Effect = DragDropEffects.All; // was du willst (außer DragDropEffects.None)
}

Warum das hier allerdings explizit notwendig ist, da kann ich auch nur vermuten, daß dies aufgrund der dynamisch geladenen Assembly so ist (als weiterer Sicherheitsmechanismus bzw. um dich zu ärgern 😉.

C
c#nup Themenstarter:in
19 Beiträge seit 2017
vor 5 Jahren

Danke!