C# DataGridView如何实现拖拽功能?

时间:2020-12-13 12:55:48
我想要的是一个简单的拖拽功能

比如单元格0,3 拖拽到 单元格3,3  交换两个格子中的内容
最好在拖拽的过程中能将单元格的内容随着鼠标移动- -

不知道该怎样实现? 谢谢~

37 个解决方案

#1


只是交换内容好做。实现这种拖拽效果有点难

#2


交换内容的话该怎么写? 

#3


学习围观

#4


帮顶 等高人.

#5


用一个TextBox控件,当你点击单元格时,TextBox覆盖它取得值并随着鼠标移动,移动的位置,把后面单元格的数值给前面那个,再把TextBox里面的内容替换就行了。

#6


LS给些代码之类的  或者说 要写哪个事件?

#7


1. 在DataGridView控件的CellEnter事件中当点击某个单元格时,把TextBox置顶只读,取得DataGridView的值给TextBox。
                Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                r = this.dgv1.RectangleToScreen(r);
                this.TextBox1.Location = this.tabPage4.RectangleToClient(r).Location;
                this.TextBox1.Size = r.Size;
2. 然后执行MouseMove事件,移动TextBox
3. 响应MouseUp事件,得到鼠标抬起位置(相对于DataGridView),将DataGridView的单元格数据取出来给前面那个,再把TextBox给这个单元格,隐藏TextBox控件。

#8


引用 7 楼 qiuxin425 的回复:
1. 在DataGridView控件的CellEnter事件中当点击某个单元格时,把TextBox置顶只读,取得DataGridView的值给TextBox。
                Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                r =……


好 我去试试 有结果了再来~

#9


关于第三步  怎样在知道坐标的情况下知道下标呢?

#11


用第三方控件DevExpress

#12


引用 7 楼 qiuxin425 的回复:
1. 在DataGridView控件的CellEnter事件中当点击某个单元格时,把TextBox置顶只读,取得DataGridView的值给TextBox。
                Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                r =……


谢谢,基本的拖拽已经做好了  现在就是实现那种拖拽效果了。。
不知道为什么显示不出   如果显示文字内容比较复杂的话    显示一个框表示这是拖拽操作也行- -

#13


http://blog.csdn.net/dodducs/archive/2010/07/22/5755235.aspx


鄙人曾写过一个关于整行数据进行替换的小DEMO 但是没有加过边界安全设置等
你只要加上边界  把里面整行数据替换成只替换某一列就可以了

#14


你要的实现画面呈现拖拽效果 在
private void dataGridView1_CellMouseDown_1(object sender, DataGridViewCellMouseEventArgs e) 

这个方法里就是代码

#15


不行啊 显示不出来

#16


你是不是没有增加一个新的 DataGidView?

你新建一个项目DEMO  把我的代码扔里边跑一下 了解一下程序思路
不可能跑不出来

#17


我不需要新增一个DataGridView啊
我只有一个DataGridView 在表里拖拽

#18


你觉得可能么?
如果你不需要拖拽效果 当然一个就可以,,如果你要达到这种效果,,你肯定要借助控件
当然你可以选择 DataGridView 也可以选 Lable 看你想怎么用了  反正做法都一样

你如果不加控件 还想实现拖拽效果
我目前能想到的就是 你在用 .netFrameWork 3.0  用 WPF Canvas类自己去画一个出来!
你不想加控件在 .net 2.0里 实现字符跟着鼠标走?

#19


如果你真的想 不加空间就实现字符跟着鼠标走,,在.net 2.0里
可能我知道的太少了吧,,我是没办法实现

#20


引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?

#21


引用 20 楼 qiuxin425 的回复:
引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


他想就一个DataGridView 实现拖拽效果

#22


引用 9 楼 chenchenyangll 的回复:
关于第三步 怎样在知道坐标的情况下知道下标呢?

int ida = dgv1.CurrentCell.RowIndex;
int idb = dgv1.CurrentCell.ColumnIndex;

#23


引用 20 楼 qiuxin425 的回复:
引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来  拖拽已经可以了

#24


引用 23 楼 chenchenyangll 的回复:
引用 20 楼 qiuxin425 的回复:

引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来 拖拽已经可以了


Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
  r = this.dgv1.RectangleToScreen(r);
  this.TextBox1.Location = this.tabPage4.RectangleToClient(r).Location;
  this.TextBox1.Size = r.Size;
  this.TextBox1.Visible = true;

#25


TextBox1.BringToFront();

加上这两句

#26


引用 23 楼 chenchenyangll 的回复:
引用 20 楼 qiuxin425 的回复:

引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来 拖拽已经可以了



给你代码你不按着做  你不想加DataGridView 把 DataGridView 换成 TextBox不就完了

服了

#27


引用 26 楼 dodducs 的回复:
引用 23 楼 chenchenyangll 的回复:
引用 20 楼 qiuxin425 的回复:

引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来 拖拽已经可以了



给你代码你不按着做  你不想加DataGridView 把 DataGridView 换成 TextBox不就完了

……


我本来就加的是TextBox 我就不明白为什么一定要DataGridView

还有 即便你是对的 我也没有必要一定照着你的做  收起你狂妄的口气 谢谢

#28


引用 25 楼 qiuxin425 的回复:
TextBox1.BringToFront();

加上这两句


貌似还是不行
我的DataGridView是放在一个TabPage中的  会不会是因为TabPage把它遮住了?

#29


引用 28 楼 chenchenyangll 的回复:
引用 25 楼 qiuxin425 的回复:

TextBox1.BringToFront();

加上这两句


貌似还是不行
我的DataGridView是放在一个TabPage中的 会不会是因为TabPage把它遮住了?


应该不会,你把TextBox也放在这个TabPage中,在初始化时把它隐藏。应该会显示的。

#30


引用 29 楼 qiuxin425 的回复:
引用 28 楼 chenchenyangll 的回复:
引用 25 楼 qiuxin425 的回复:

TextBox1.BringToFront();

加上这两句


貌似还是不行
我的DataGridView是放在一个TabPage中的 会不会是因为TabPage把它遮住了?


应该不会,你把TextBox也放在这个TabPage中,在初始化时把它隐藏。应该会显示……


现在已经出现那个TextBox了  但是位置不对   MouseMove事件里 TextBox的位置具体该怎么写啊?

#31


你的TextBox是只能在DataGridView控件上移动么?

就是这个控件DataGridView的MouseMove


我也去试试看

#32


引用 31 楼 qiuxin425 的回复:
你的TextBox是只能在DataGridView控件上移动么?

就是这个控件DataGridView的MouseMove


我也去试试看


恩 就是单纯的坐标不正确 其他都可以了

#33


我用textBox1.Location = e.Location

感觉位置上有点偏差

#34


我搞出来了   要将TextBox的Parent设成DataGridView  这样就可以了

#35


引用 34 楼 chenchenyangll 的回复:
我搞出来了 要将TextBox的Parent设成DataGridView 这样就可以了


hehe

#36


谢谢啦~ 结贴

#37


樓主認定TextBox了 把TextBox替換成單行的dataGridView 效果不是更好嗎?

#1


只是交换内容好做。实现这种拖拽效果有点难

#2


交换内容的话该怎么写? 

#3


学习围观

#4


帮顶 等高人.

#5


用一个TextBox控件,当你点击单元格时,TextBox覆盖它取得值并随着鼠标移动,移动的位置,把后面单元格的数值给前面那个,再把TextBox里面的内容替换就行了。

#6


LS给些代码之类的  或者说 要写哪个事件?

#7


1. 在DataGridView控件的CellEnter事件中当点击某个单元格时,把TextBox置顶只读,取得DataGridView的值给TextBox。
                Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                r = this.dgv1.RectangleToScreen(r);
                this.TextBox1.Location = this.tabPage4.RectangleToClient(r).Location;
                this.TextBox1.Size = r.Size;
2. 然后执行MouseMove事件,移动TextBox
3. 响应MouseUp事件,得到鼠标抬起位置(相对于DataGridView),将DataGridView的单元格数据取出来给前面那个,再把TextBox给这个单元格,隐藏TextBox控件。

#8


引用 7 楼 qiuxin425 的回复:
1. 在DataGridView控件的CellEnter事件中当点击某个单元格时,把TextBox置顶只读,取得DataGridView的值给TextBox。
                Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                r =……


好 我去试试 有结果了再来~

#9


关于第三步  怎样在知道坐标的情况下知道下标呢?

#10


#11


用第三方控件DevExpress

#12


引用 7 楼 qiuxin425 的回复:
1. 在DataGridView控件的CellEnter事件中当点击某个单元格时,把TextBox置顶只读,取得DataGridView的值给TextBox。
                Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                r =……


谢谢,基本的拖拽已经做好了  现在就是实现那种拖拽效果了。。
不知道为什么显示不出   如果显示文字内容比较复杂的话    显示一个框表示这是拖拽操作也行- -

#13


http://blog.csdn.net/dodducs/archive/2010/07/22/5755235.aspx


鄙人曾写过一个关于整行数据进行替换的小DEMO 但是没有加过边界安全设置等
你只要加上边界  把里面整行数据替换成只替换某一列就可以了

#14


你要的实现画面呈现拖拽效果 在
private void dataGridView1_CellMouseDown_1(object sender, DataGridViewCellMouseEventArgs e) 

这个方法里就是代码

#15


不行啊 显示不出来

#16


你是不是没有增加一个新的 DataGidView?

你新建一个项目DEMO  把我的代码扔里边跑一下 了解一下程序思路
不可能跑不出来

#17


我不需要新增一个DataGridView啊
我只有一个DataGridView 在表里拖拽

#18


你觉得可能么?
如果你不需要拖拽效果 当然一个就可以,,如果你要达到这种效果,,你肯定要借助控件
当然你可以选择 DataGridView 也可以选 Lable 看你想怎么用了  反正做法都一样

你如果不加控件 还想实现拖拽效果
我目前能想到的就是 你在用 .netFrameWork 3.0  用 WPF Canvas类自己去画一个出来!
你不想加控件在 .net 2.0里 实现字符跟着鼠标走?

#19


如果你真的想 不加空间就实现字符跟着鼠标走,,在.net 2.0里
可能我知道的太少了吧,,我是没办法实现

#20


引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?

#21


引用 20 楼 qiuxin425 的回复:
引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


他想就一个DataGridView 实现拖拽效果

#22


引用 9 楼 chenchenyangll 的回复:
关于第三步 怎样在知道坐标的情况下知道下标呢?

int ida = dgv1.CurrentCell.RowIndex;
int idb = dgv1.CurrentCell.ColumnIndex;

#23


引用 20 楼 qiuxin425 的回复:
引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来  拖拽已经可以了

#24


引用 23 楼 chenchenyangll 的回复:
引用 20 楼 qiuxin425 的回复:

引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来 拖拽已经可以了


Rectangle r = this.dgv1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
  r = this.dgv1.RectangleToScreen(r);
  this.TextBox1.Location = this.tabPage4.RectangleToClient(r).Location;
  this.TextBox1.Size = r.Size;
  this.TextBox1.Visible = true;

#25


TextBox1.BringToFront();

加上这两句

#26


引用 23 楼 chenchenyangll 的回复:
引用 20 楼 qiuxin425 的回复:

引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来 拖拽已经可以了



给你代码你不按着做  你不想加DataGridView 把 DataGridView 换成 TextBox不就完了

服了

#27


引用 26 楼 dodducs 的回复:
引用 23 楼 chenchenyangll 的回复:
引用 20 楼 qiuxin425 的回复:

引用 15 楼 chenchenyangll 的回复:
不行啊 显示不出来

现在有什么问题?


TextBox显示不出来 拖拽已经可以了



给你代码你不按着做  你不想加DataGridView 把 DataGridView 换成 TextBox不就完了

……


我本来就加的是TextBox 我就不明白为什么一定要DataGridView

还有 即便你是对的 我也没有必要一定照着你的做  收起你狂妄的口气 谢谢

#28


引用 25 楼 qiuxin425 的回复:
TextBox1.BringToFront();

加上这两句


貌似还是不行
我的DataGridView是放在一个TabPage中的  会不会是因为TabPage把它遮住了?

#29


引用 28 楼 chenchenyangll 的回复:
引用 25 楼 qiuxin425 的回复:

TextBox1.BringToFront();

加上这两句


貌似还是不行
我的DataGridView是放在一个TabPage中的 会不会是因为TabPage把它遮住了?


应该不会,你把TextBox也放在这个TabPage中,在初始化时把它隐藏。应该会显示的。

#30


引用 29 楼 qiuxin425 的回复:
引用 28 楼 chenchenyangll 的回复:
引用 25 楼 qiuxin425 的回复:

TextBox1.BringToFront();

加上这两句


貌似还是不行
我的DataGridView是放在一个TabPage中的 会不会是因为TabPage把它遮住了?


应该不会,你把TextBox也放在这个TabPage中,在初始化时把它隐藏。应该会显示……


现在已经出现那个TextBox了  但是位置不对   MouseMove事件里 TextBox的位置具体该怎么写啊?

#31


你的TextBox是只能在DataGridView控件上移动么?

就是这个控件DataGridView的MouseMove


我也去试试看

#32


引用 31 楼 qiuxin425 的回复:
你的TextBox是只能在DataGridView控件上移动么?

就是这个控件DataGridView的MouseMove


我也去试试看


恩 就是单纯的坐标不正确 其他都可以了

#33


我用textBox1.Location = e.Location

感觉位置上有点偏差

#34


我搞出来了   要将TextBox的Parent设成DataGridView  这样就可以了

#35


引用 34 楼 chenchenyangll 的回复:
我搞出来了 要将TextBox的Parent设成DataGridView 这样就可以了


hehe

#36


谢谢啦~ 结贴

#37


樓主認定TextBox了 把TextBox替換成單行的dataGridView 效果不是更好嗎?