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上已经有了被拖拽过去的数据比如222,实现将111可以放在222的前面或者后面,限制条件是一行最多3个数据,需要计算拖拽过去字符串的大小来确定具体放置位置
时间: 2023-05-27 10:02:29 浏览: 91
【计算机专业-Andorid项目源码100套之】ListView中的item随意拖动
首先,在picturebox上设置AllowDrop为true,在listView1_ItemDrag事件中获取被拖拽的ListViewItem的值,并将其存储在一个临时变量中。接下来,在picturebox的DragEnter事件中设置允许Copy和Move操作,并在DragDrop事件中计算出要放置的位置,并将其插入到picturebox中的正确位置。
以下是完整代码:
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
ListViewItem item = (ListViewItem)e.Item;
string itemName = item.Text;
listView1.DoDragDrop(itemName, DragDropEffects.Copy);
}
private void pictureBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(string)))
{
e.Effect = DragDropEffects.Copy | DragDropEffects.Move;
}
}
private void pictureBox1_DragDrop(object sender, DragEventArgs e)
{
string itemName = e.Data.GetData(typeof(string)).ToString();
int itemSize = TextRenderer.MeasureText(itemName, Font).Width;
int maxItemsPerRow = 3;
int rowHeight = Font.Height + 2;
int x = e.X;
int y = e.Y;
int rowCount = Math.Max(pictureBox1.Height / rowHeight, 1);
int rowIndex = y / rowHeight;
int colIndex = Math.Min(x / (itemSize + 2), maxItemsPerRow - 1);
int insertIndex = rowIndex * maxItemsPerRow + colIndex;
if (insertIndex >= pictureBox1.Controls.Count)
{
pictureBox1.Controls.Add(new Label() { Text = itemName, AutoSize = true, Left = colIndex * (itemSize + 2), Top = rowIndex * rowHeight });
}
else
{
pictureBox1.Controls.Add(new Label() { Text = itemName, AutoSize = true }, insertIndex);
}
pictureBox1.Invalidate();
}
这里每一项都会添加一个Label控件,你也可以使用其他控件或自定义绘制来显示被拖拽的数据。
阅读全文