将listview中的数据拖拽到picturebox中,要求鼠标范围在第一象限时拖拽到第一象限左上角,在第二象限时拖拽到第二象限右上角,每行最多可以放置三个数据

拖拽进picturebox中的数据也可以互相拖拽。是需要计算数据的长度或者宽度的。

哭笑不得啊,之前那几次问题的答复,你都有验证学习过没有啊,我记得已经至少两个答案是带坐标计算的了,你没自己试试?

该回答引用ChatGPT
这个问题需要实现的功能比较多,需要详细分析和编写代码。以下是实现该功能的思路和代码:
1. 在listview中设置ItemDrag事件,将拖拽的数据保存到DoDragDrop方法中。
2. 在pictureBox中设置DragEnter事件,判断拖拽的数据是否为文本格式,如果是则设置拖拽效果为复制。
3. 在pictureBox中设置DragDrop事件,获取拖拽的数据,根据鼠标位置和图片框的位置计算出拖拽数据应该放置的位置,然后将数据插入到对应的位置。
4. 在pictureBox中设置MouseDown、MouseMove和MouseUp事件,实现拖拽数据的效果。
5. 在pictureBox中设置Paint事件,绘制坐标系和网格线。
以下是完整的代码实现:

public partial class Form1 : Form
{
private const int ROW_HEIGHT = 50; // 行高
private const int COLUMN_WIDTH = 50; // 列宽
private const int MAX_COLUMN_COUNT = 3; // 每行最多放置的数据个数
private List data = new List(); // 存储拖拽的数据
private int dragIndex = -1; // 拖拽的数据的索引
private Point dragOffset; // 拖拽的偏移量
public Form1()
{
InitializeComponent();
// 初始化listview
listView1.AllowDrop = true;
listView1.ItemDrag += listView1_ItemDrag;
// 初始化pictureBox
pictureBox1.AllowDrop = true;
pictureBox1.DragEnter += pictureBox1_DragEnter;
pictureBox1.DragDrop += pictureBox1_DragDrop;
pictureBox1.Paint += pictureBox1_Paint;
pictureBox1.MouseDown += pictureBox1_MouseDown;
pictureBox1.MouseMove += pictureBox1_MouseMove;
pictureBox1.MouseUp += pictureBox1_MouseUp;
}
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
// 将拖拽的数据保存到DoDragDrop方法中
data.Clear();
foreach (ListViewItem item in listView1.SelectedItems)
{
data.Add(item.Text);
}
listView1.DoDragDrop(string.Join(",", data), DragDropEffects.Copy);
}
private void pictureBox1_DragEnter(object sender, DragEventArgs e)
{
// 判断拖拽的数据是否为文本格式,如果是则设置拖拽效果为复制
if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void pictureBox1_DragDrop(object sender, DragEventArgs e)
{
// 获取拖拽的数据
string[] draggedData = ((string)e.Data.GetData(DataFormats.Text)).Split(',');
// 计算拖拽数据应该放置的位置
Point mousePos = pictureBox1.PointToClient(new Point(e.X, e.Y));
int row = mousePos.Y / ROW_HEIGHT;
int column = mousePos.X > pictureBox1.Width / 2 ? MAX_COLUMN_COUNT : 0;
int index = row * MAX_COLUMN_COUNT + column;
// 插入数据到对应的位置
foreach (string item in draggedData)
{
if (index >= data.Count)
{
data.Add(item);
}
else
{
data.Insert(index, item);
}
index++;
}
// 刷新pictureBox
pictureBox1.Invalidate();
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
// 获取拖拽的数据的索引和偏移量
int row = e.Y / ROW_HEIGHT;
int column = e.X > pictureBox1.Width / 2 ? MAX_COLUMN_COUNT : 0;
dragIndex = row * MAX_COLUMN_COUNT + column;
dragOffset = new Point(e.X - column * COLUMN_WIDTH, e.Y - row * ROW_HEIGHT);
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
// 拖拽数据
if (dragIndex >= 0 && e.Button == MouseButtons.Left)
{
pictureBox1.DoDragDrop(string.Join(",", data), DragDropEffects.Move);
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
// 重置拖拽数据的索引
dragIndex = -1;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// 绘制坐标系和网格线
Graphics g = e.Graphics;
g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);
g.ScaleTransform(1, -1);
Pen pen = new Pen(Color.Black, 1);
g.DrawLine(pen, -pictureBox1.Width / 2, 0, pictureBox1.Width / 2, 0);
g.DrawLine(pen, 0, -pictureBox1.Height / 2, 0, pictureBox1.Height / 2);
pen = new Pen(Color.LightGray, 1);
for (int i = -pictureBox1.Width / 2 / COLUMN_WIDTH; i <= pictureBox1.Width / 2 / COLUMN_WIDTH; i++)
{
g.DrawLine(pen, i * COLUMN_WIDTH, -pictureBox1.Height / 2, i * COLUMN_WIDTH, pictureBox1.Height / 2);
}
for (int i = -pictureBox1.Height / 2 / ROW_HEIGHT; i <= pictureBox1.Height / 2 / ROW_HEIGHT; i++)
{
g.DrawLine(pen, -pictureBox1.Width / 2, i * ROW_HEIGHT, pictureBox1.Width / 2, i * ROW_HEIGHT);
}
// 绘制数据
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
Brush brush = new SolidBrush(Color.Black);
for (int i = 0; i < data.Count; i++)
{
int row = i / MAX_COLUMN_COUNT;
int column = i % MAX_COLUMN_COUNT;
int x = column * COLUMN_WIDTH + dragOffset.X - pictureBox1.Width / 2;
int y = row * ROW_HEIGHT + dragOffset.Y - pictureBox1.Height / 2;
g.DrawString(data[i], Font, brush, new RectangleF(x, y, COLUMN_WIDTH, ROW_HEIGHT), format);
}
}
}

https://blog.csdn.net/huang1600301017/article/details/103834137