社区
C#
帖子详情
在winform程序之中,如何制作列表的行可以拖动排序啊?
asimplefire
2010-11-16 10:52:42
在winform里,如何用DataGridView来显示数据列表,然后需要用鼠标拖动表行来排序,这种功能如何实现啊?
哪位大侠做过类似的功能呢?
...全文
344
2
打赏
收藏
在winform程序之中,如何制作列表的行可以拖动排序啊?
在winform里,如何用DataGridView来显示数据列表,然后需要用鼠标拖动表行来排序,这种功能如何实现啊? 哪位大侠做过类似的功能呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gxingmin
2010-11-16
打赏
举报
回复
给你个思路,datagridview绑定的数据源datatable增加一个排序的列id,此列隐藏
datagridview按id排序
在datagridview拖拽事件里获取这两个交互行的id,然后根据这两个id所在的行交换datatable其他列的数据(这两行的id别交换)
冯博1254
2010-11-16
打赏
举报
回复
也就是鼠标按下的时候记下点中了哪行
鼠标抬起的时候再判断出抬起的行,交换就可以了
private void dataGridView_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
if ((e.Clicks < 2) && (e.Button==MouseButtons.Left))
{
if ((e.ColumnIndex ==-1) && (e.RowIndex > -1))
dataGridView.DoDragDrop(dataGridView.Rows[e.RowIndex], DragDropEffects.Move);
}
}
鼠标在单元格里移动时激活拖放功能,我这里判断了如果是只有单击才执行拖放,双击我要执行其他功能,而且只有点在每行的表头那一格拖动才行,否则会影响编辑其他单元格的值。如果希望点在任何一个单元格都可以拖动,去掉判断列序号的条件就行了。
private void dataGridView_DragDrop(object sender, DragEventArgs e)
{
int idx = GetRowFromPoint(e.X, e.Y);
if (idx < 0) return;
if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
{
DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
dataGridView.Rows.Remove(row);
dataGridView.Rows.Insert(idx,row);
selectionIdx=idx;
}
}
拖动到目的地后的操作,GetRowFromPoint是根据鼠标按键被释放时的鼠标位置计算行序号。
private int GetRowFromPoint(int x, int y)
{
for (int i = 0; i < dataGridView.RowCount; i++)
{
Rectangle rec = dataGridView.GetRowDisplayRectangle(i, false);
if (dataGridView.RectangleToScreen(rec).Contains(x, y))
return i;
}
return -1;
}
到这里基本功能其实已经完成。只是有些细节需要调整。一般我们希望拖动完成后被选中的行是刚才拖动的那一行,但是DataGridView会自动选中顶替我们拖动的那一行位置的新行,也就是说,比如我们拖动第3行到其他位置,结束后,被选中的行仍然是新的第3行。在DragDrop方法里设置也没有用,DataGridView选中新行的行为是在DragDrop结束后。所以我们必须自己记录选中行的行号。在类中添加一个字段selectionIdx。
private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex>=0)
selectionIdx = e.RowIndex;
}
注意DragDrop方法最后,selectionIdx被赋值为拖动行的新行号。
private void dataGridView_SelectionChanged(object sender, EventArgs e)
{
if ((dataGridView.Rows.Count > 0) && (dataGridView.SelectedRows.Count>0) && (dataGridView.SelectedRows[0].Index != selectionIdx))
{
if (dataGridView.Rows.Count <= selectionIdx)
selectionIdx = dataGridView.Rows.Count - 1;
dataGridView.Rows[selectionIdx].Selected = true;
dataGridView.CurrentCell = dataGridView.Rows[selectionIdx].Cells[0];
}
}
在这里判断,如果selectionIdx的值和当前选中的行号不同,则选中行号为selectionIdx的这一行。
private void dataGridView_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
这个方法设置在DataGridView里拖动时,鼠标不会显示禁止拖放的光标。
DataGridView
行
拖动
特效实现与优化
是 Windows Forms 应用
程序
中最为常用的数据展示控件之一,它提供了强大的表格数据展示与交互能力。通过该控件,开发者可以轻松实现数据绑定、
行
/列操作、
排序
、筛选以及用户自定义编辑等功能。在结构上,DataGridView 由多个核心组件构成,包括:列(Column):定义数据字段的显示格式与
行
为;
行
(Row):承载数据记录的单元;单元格(Cell):数据展示与编辑的最小单位;数据源(DataSource)
实现
WinForm
中ListBox控件的拖拽
排序
功能
C#
WinForm
s,作为.NET Framework的一部分,是开发Windows窗体应用
程序
的一个强大平台。它允许开发者使用可视化的拖放方法快速构建桌面应用
程序
。
WinForm
s以其丰富的控件库、事件驱动的模型和对面向对象编程的支持而广受欢迎,成为许多企业级应用和工具的首选。ListBox控件是
WinForm
s中最常用的控件之一,它允许用户从
列表
中选择一个或多个选项。与ComboBox控件相比,ListBox更适合于选项较多的场景。它提供了基本的属性和事件,使得开发者可以实现复杂的用户交互逻辑。
C#学习
WinForm
ListView实现
拖动
更换项的位置
C#
WinForm
ListView实现
拖动
更换项的位置
c#
WinForm
实现窗体上控件的自由
拖动
说明:首先在窗体上放一个PictrueBox控件,命名为pb1,
拖动
完整代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.T
delphi listview 添加数据 慢_DragListView – 实现在ListView控件中拖拽(
拖动
)
列表
项(
行
)...
很久没有写过
WinForm
的
程序
了,这几天整理了下以前写过的几个控件,发现一些比较有用的扩展。今天介绍一个自定义控件DragListView,可以拖拽其中的
行
,移动它们的位置,从而重新
排序
。这个控件适用于使用Details视图显示项的情况。原理:继承ListView,当点击选中一个
列表
项时,
拖动
鼠标时,释放鼠标时,重写相关拖拽方法,实现
拖动
效果,将选中的
列表
项插入到拖拽位置。
拖动
鼠标的过程中,通过...
C#
111,129
社区成员
642,535
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章