如何实现将listview中的值比如111,拖拽到picturebox上时,可以选择放置 的位置,即鼠标按下的位置。如果picturebox上已经有了被拖拽过去的数据比如222,实现将111可以放在222的前面或者后面,限制条件是一行最多3个数据,需要计算拖拽过去数据的大小
时间: 2023-05-27 18:02:27 浏览: 87
首先需要在listview上启用拖拽功能,在listview的MouseDown事件中添加以下代码:
```
int index = listView1.SelectedIndices[0];
listView1.DoDragDrop(listView1.Items[index].Text, DragDropEffects.Copy);
```
这样就可以将listview中选中的项的文本拖拽到其他控件上。
然后,在picturebox上需要处理以下事件:
```
private void pictureBox1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void pictureBox1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void pictureBox1_DragDrop(object sender, DragEventArgs e)
{
Point p = pictureBox1.PointToClient(new Point(e.X, e.Y));
int x = p.X;
int y = p.Y;
int width = 50; //假设拖拽过去的数据大小为50
int height = 20;
//计算要放置的位置
int row = y / height;
int col = x / width;
//判断当前位置是否已经有数据
bool hasData = false;
foreach (Control ctrl in pictureBox1.Controls)
{
if (ctrl.Location.X / width == col && ctrl.Location.Y / height == row)
{
hasData = true;
break;
}
}
if (hasData)
{
//如果当前位置已有数据,则需要在当前数据前面或后面插入新数据
foreach (Control ctrl in pictureBox1.Controls)
{
if (ctrl.Location.X / width == col && ctrl.Location.Y / height == row)
{
if (x > ctrl.Location.X && x < ctrl.Location.X + width)
{
//插入在当前数据后面
int newIndex = pictureBox1.Controls.IndexOf(ctrl) + 1;
Label newLabel = new Label();
newLabel.Text = e.Data.GetData(DataFormats.Text).ToString();
newLabel.Width = width;
newLabel.Height = height;
newLabel.Location = new Point(col * width, row * height);
pictureBox1.Controls.Add(newLabel);
pictureBox1.Controls.SetChildIndex(newLabel, newIndex);
break;
}
else
{
//插入在当前数据前面
int newIndex = pictureBox1.Controls.IndexOf(ctrl);
Label newLabel = new Label();
newLabel.Text = e.Data.GetData(DataFormats.Text).ToString();
newLabel.Width = width;
newLabel.Height = height;
newLabel.Location = new Point(col * width, row * height);
pictureBox1.Controls.Add(newLabel);
pictureBox1.Controls.SetChildIndex(newLabel, newIndex);
break;
}
}
}
}
else
{
//如果当前位置没有数据,则直接放置
Label newLabel = new Label();
newLabel.Text = e.Data.GetData(DataFormats.Text).ToString();
newLabel.Width = width;
newLabel.Height = height;
newLabel.Location = new Point(col * width, row * height);
pictureBox1.Controls.Add(newLabel);
}
}
```
这里假设拖拽过去的数据大小为50x20,每行可以放置3个数据,根据picturbox的大小和拖拽过去的数据大小可以计算出当前鼠标指针在picturebox上的行列索引。然后根据这个索引判断当前位置是否已经有数据了,如果有则根据鼠标指针的位置决定是插入在当前数据前面还是后面;如果没有则直接放置。
阅读全文