Отклонить перетаскивание на основе данных объекта? - PullRequest
5 голосов
/ 06 октября 2011

Я изменил c # DataGridViews, чтобы я мог перетаскивать строки между ними.Мне нужно выяснить, как отключить перетаскивание на определенных строках или отклонить падение для этих строк.Критерий, который я использую, - это значение в datarow.

Я хотел бы отключить строку (выделение серым цветом и не допускать перетаскивания) в качестве первого выбора.

Какие опции делаютЯ имею?Как я могу отключить или отклонить перетаскивание на основе критериев?

Ответы [ 4 ]

5 голосов
/ 10 октября 2011

Если вы хотите предотвратить перетаскивание строки, используйте вместо этого следующий метод:

void dataGridView1_DragEnter(object sender, DragEventArgs e)
{
    DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow)); // Get the row that is being dragged.
    if (row.Cells[0].Value.ToString() == "no_drag") // Check the value of the row.
        e.Effect = DragDropEffects.None; // Prevent the drag.
    else
        e.Effect = DragDropEffects.Move; // Allow the drag.
}

Здесь я предполагаю, что вы начинаете операцию перетаскивания, выполнив что-то вроде этого:

DoDragDrop(dataGridView1.SelectedRows[0], DragDropEffects.Move);

В этом случае вам не нужно использовать метод из моего предыдущего ответа, конечно.

2 голосов
/ 09 октября 2011

Вот пример метода, с которого следует начать:

    void dataGridView1_DragOver(object sender, DragEventArgs e)
    {
        Point cp = PointToClient(new Point(e.X, e.Y)); // Get coordinates of the mouse relative to the datagridview.
        var dropped = dataGridView1.HitTest(cp.X, cp.Y); // Get the item under the mouse pointer.
        if (dataGridView1.Rows[dropped.RowIndex].Cells[0].Value.ToString() == "not_allowed") // Check the value.
            e.Effect = DragDropEffects.None; // Indicates dragging onto this item is not allowed.
        else
            e.Effect = DragDropEffects.Move; // Set the drag effect as required.
    }

Вы, конечно, должны использовать это так:

dataGridView1.DragOver += new DragEventHandler(dataGridView1_DragOver);

Измените условие в условии if в соответствии с вашими потребностями. В настоящее время он отключает перетаскивание на строку, если значение первой ячейки равно not_allowed.

1 голос
/ 09 октября 2011

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx

Вы можете переопределить функции DragEnter и DragLeave для достижения

В DragLeave - вы можете запросить ваш объект на основе выбора и отменить операцию, если объект не имеет требуемого значения

Приветствия

0 голосов
/ 14 июля 2018

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

В итоге я использовал обработчик события _ItemDrag.Внутри обработчика я проверил, было ли разрешено перетаскивание элемента, и если нет, я использовал SendKeys.Send ("{ESC}");команда для отмены перетаскивания.

//Prevents dragging tree items that have at least one child item 
    private void lvTaxonomyItemLedgerAccounts_ItemDrag(object sender, ItemDragEventArgs e) 
        { 
           LedgerAccountTaxonomyItem accountTaxonomyItem = ((OLVListItem)e.Item).RowObject as LedgerAccountTaxonomyItem; 
           if (_ledgerAccountTaxonomyItems.FirstOrDefault(m => m.ParentAccountId == accountTaxonomyItem.Id) != null) 
               SendKeys.Send("{ESC}"); 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...