Frage

Ich habe DataGridView, die eine List<myClass> gebunden und i sortieren sie durch "Priority" Eigenschaft in "myClass". Deshalb möchte ich eine „DataGridViewRow“ auf bestimmte Position ziehen, es ist „Priority“ Eigenschaft zu ändern.

Wie kann ich "Drag & Drop" Datagridview-Zeilen?. Und wie zu handhaben?.

War es hilfreich?

Lösung

ich diesen Code Probe auf MSDN

Beachten Sie Folgendes:

1). Datagridview-Eigenschaft AllowDrop muss auf true gesetzt werden (Standardeinstellung ist false).

2). Das folgende Beispiel arbeitet aus der Box, wenn die Datagridview ist nicht dagetenbundenen. Sonst wird es eine InvalidOperationException werfen. Wenn es Databound ist, sollten Sie die Reihenfolge der Elemente in der DataSource manipulieren.

private Rectangle dragBoxFromMouseDown;
private int rowIndexFromMouseDown;
private int rowIndexOfItemUnderMouseToDrop;
private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
{
    if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
    {
        // If the mouse moves outside the rectangle, start the drag.
        if (dragBoxFromMouseDown != Rectangle.Empty &&
            !dragBoxFromMouseDown.Contains(e.X, e.Y))
        {

            // Proceed with the drag and drop, passing in the list item.                    
            DragDropEffects dropEffect = dataGridView1.DoDragDrop(
            dataGridView1.Rows[rowIndexFromMouseDown],
            DragDropEffects.Move);
        }
    }
}

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    // Get the index of the item the mouse is below.
    rowIndexFromMouseDown = dataGridView1.HitTest(e.X, e.Y).RowIndex;
if (rowIndexFromMouseDown != -1)
    {
        // Remember the point where the mouse down occurred. 
     // The DragSize indicates the size that the mouse can move 
     // before a drag event should be started.                
        Size dragSize = SystemInformation.DragSize;

        // Create a rectangle using the DragSize, with the mouse position being
        // at the center of the rectangle.
        dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
                                                       e.Y - (dragSize.Height / 2)),
                            dragSize);
    }
    else
        // Reset the rectangle if the mouse is not over an item in the ListBox.
        dragBoxFromMouseDown = Rectangle.Empty;
}

private void dataGridView1_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

private void dataGridView1_DragDrop(object sender, DragEventArgs e)
{
    // The mouse locations are relative to the screen, so they must be 
    // converted to client coordinates.
    Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y));

    // Get the row index of the item the mouse is below. 
    rowIndexOfItemUnderMouseToDrop =
        dataGridView1.HitTest(clientPoint.X, clientPoint.Y).RowIndex;

    // If the drag operation was a move then remove and insert the row.
    if (e.Effect== DragDropEffects.Move)
    {
        DataGridViewRow rowToMove = e.Data.GetData(
            typeof(DataGridViewRow)) as DataGridViewRow;
        dataGridView1.Rows.RemoveAt(rowIndexFromMouseDown);
        dataGridView1.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove);

    }
}

Andere Tipps

Die Antwort von ‚Wahid Bitar‘ hat mir sehr geholfen. Ich kann nicht den oben, so einen kleinen Zusatz Kommentar: Wenn das Löschen einer Zeile unerwünscht ist, wie durch ‚neminem‘ kommentiert: Fügen Sie einfach auf Drag & Drop-Ereignis kurz vor den Linien, die schließlich bewegt er sich:

        if (rowIndexOfItemUnderMouseToDrop < 0 )
        {
            return;
        }        
       dataGridView1.Rows.RemoveAt(rowIndexFromMouseDown);
       dataGridView1.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top