14 Aralık 2009 Pazartesi

DataGridView Drag-Drop (Sürükle-Bırak)

Datagridview’de satırların yerlerini sürükle-bırak ile değiştirmek isterseniz, aşağıdaki 4 eventtaki (MouseMove, MouseDown, DragDrop, DragOver) değişiklikleri yapmanız yeterli olacaktır:

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. 
            if (datagridview1.Rows.Count != 0)
            {
                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_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.
    //This line is necessary for avoid missing out row when you drag                                     
if (rowIndexOfItemUnderMouseToDrop != -1)
    {
       if (e.Effect == DragDropEffects.Move)
       {
          DataGridViewRow rowToMove = e.Data.GetData(
                  typeof(DataGridViewRow)) as DataGridViewRow;
                datagridview1.Rows.RemoveAt(rowIndexFromMouseDown);
                datagridview1.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove);
                this.DragDrop(this, e);
            }
        }
    }
}

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

1 yorum:

  1. Paylaşım çok güzel ve çok kullanışlı .Şu şekilde birşey daha olsa misal DataGridView içinde sutun ve satırlarda olan değerleri birbiri ile kontrol ettirme.Şu şekilde bir satirda belirlediğimiz değerden 4 tane olsun 5 ci değer o satira girilemesin.
    aynı şekilde sutun icinde de varsa girilmesin.

    misal
    1-olcay 2-olcay 3-olcay 4-olcay izin var / 5-olcay 'a izin vermesin ...

    YanıtlaSil