private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { ListViewItem item = (ListViewItem)e.Item; string itemName = item.Text; listView1.DoDragDrop(itemName, DragDropEffects.Copy); 如何实现将listview中的值比如111,拖拽到picturebox上时,可以选择放置 的位置,即鼠标按下的位置。如果picturebox上已经有了被拖拽过去的数据比如222222,实现将111可以放在222222的前面或者后面,需要计算他们这些字符串的大小,以此确定拖拽的位置限制条件是一行最多3个数据
时间: 2023-05-27 21:02:31 浏览: 79
private void pictureBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.StringFormat)) // 拖拽数据是字符串
{
string data = e.Data.GetData(DataFormats.StringFormat).ToString();
if (!string.IsNullOrEmpty(data)) // 拖拽数据不为空
{
e.Effect = DragDropEffects.Copy; // 允许拖拽
}
}
}
private void pictureBox1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.StringFormat)) // 拖拽数据是字符串
{
string data = e.Data.GetData(DataFormats.StringFormat).ToString();
if (!string.IsNullOrEmpty(data)) // 拖拽数据不为空
{
Point dropPoint = pictureBox1.PointToClient(new Point(e.X, e.Y)); // 鼠标松开的位置
int dropIndex = -1; // 插入位置
for (int i = 0; i < pictureBox1.Controls.Count; i++)
{
Control control = pictureBox1.Controls[i];
if (control is Label label && label.Tag?.ToString() == "Data") // 找到数据标签
{
if (dropIndex == -1 && dropPoint.Y < control.Top) // 插入位置在前
{
dropIndex = i;
break;
}
else if (dropIndex == -1 && dropPoint.Y >= control.Top && dropPoint.Y <= control.Bottom) // 插入位置与当前标签重合
{
dropIndex = i + 1;
break;
}
else if (dropPoint.Y >= control.Bottom && i == pictureBox1.Controls.Count - 1) // 插入位置在最后
{
dropIndex = i + 1;
}
}
}
if (dropIndex == -1) // 没有找到插入位置,说明没有数据标签
{
dropIndex = 0; // 直接插入到最前
}
int dataCount = 0; // 记录当前行已有的数据数
int dataWidth = 0; // 记录当前行已有的数据宽度总和
for (int i = 0; i < pictureBox1.Controls.Count; i++)
{
Control control = pictureBox1.Controls[i];
if (control is Label label && label.Tag?.ToString() == "Data") // 找到数据标签
{
if (i == dropIndex) // 插入位置
{
if (dataCount >= 3) // 超出一行最多3个数据的限制
{
break;
}
Label newLabel = new Label(); // 新的数据标签
newLabel.Text = data;
newLabel.AutoSize = true;
newLabel.Top = label.Top;
newLabel.Left = label.Left;
pictureBox1.Controls.Add(newLabel);
newLabel.BringToFront();
newLabel.MouseDown += label_MouseDown;
newLabel.MouseMove += label_MouseMove;
newLabel.MouseUp += label_MouseUp;
break;
}
else if (i > dropIndex) // 插入位置之后的标签需要重新排列
{
label.Top += label.Height + 5;
}
dataCount++;
dataWidth += label.Width;
if (dataCount >= 3 || dataWidth >= pictureBox1.Width - label.Left) // 超出一行最多3个数据或宽度超出的限制
{
dataCount = 0;
dataWidth = 0;
}
}
}
}
}
}
private void label_MouseDown(object sender, MouseEventArgs e)
{
Label label = (Label)sender;
label.DoDragDrop(label.Text, DragDropEffects.Move);
}
private void label_MouseMove(object sender, MouseEventArgs e)
{
Label label = (Label)sender;
if (e.Button == MouseButtons.Left)
{
label.DoDragDrop(label.Text, DragDropEffects.Move);
}
}
private void label_MouseUp(object sender, MouseEventArgs e)
{
Label label = (Label)sender;
label.Parent.Controls.Remove(label); // 删除标签
}
阅读全文