Dev GridView行拖拽
http://blog.csdn.net/keyrainie/article/details/8513802
http://www.cnblogs.com/qq4004229/archive/2012/05/28/2521611.html
http://www.cnblogs.com/zeroone/p/4176887.html
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
namespace DevGridViewDragDropTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SetDtSource();
GridViewInit();
BindGrid();
}
//鼠标坐标
private GridHitInfo downHitInfo; //鼠标左键按下去时在GridView中的坐标
private GridHitInfo upHitInfo; //鼠标左键弹起来时在GridView中的坐标
private int startRow; // 拖拽的第一行
private int[] rows; //拖拽的所有行
//数据源
DataTable dtSource;
private void SetDtSource()
{
dtSource = new DataTable();
dtSource.Columns.Add("id", typeof(int));
dtSource.Columns.Add("name", typeof(string));
dtSource.Columns.Add("age", typeof(int));
dtSource.Columns.Add("add", typeof(string));
DataRow dr;
for (int i = 0; i < 20; i++)
{
dr = dtSource.NewRow();
dr["id"] = i;
if (i % 2 == 1)
{
dr["name"] = "小张" + i;
dr["age"] = 20 + i;
}
else
{
dr["name"] = "老李" + i;
dr["age"] = 10 + i;
}
dr["add"] = "陕西省西安市第" + i + "大道";
dtSource.Rows.Add(dr);
}
}
private void GridViewInit()
{
gridControl1.AllowDrop = true; // 确保能够拖拽
gridView1.OptionsSelection.MultiSelect = true; //确保能够多选
gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //确保选定行的背景色一样
gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //确保选定行的背景色一样。
gridView1.OptionsBehavior.Editable = false;
}
private void BindGrid()
{
gridControl1.DataSource = dtSource;
}
//鼠标按下事件
private void gridView1_MouseDown(object sender, MouseEventArgs e)
{
downHitInfo = gridView1.CalcHitInfo(new Point(e.X, e.Y)); //鼠标左键按下去时在GridView中的坐标
}
//鼠标移动事件
private void gridView1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return; //不是左键则无效
if (downHitInfo == null || downHitInfo.RowHandle < 0) return; //判断鼠标的位置是否有效
rows = gridView1.GetSelectedRows(); //获取所选行的index
startRow = rows.Length == 0 ? -1 : rows[0];
DataTable dt = dtSource.Clone();
foreach (int r in rows) // 根据所选行的index进行取值,去除所选的行数据,可能是选取的多行
{
int dataSourcerows = gridView1.GetDataSourceRowIndex(r); //获取行数据
dt.ImportRow(dtSource.Rows[dataSourcerows]); //保存所选取的行数据
}
gridControl1.DoDragDrop(dt, DragDropEffects.Move);//开始拖放操作,将拖拽的数据存储起来
}
//拖拽过程事件
private void gridControl1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
//拖拽完成后事件
private void gridControl1_DragDrop(object sender, DragEventArgs e)
{
Point gridviewPoint = this.PointToScreen(this.gridControl1.Location); //获取鼠标在屏幕上的位置。
upHitInfo = gridView1.CalcHitInfo(new Point(e.X - gridviewPoint.X, e.Y - gridviewPoint.Y)); //鼠标左键弹起来时在GridView中的坐标(屏幕位置减去 gridView 开始位置)
if (upHitInfo == null || upHitInfo.RowHandle < 0) return;
int endRow = gridView1.GetDataSourceRowIndex(gridView1.GetDataSourceRowIndex(upHitInfo.RowHandle)); //获取拖拽的目标行index
DataTable dt = e.Data.GetData(typeof(DataTable)) as DataTable; //获取要移动的数据,从拖拽保存的地方:(gridControl1.DoDragDrop(dt, DragDropEffects.Move); )
if (dt != null && dt.Rows.Count > 0) //拖拽的数据为空
{
int a;
DataRow xs = dtSource.Rows[endRow]; //获取拖拽的目标行,准备进行移植
if (!rows.Contains(endRow)) //如果多选的话,确保不能拖拽到这几个里
{
gridView1.ClearSelection(); //从GirdView中删除所拖拽的数据
int moveValue = 0;
foreach (int i in rows)
{
dtSource.Rows.Remove(dtSource.Rows[i - moveValue]); //从GirdView的数据源中删除所拖拽的数据
moveValue++;
}
if (startRow > endRow)
a = dtSource.Rows.IndexOf(xs); //若果往上托,则加在鼠标到达行的上面
else
a = dtSource.Rows.IndexOf(xs) + 1; //如果往下拖,则加在鼠标到达行的下面
int j = 0;
DataRow drTemp;
foreach (DataRow dr in dt.Rows)
{
drTemp = dtSource.NewRow();
foreach (DataColumn dc in dr.Table.Columns)
{
drTemp[dc.ColumnName] = dr[dc.ColumnName];
}
dtSource.Rows.InsertAt(drTemp, a + j); //将拖拽的数据再次添加进来
gridView1.SelectRow(a + j);
j++;
}
gridView1.FocusedRowHandle = a;
}
gridControl1.DataSource = dtSource; //重新绑定
gridView1.RefreshData();
}
}
}
}
Dev GridView行拖拽的更多相关文章
- dev GridControl实现拖拽
一.示例说明 以gridControl1和gridControl2为例,从gridControl1拖拽行到gridControl2中去. 二.属性设置 gridControl2.AllowDrop = ...
- GridView实现拖拽排序以及数据交互
在研究项目中的一个效果的时候,查找资料过程中发现有人有这么一种需求,就是GridView在实现拖拽排序的基础上,如果是两个GridView之间实现拖拽效果,并要实现数据交互. 一.效果图: 实现这个效 ...
- JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)
前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...
- Jquery easyui treegrid实现树形表格的行拖拽
前几天修改了系统的一个功能——实现树形列列表的行拖拽,以达到排序的目的.现在基本上功能实现,现做一个简单的总结. 1.拿到这个直接网上搜,有好多,但是看了后都觉得不是太复杂就是些不是特别想看的例子,自 ...
- jqGrid之treeGrid及行拖拽
单纯的做个小记录 今天做功能用到了jqGrid里面的treeGrid,遇到几个问题,这里做下记录 treeGrid 树表格的应用在官网给出了很直白的例子: 1.http://blog.mn886.ne ...
- devpress 的gridview 控件的行拖拽 z
首先,添加引用:using DevExpress.XtraGrid.Views.Grid.ViewInfo; gridControl1.AllowDrop = true; ...
- JS组件系列——Bootstrap Table 表格行拖拽
前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...
- ListView 多行拖拽排序
核心代码:修改ListView的属性,及绑定事件 // 初始化listView1. private void InitializeListView() { listView1.AllowDrop = ...
- table行拖拽
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- MyBatis Cache配置
@(MyBatis)[Cache] MyBatis Cache配置 MyBatis提供了一级缓存和二级缓存 配置 全局配置 配置 说明 默认值 可选值 cacheEnabled 全局缓存的开关 tru ...
- Java多线程 3 线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- vtkBoxWidget2Example
This example uses a vtkBoxWidget2 to manipulate an actor. The widget only contains the interaction l ...
- Excel——使用OFFSET、MATCH、COUNTA实现二级菜单
如图所示,接下来提供两种办法实现: 1.将A.B.C.D定义为名称NAME. 2.设置一级菜单单元格数据有效性为NAME. 3.设置二级菜单格数据有效为: =OFFSET($A$1,MATCH($A6 ...
- XSS(跨站脚本攻击)的最全总结
从OWASP的官网意译过来,加上自己的理解,算是比较全面的介绍.有兴趣的可私下交流. XSS 跨站脚本攻击 ============================================== ...
- REDHAT一总复习1 禁用颜色
使用man page 研究如何在输出中禁用颜色.将ls命令的相关选项放到server上的文本文件 /home/student/lscolor.txt中. 1. 在ls(l) man page中查询相关 ...
- 【学习笔记】load-on-startup Servlet
创建Servlet实例有两个时机:用户请求之时和应用启动之时.应用启动之时创建的通常用于某些后台服务的Servlet.配置load-on-startup的Servlet有两种方式: 在web.xml文 ...
- javascript实用技巧、javascript高级技巧
字号+作者:H5之家 来源:H5之家 2016-10-31 11:00 我要评论( ) 三零网提供网络编程. JavaScript 的技术文章javascript实用技巧.javascript高级技巧 ...
- Java实现比较版本号
涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法: 这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使 ...