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_DragDrop(object sender, DragEventArgs e) { int posX = e.X - ((PictureBox)sender).Left - this.Left; int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height); int row = 0; string itemName = (string)e.Data.GetData(DataFormats.Text); // 根据坐标计算出是否需要加行 if (posY > list.Count * 24) { list.Add(new List<string>()); row = list.Count - 1; } 如何实现将listview中的值比如111,拖拽到picturebox上时,可以选择放置 的位置,即鼠标按下的位置。如果picturebox上已经有了被拖拽过去的数据比如222222,实现将111可以放在222222的前面或者后面,需要计算他们这些字符串的大小,以此确定拖拽的位置限制条件是一行最多3个数据
时间: 2023-05-27 10:02:33 浏览: 101
【计算机专业-Andorid项目源码100套之】ListView中的item随意拖动
以下是实现将listview中的值拖拽到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_DragDrop(object sender, DragEventArgs e)
{
int posX = e.X - ((PictureBox)sender).Left - this.Left;
int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height);
// 计算拖拽到的位置所属的行和列
int row = posY / 24;
int col = posX / 50;
string itemName = (string)e.Data.GetData(DataFormats.Text);
// 根据位置限制条件计算出可以放置的位置
// 如果该位置已有数据,则根据大小比较确定应该放在前面还是后面
if (col < 3 && row < list.Count)
{
List<string> rowList = list[row];
if (rowList.Count < 3 || (col < rowList.Count && itemName.Length <= rowList[col].Length)
|| (col > 0 && itemName.Length <= rowList[col - 1].Length))
{
rowList.Insert(col, itemName);
}
else if (col < rowList.Count - 1 && itemName.Length >= rowList[col + 1].Length)
{
rowList.Insert(col + 1, itemName);
}
}
else if (posY > list.Count * 24)
{
list.Add(new List<string>() { itemName });
}
// 刷新显示已有数据
RefreshPictureBox();
}
private void RefreshPictureBox()
{
Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bitmap);
for (int i = 0; i < list.Count; i++)
{
List<string> rowList = list[i];
for (int j = 0; j < rowList.Count; j++)
{
string itemName = rowList[j];
g.DrawString(itemName, Font, Brushes.Black, new Point(j * 50, i * 24));
}
}
pictureBox1.Image = bitmap;
}
阅读全文