2010-07-03 62 views

回答

2

从快速谷歌搜索,this似乎是自定义拖放行的解决方案。注意我只是从链接页面中撕下下面的代码,我无法保证其有效性。

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

private void dataGridView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if ((e.Button & MouseButtons.Left) == MouseButtons.Left) 
    { 
     // If the mouse moves outside the rectangle, start the drag. 
     if (dragBoxFromMouseDown != Rectangle.Empty && 
      !dragBoxFromMouseDown.Contains(e.X, e.Y)) 
     { 
      // Proceed with the drag and drop, passing in the list item.      
      DragDropEffects dropEffect = dataGridView1.DoDragDrop(dataGridView1.Rows[rowIndexFromMouseDown], DragDropEffects.Move); 
     } 
    } 
} 

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; 

    if (rowIndexFromMouseDown != -1) 
    { 
     // 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; 
    } 
} 

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

private void dataGridView1_DragDrop(object sender, DragEventArgs e) 
{ 
    // The mouse locations are relative to the screen, so they must be 
    // converted to client coordinates. 
    Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y)); 
    // Get the row index of the item the mouse is below. 
    rowIndexOfItemUnderMouseToDrop = dataGridView1.HitTest(clientPoint.X, clientPoint.Y).RowIndex; 
    // If the drag operation was a move then remove and insert the row. 
    if (e.Effect== DragDropEffects.Move) 
    { 
     DataGridViewRow rowToMove = e.Data.GetData(typeof(DataGridViewRow)) as DataGridViewRow; 
     dataGridView1.Rows.RemoveAt(rowIndexFromMouseDown); 
     dataGridView1.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove); 
    } 
} 
+4

我不认为这解决了这个问题:“问题在于,当我将鼠标放在单元格上时,这些行会被取消选择。”我也在寻找解决这个问题的办法。 – cdavidyoung 2012-09-21 17:43:59

0

我个人不确定如何更改您所说的问题的默认行为,但我知道默认情况下,右键单击不会对DataGridView执行任何操作。有了这个说法,解决方法可能会实现我之前做的一些事情:自定义的ContextMenuStrip允许用户通过选择行来复制/粘贴行,右键单击打开上下文菜单,复制行,然后右键单击,单击行标题以打开上下文菜单并粘贴。 CellClick和RowHeaderMouseClick事件应该使这更容易。

1

子类DataGridView的帮助你做一个有条件的办法:

class SimpleDataGridView : DataGridView { 

    public Action<DataGridViewCellMouseEventArgs> BeforeCellMouseDown; 
    public Action<DataGridViewCellMouseEventArgs> AfterCellMouseDown; 

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) { 
     if(BeforeCellMouseDown != null) 
      BeforeCellMouseDown(e); 

     base.OnCellMouseDown(e); 

     if(AfterCellMouseDown != null) 
      AfterCellMouseDown(e); 
    } 
} 

然后,您可以使用这种方式,在构造函数:

IEnumerable<DataGridViewRow> sel = null; 

dataGridView1.BeforeCellMouseDown = 
    e => { 
     if (yourCondition) 
      // Save the selection 
      sel = dataGridView1.SelectedRows.OfType<DataGridViewRow>(); 
     else 
      sel = null; 
    }; 

dataGridView1.AfterCellMouseDown = 
    e => { 
     if(sel != null) { 
      // Restore the selection 
      foreach(var row in sel) 
       row.Selected = true; 
     } 
    }; 
相关问题