Also warum das nicht funktioniert ist recht einfach erklärt: Deine Schleife, mit der du den MouseDown-Eventhandler abonnierst, ist im Load-Event deiner Form. Dieses Event wird gefeuert, wenn die Form fertig geladen ist, und nur dann. Heißt: Dein Code da läuft ein einziges Mal, und das bevor in deinem FlowLayoutPanel auch nur ein einziges Control ist.
Lösung dafür: Das FlowLayoutPanel hat ein ControlAdded-Event. Abonnier es und ändere deinen Code so:
private void ContentForm_Load(object sender, EventArgs e) { this.paneCont.AllowDrop = true; this.paneCont.DragOver += new DragEventHandler(paneCont_DragOver); this.paneCont.DragDrop += new DragEventHandler(paneCont_DragDrop);}private void paneCont_ControlAdded(object sender, ControlEventArgs e) { e.Control.MouseDown += new MouseEventHandler(c_MouseDown);}
(Das, was der Load-Handler macht, könnte man eigentlich auch im Forms-Designer machen, dann würdest du dir den ganz sparen.)
Nur ist das, was das Programm jetzt macht, kein Drag&Drop. Achte mal genau darauf, was passiert, wenn du etwas droppst. Das Control, welches du gedroppt hast, landet ganz hinten an der letzten Stelle. Das liegt daran, dass du es in deinem DragDrop-Handler einfach neu zur Liste der Controls hinzufügst. Eine Möglichkeit, das zu lösen, wäre zum Beispiel folgende:
void paneCont_DragDrop(object sender, DragEventArgs e) {
UserControl c = e.Data.GetData(e.Data.GetFormats()[0]) as UserControl;
if (c != null) {
var location = this.paneCont.PointToClient(new Point(e.X, e.Y));
var child = this.paneCont.GetChildAtPoint(location);
if (child != null) {
int i = this.paneCont.Controls.GetChildIndex(child);
this.paneCont.Controls.SetChildIndex(c, i);
}
}
}
Alles anzeigen
Nachteil: Das funktioniert nur, wenn du direkt auf eines der Controls droppst. Droppst du stattdessen in einen Leerraum im FlowLayoutPanel, passiert gar nicht (weil paneCont.GetChildAtPoint dann null liefert). Andere Lösungsmöglichkeiten wären aber doch um einiges komplizierter als diese, also vielleicht kannst du damit leben. Übrigens, nette Idee, wie du WinForms Drag&Drop da mit Controls verwendest. Das Zeug ist eigentlich für Daten gedacht, nicht für Controls. Dass der natürlich das ganze Control in die "Daten" schreibt, wusste ich gar nicht. Ich hätts, wie oben beschrieben, mit MousDown/MouseUp/MouseMove gemacht.
Zitat
Ich vermute mal ganz stark, dass es mit der Unterscheidung zwischen UserControlls und Controlls und mit dem hier zu tun hat: "foreach (UserControl c in this.paneCont.Controls)"
UserControls sind Controls. ;) Sie sind über die Linie Control -> ScrollableControl -> ContainerControl -> UserControl abgeleitet.