我对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。
谢谢!
答案 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);
}
}
导致此行为的结果:
<强>待办事项&#39; S 强>
注意无效的传入丢弃。