拖拽进picturebox中的数据也可以互相拖拽。是需要计算数据的长度或者宽度的。
关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率

已结题
将listview中的数据拖拽到picturebox中,要求鼠标范围在第一象限时拖拽到第一象限左上角,在第二象限时拖拽到第二象限右上角,每行最多可以放置三个数据
- ¥45
- c#
收起
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
微信扫一扫
点击复制链接分享
- 邀请回答
- 编辑 收藏 删除
- 收藏 举报
追加酬金 (90%的用户在追加酬金后获得了解决方案)
当前问题酬金
¥ 45 (您已提供 ¥ 20, 还可追加 ¥ 455)
支付方式
扫码支付
加载中...
3条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
关注
哭笑不得啊,之前那几次问题的答复,你都有验证学习过没有啊,我记得已经至少两个答案是带坐标计算的了,你没自己试试?
本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 1无用举报微信扫一扫
点击复制链接分享
评论按下Enter换行,Ctrl+Enter发表内容
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
小逸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);
}
}
}本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏举报微信扫一扫
点击复制链接分享
评论按下Enter换行,Ctrl+Enter发表内容 - 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
threenewbee 2023-03-30 12:48关注本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏举报微信扫一扫
点击复制链接分享
评论按下Enter换行,Ctrl+Enter发表内容
报告相同问题?
提交
- 2023-03-30 11:04回答 3 已采纳 哭笑不得啊,之前那几次问题的答复,你都有验证学习过没有啊,我记得已经至少两个答案是带坐标计算的了,你没自己试试?
- 2023-03-17 11:07回答 2 已采纳 看下这个,跟你的问题一样https://ask.csdn.net/questions/7904018
- 2023-03-16 15:02回答 3 已采纳 listView1.SelectedItems是个集合,不是字符串呀
- 2019-03-16 01:25NULL 博文链接:https://heisetoufa.iteye.com/blog/227724
- 2023-03-20 16:06回答 1 已采纳 e.X和e.Y本身就是相对于pictureBox1的坐标,不要再把它转换成全局坐标
- 2021-03-14 13:00回答 2 已采纳 emm 要实现你说的需求,最简单的方法, 你new ArrayList<String> 集合都可以搞定,你可以将你所需要的 【姓名】+"="+【地址】+"="+【电话】+"="+【日期】
- 2023-03-17 08:58回答 5 已采纳 该回答引用GPTᴼᴾᴱᴺᴬᴵ要将ListView中的项通过拖拽显示到PictureBox的背景上,可以按照以下步骤进行操作: 1.设置ListView的属性 AllowDrop 为 true,表示支持
- 2021-01-01 00:03在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字。 二、利用代码给ListView添加Item。 首先,ListView的Item属性包括Items和SubItems。必须先实例化一个...
- 2023-03-18 08:57回答 3 已采纳 怎么又问了一遍?已经说的很清楚了啊,你如果不记录数据,图片本身是不会知道你已经放了多少内容的,你得自己记录 打个比方,厨师只管做饭,具体谁坐哪,各自吃了什么,厨师才不关心,得服务员处理,你加个记录就是
- 2016-05-14 10:26回答 1 已采纳 这个需要子类化窗体消息,然后通过窗体重绘去实现了。
- 2022-11-12 19:57回答 2 已采纳 你可以参考下这篇文章:C# ListView导出为Excel表格
- 2015-10-10 10:35lfqsy的博客 如下一句话代码就搞定了 默认的是: listview.items.add(tiem) 改成: listView.Items.Insert(0,item);
- 2016-08-13 14:53回答 1 已采纳 Never mind. I just finally found an appropriate solution. Here is what I used if anyone ran into t
- 2023-06-05 18:52Andorid项目源码 ListView 中的item随意拖动完整版
- 2019-12-11 09:31Winform中实现拖拽到ListView中获取文件类型代码
- 没有解决我的问题, 去提问
问题事件
悬赏问题
- ¥15 c++图Djikstra算法求最短路径
- ¥15 Linux操作系统中的,管道通信问题
- ¥15 ansible tower 卡住
- ¥15 等间距平面螺旋天线方程式
- ¥15 通过链接访问,显示514或不是私密连接
- ¥100 系统自动弹窗,键盘一接上就会
- ¥50 股票交易系统设计(sql语言)
- ¥15 调制识别中这几个数据集的文献分别是什么?
- ¥15 使用c语言对日志文件处理
- ¥15 请大家看看报错原因,为啥会这样