我修改了c#DataGridViews,以便我可以在它们之间拖放行。我需要弄清楚如何禁用某些行的拖动,或拒绝这些行的拖放。我正在使用的标准是数据行中的值。
我想禁用该行(灰色,不允许拖动)作为我的第一选择。
我有哪些选择?如何根据条件禁用或拒绝拖放?
答案 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}");
}