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);
}
}
}
}
}