夏456 2023-03-30 11:04 采纳率: 85.7%
浏览 73
已结题

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

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

  • 写回答

3条回答 默认 最新

  • 文盲老顾 WEB应用领新星创作者 2023-03-30 11:33
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 小逸2023 2023-03-30 11:18
    关注
    该回答引用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);
    }
    }
    }
    评论
  • threenewbee 2023-03-30 12:48
    关注
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 修改了问题 4月1日
  • 修改了问题 4月1日
  • 展开全部

悬赏问题

  • ¥15 c++图Djikstra算法求最短路径
  • ¥15 Linux操作系统中的,管道通信问题
  • ¥15 ansible tower 卡住
  • ¥15 等间距平面螺旋天线方程式
  • ¥15 通过链接访问,显示514或不是私密连接
  • ¥100 系统自动弹窗,键盘一接上就会
  • ¥50 股票交易系统设计(sql语言)
  • ¥15 调制识别中这几个数据集的文献分别是什么?
  • ¥15 使用c语言对日志文件处理
  • ¥15 请大家看看报错原因,为啥会这样