根据对象数据拒绝拖放?

时间:2011-10-06 19:28:36

标签: c# winforms user-interface drag-and-drop

我修改了c#DataGridViews,以便我可以在它们之间拖放行。我需要弄清楚如何禁用某些行的拖动,或拒绝这些行的拖放。我正在使用的标准是数据行中的值。

我想禁用该行(灰色,不允许拖动)作为我的第一选择。

我有哪些选择?如何根据条件禁用或拒绝拖放?

4 个答案:

答案 0 :(得分:5)

如果要防止拖动行,请改用以下方法:

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

在这种情况下,您当然不需要使用我之前答案中的方法。

答案 1 :(得分:2)

以下是一个可以帮助您入门的示例方法:

    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”,它将禁止拖动到一行。

答案 2 :(得分:1)

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

您可以覆盖DragEnter和DragLeave函数以实现

在DragLeave中 - 如果对象没有所需的值,您可以根据选择和取消操作查询对象

干杯

答案 3 :(得分:0)

可能有点晚了,但是我今天遇到了同样的问题。在某些情况下,我想防止拖动列表项。

我最终使用了_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}"); 
        }