C#开发学习笔记:C#中实现两个GridControl之间的数据拖拽以及同一个GridControl中的数据行上下移动
2017-09-27 12:10
1046 查看
1.两个控件之间的拖拽
(1).拖拽发起方控件使用MouseDown事件获取需要拖拽的数据行的索引
注:如果需要拖拽多行,则可以在此步获取鼠标选中范围时点击的起始数据行和结束数据行的索引
(2).拖拽发起方控件使用MouseMove事件获取需要拖拽的数据行
(3).设置目的控件的拖拽操作方式
(4).拖拽完成,目的控件执行DragDrop事件
2.一个GridControl中的数据行上下移动
(1),(2),(3)步同上,只是调用对应的事件的控件为当前的控件
(4).执行DragDrop事件
注:使用Control.MousePosition获取鼠标标相对于屏幕的坐标时,在调试状态下Control.MousePosition也会随着鼠标的移动而改变,因此调试时
为了使鼠标的屏幕坐标使用控件的PointToClient()方法转换为其相对于控件的坐标时正确,需要注意断点要打在转换之后
(1).拖拽发起方控件使用MouseDown事件获取需要拖拽的数据行的索引
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo GridHitInfo_temp = null; private void tRC01GridControl_MouseDown(object sender, MouseEventArgs e) {
//获取鼠标当前所在坐标点的信息(该点相对于控件的坐标系) DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo GridHitInfo = this.gridView3.CalcHitInfo(new Point(e.X, e.Y)); //获取鼠标当前所在坐标的对应的数据行索引 int MouseRowHandle = GridHitInfo.RowHandle; //如果索引大于0同时鼠标点击的是左键 if (MouseRowHandle >= 0 && e.Button == MouseButtons.Left) { GridHitInfo_temp = GridHitInfo; }
}
注:如果需要拖拽多行,则可以在此步获取鼠标选中范围时点击的起始数据行和结束数据行的索引
(2).拖拽发起方控件使用MouseMove事件获取需要拖拽的数据行
private void tRC01GridControl_MouseMove(object sender, MouseEventArgs e) { if (GridHitInfo_temp == null) return; if (e.Button != MouseButtons.Left) return; //通过鼠标按下时获取的数据行索引获取数据 DataRow data = gridView3.GetDataRow(GridHitInfo_temp.RowHandle); int[] rows = gridView3.GetSelectedRows();//获取当前选中的数据行的索引 //定义一个泛型集合存储拖拽的数据 List<DataRow> row = new List<DataRow>(); for (int i = 0; i < rows.Length; i++) row.Add(gridView3.GetDataRow((int)rows[i])); //拖拽发起方控件开始执行拖拽操作,拖拽操作的类型为Copy(复制) tRC01GridControl.DoDragDrop(row, DragDropEffects.Copy); }注:如果是拖拽多行,则使用SelectRange(int startRowHandle,int endRowHandle);其中两个参数则使用第一步获取到的起始与结束行索引
(3).设置目的控件的拖拽操作方式
private void tRC02GridControl_DragEnter(object sender, DragEventArgs e) { //根据拖拽事件发起方所允许的拖放操作设置目的方的拖拽操作类型 if (e.AllowedEffect==DragDropEffects.Move) e.Effect = DragDropEffects.Move; else e.Effect = DragDropEffects.Copy; }
(4).拖拽完成,目的控件执行DragDrop事件
private void tRC02GridControl_DragDrop(object sender, DragEventArgs e) { GridControl grid = sender as GridControl;//将拖拽事件的触发对象(目的方)转为控件 DataTable table = grid.DataSource as DataTable;//获取拖拽目的方的数据源 //获取拖拽的源数据(在调用DoDragDrop()方法时传入)同时转换为传入的类型 List<DataRow> row = e.Data.GetData(typeof(List<DataRow>)) as List<DataRow>; if (row != null && table != null) { if (row.Count > 0) { //判断当前拖拽操作的方式 if (e.Effect != DragDropEffects.Move) { for (int i = 0; i < row.Count; i++) { row[i]["Selection"] = "True"; table.ImportRow(row[i]); row[i].Delete(); // 把原有的数据行删除(会在数据行的父表中删除)。 } } } } }
2.一个GridControl中的数据行上下移动
(1),(2),(3)步同上,只是调用对应的事件的控件为当前的控件
(4).执行DragDrop事件
private void tRC02GridControl_DragDrop(object sender, DragEventArgs e) { GridControl grid = sender as GridControl;//将拖拽事件的触发对象(目的方)转为控件 //获取目的方控件的默认GridView DevExpress.XtraGrid.Views.Grid.GridView gridView = grid.DefaultView as DevExpress.XtraGrid.Views.Grid.GridView; DataTable table = grid.DataSource as DataTable;//获取拖拽目的方的数据源 //根据鼠标在目的方的坐标获取对应的信息 //该坐标是根据鼠标相对于的屏幕的位置(Control.MousePosition)使用控件的PointToClient()方法转换; //如果需要调试需要注意Control.MousePosition的坐标在调试状态下也会更改,因此调试时需要将断点设置在Control.MousePosition //转换为Point对象之后才能保证转换出来的鼠标相对于控件工作区域的坐标正确 DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo GridHitInfo = gridView.CalcHitInfo(grid.PointToClient(Control.MousePosition)); //获取拖拽的源数据(在调用DoDragDrop()方法时传入)同时转换为传入的类型 List<DataRow> row = e.Data.GetData(typeof(List<DataRow>)) as List<DataRow>; if (row != null && table != null) { if (row.Count > 0) { //判断当前拖拽操作的方式 if (e.Effect == DragDropEffects.Move) { for (int i = 0; i < row.Count; i++) { if (GridHitInfo.RowHandle >= 0) { /根据鼠标转换坐标之后计算出来其相对目的控件的坐标点所在行的索引新增一条空行 table.Rows.InsertAt(table.NewRow(), GridHitInfo.RowHandle); //将拖拽的数据行的信息赋值到新增的空行中 table.Rows[GridHitInfo.RowHandle].ItemArray = row[i].ItemArray; } else { table.Rows.Add(); table.Rows[table.Rows.Count-1].ItemArray = row[i].ItemArray; } row[i].Delete();//删除原来的数据行(该行所在父表中删除) table.AcceptChanges();//提交表所有的更改 } } } } }
注:使用Control.MousePosition获取鼠标标相对于屏幕的坐标时,在调试状态下Control.MousePosition也会随着鼠标的移动而改变,因此调试时
为了使鼠标的屏幕坐标使用控件的PointToClient()方法转换为其相对于控件的坐标时正确,需要注意断点要打在转换之后
相关文章推荐
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- (ios开发学习笔记三)两个窗体之间跳转,实现多窗体
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 转载---使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- WinCE5.0移动平台开发笔记(Appdomain之间共享数据变量)
- android开发学习笔记(9)Intent之在两个Activity之间切换
- 黑马程序员之C#编程基础学习笔记:用while continue实现计算1到100之间的除了能被7整除之外所有整数的和。
- 如果在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- [转]如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 如果在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 学习笔记:使用Web Service Software Factory开发简易留言本服务以及Mobile调用实现-1.创建Service