C#DataGridView拖放行为?

时间:2016-07-26 14:35:02

标签: c# datagridview drag behavior

我对Windows窗体datagridview的拖放行为有疑问。 在我的场景中,用户必须从datagridview拖动单行并将其放在listview中。 当我启动应用程序时,这工作正常,但在我删除一行后,我必须在datagridview上单击两次,然后我必须单击第三次执行拖放操作。 这不是用户友好的。 如何在拖放操作后实现这一点,可以在不必单击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设置为readonly,multiselect disabled和fullrowselection。

谢谢!

1 个答案:

答案 0 :(得分: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

<强>待办事项&#39; S

注意无效的传入丢弃。