2015-09-04 162 views
2

背景:我有一个C#winforms应用程序。我将信息从一个datagridview拖到另一个datagridview。对于我的目的地网格拖曳过的事件,我有以下代码:如何在拖放过程中更改鼠标光标?

private void grid_DragOver(object sender, DragEventArgs e) 
{ 
     if(e.Data.GetDataPresent(typeof(SelectedRecordsCollection))) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 
} 

我想限制的下降,当鼠标悬停在特定的行(比如,行与奇数的索引编号,只被允许)。我目前限制了实际添加到dragdrop事件中目标网格的内容。但是,由于上述代码,只要鼠标悬停在目标控件的任何位置,光标就会变为移动图标。

问题:我如何让这个光标是一个“Cursor.No”图标上到处都是目标网格,除了将其设置为移动图标,当鼠标在一排奇数指数?

谢谢。

编辑: Aseem的解决方案最终为我工作。

+0

要获得“Cursor.No”效果,您需要使用“e.Effect = DragDropEffects.None;”。你的程序似乎需要一些更复杂的代码,尽管达到你想要的效果,基本上,如何检测它是否在一个奇怪的行...所以你可能不想使用“if(e.Data.GetDataPresent(typeof (SelectedRecordsCollection)))“,并用一个if语句改变它,该语句检测它所在的行是否很奇怪。 – Kaitlyn

+1

我想你需要在'Drag_Enter'中做些什么。 – Sinatr

+0

我同意,@Sinatr。他绝对必须在Drag_Enter中做一些事情,就像在这个答案中一样:http://stackoverflow.com/a/32242472/3472690(不回答他的问题,但提供了你说的一个例子) – Kaitlyn

回答

2

使用HitTest获取行索引。试试这个,但未经过测试 -

private void grid_DragOver(object sender, DragEventArgs e) 
{ 
    // Get the row index of the item the mouse is below. 
    Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y)); 
    DataGridView.HitTestInfo hit = dataGridView1.HitTest(clientPoint.X, clientPoint.Y); 
    if (hit.Type == DataGridViewHitTestType.Cell) { 
     e.Effect = (hit.RowIndex%2 == 0) //move when odd index, else none 
      ? DragDropEffects.None 
      : DragDropEffects.Move; 
    } 
} 
+0

感谢您的回应!根据我上面的评论,我的印象是DragOver只在鼠标进入控件时触发一次。但是,当我将鼠标从一行移动到另一行时,会发生什么情况? **编辑:**现在我再次读取msdn报价,我看到它说什么时候鼠标移动。我需要测试一下。谢谢。 – Andrew