Im Beispiel liegen zwei DataGridViews auf einem Formular: gvSource und gvTarget. Die gewählte Zeile aus gvSource wird per Drag & Drop in gvTarget gezogen.
// Eigenschaften die gesetzt werden müssen gvSource.SelectionMode = DataGridViewSelectionMode.FullRowSelect; gvTarget.SelectionMode = DataGridViewSelectionMode.FullRowSelect; gvTarget.AllowDrop = true; // wenn im gvSource ein oder mehrere Zeilen markiert und der linke Mausbutton gedrückt gehalten wird private void gvSource_CellMouseDown(object sender, MouseEventArgs e) { // nur DragDrop initiieren, wenn Elemente aus dem Zellenbereich gewählt, // sonst gibt es Probleme beim Einstellen der Spaltenbreite per Maus if (e.RowIndex != -1) { if (gvSource.SelectedRows.Count > 0) { DragDropEffects dropEffect = gvSource.DoDragDrop(gvSource.SelectedRows, DragDropEffects.Copy); } } } // wenn die Maus mit den Objekten über gvTarget ist private void gvTarget_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.None; DataGridViewSelectedRowCollection rows = e.Data.GetData(typeof(DataGridViewSelectedRowCollection)) as DataGridViewSelectedRowCollection; if (rows != null) { e.Effect = DragDropEffects.Copy; } } // Objekte aus gvSource in gvTarget einfügen, Doppelungen vermeiden private void gvTarget_DragDrop(object sender, DragEventArgs e) { DataGridViewSelectedRowCollection rows_source = e.Data.GetData(typeof(DataGridViewSelectedRowCollection)) as DataGridViewSelectedRowCollection; if (rows_source != null) { Point p = gvTarget.PointToClient(new Point(e.X, e.Y)); DataGridView.HitTestInfo info = gvTarget.HitTest(p.X, p.Y); if (info.RowIndex != -1 && info.ColumnIndex != -1) { foreach (DataGridViewRow rs in rows_source) { bool bFound = false; // prüfen, ob schon in der Liste foreach (DataGridViewRow row_target in gvTarget.Rows) { // Vergleich von Spalte mit Index 0, wenn gleich, dann schon vorhanden if (rs.Cells[0].Value.ToString() == row_target.Cells[0].Value.ToString()) { bFound = true; break; } } // wenn noch nicht vorhanden, dann einfügen if (bFound == false) { DataGridViewRow rnew = new DataGridViewRow(); rnew.CreateCells(gvTarget); // Indexe beachten, Spaltenanordnung von gvSource muss // nicht der von gvTarget entsprechen rnew.Cells[0].Value = rs.Cells[1].Value.ToString(); rnew.Cells[1].Value = rs.Cells[2].Value.ToString(); rnew.Cells[2].Value = rs.Cells[3].Value.ToString(); gvTarget.Rows.Add(rnew); } } } } }