2016-07-26 60 views
0

我对Windows窗体datagridview的拖放行为有疑问。 在我的场景中,用户必须从datagridview拖放单行并将其放入列表视图中。 当我启动应用程序时,这工作正常,但我删除了一行后,我必须点击两次到datagridview,然后我不得不点击第三次做一个拖放操作。 这不是userfriendly。 如何在拖拽拖放操作后实现下一步拖拽而不必点击datagridview? (点击并按住mousebutton最后拖放后,只需点击一次下降)C#DataGridView拖放行为?

这里是一个示例代码:

private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     dataGridView1.DoDragDrop(dataGridView1.SelectedRows, DragDropEffects.Move); 
     dataGridView1.Focus(); 
     dataGridView1.CurrentCell = dataGridView1.SelectedRows[0].Cells[0]; 
    } 

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

    private void listBox1_DragDrop(object sender, DragEventArgs e) 
    { 
     MessageBox.Show(dataGridView1.SelectedRows[0].Cells[0].Value.ToString()); 

    } 

我已经尝试过用datagridview1.Focus(解决这个问题),但它不没有帮助。

更多信息: Datagridview设置为只读,多选禁用和fullrowselection。

谢谢!

+0

您的拖放不是从用户拖动行开始的,而是只需单击任意鼠标按钮。这意味着当你回到它时,这些第一次点击开始DD操作,而不是选择一行等。此外,你似乎拖动*所有*选定的行,但只是拖动一个。 – Plutonix

+0

是的,这是真的,但SelectedRows只能保持行,因为multiselect关闭。 当我回到datagridview选择一行并通过一次单击就可以启动draganddrop时,可以吗? – user3070641

回答

0

而不是使用MouseDown这是用于DataGridView的基本功能,而应该使用MouseMove

private void lvDrop_DragDrop(object sender, DragEventArgs e) 
{ 
    var rows = e.Data.GetData(typeof(DataGridViewSelectedRowCollection)) 
       as DataGridViewSelectedRowCollection; 

    if(rows.Count > 0) 
    { 
     foreach(DataGridViewRow row in rows) 
     { 
      lvDrop.Items.Add(row.Cells[0].Value.ToString()); 
     } 
    } 
} 

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

private void dgvDrag_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Left) 
    { 
     dgvDrag.DoDragDrop(dgvDrag.SelectedRows, DragDropEffects.Move); 
    } 
} 

结果这种行为:

enter image description here

待办事项的

关爱无效传入下降。