DataGridView Drag / Drop - ограничивать боковую «полосу», а не ячейки - PullRequest
1 голос
/ 23 ноября 2011

У меня есть DataGridView, где я позволяю пользователям перетаскивать строки, чтобы изменить их порядок. Это работает нормально, но, кажется, очень чувствительно - просто щелкнув и слегка двигая мышь, при нажатии на ячейку запускается операция перетаскивания.

То, что я хочу сделать, это разрешить перетаскивание только из «боковой панели» DataGridView, то есть «столбца» слева от красной линии на изображении ниже:

enter image description here

Возможно ли это? Вот мой код:

[код]

    private Rectangle dragBoxFromMouseDown;
    private int rowIndexFromMouseDown;
    private int rowIndexOfItemUnderMouseToDrop;

    private void grdCons_MouseMove(object sender, MouseEventArgs e)
    {
        if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
        {
            if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y))
            {
                DragDropEffects dropEffect = grdCons.DoDragDrop(grdCons.Rows[rowIndexFromMouseDown], DragDropEffects.Move);
            }
        }
    }

    private void grdCons_MouseDown(object sender, MouseEventArgs e)
    {
        rowIndexFromMouseDown = grdCons.HitTest(e.X, e.Y).RowIndex;
        if (rowIndexFromMouseDown != -1)
        {
            Size dragSize = SystemInformation.DragSize;
            dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
        }
        else
        {
            dragBoxFromMouseDown = Rectangle.Empty;
        }
    }

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

    private void grdCons_DragDrop(object sender, DragEventArgs e)
    {
        Point clientPoint = grdCons.PointToClient(new Point(e.X, e.Y));
        rowIndexOfItemUnderMouseToDrop = grdCons.HitTest(clientPoint.X, clientPoint.Y).RowIndex;

        if (e.Effect == DragDropEffects.Move)
        {
            DataGridViewRow rowToMove = e.Data.GetData(typeof(DataGridViewRow)) as DataGridViewRow;
            grdCons.Rows.RemoveAt(rowIndexFromMouseDown);
            grdCons.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove);
        }
    }

[/ код]

1 Ответ

1 голос
/ 23 ноября 2011

Мне удалось получить Drag-and-Drop, используя только заголовки строк, проверяя DataGridViewHitTestType в обработчике события MouseDown, например:

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;

    // Here we also check that the HitTest happened on a RowHeader
    if (rowIndexFromMouseDown != -1 && (dataGridView1.HitTest(e.X, e.Y).Type == DataGridViewHitTestType.RowHeader))
    {
        // 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;
}

Я предполагаю, что вы получили свой код из FAQ по DataGridView , поскольку ваш код практически идентичен приведенному там примеру?

Если вы этого не сделали, я бы порекомендовал взглянуть на FAQ - он полон полезных советов и примеров.

...