• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#实现Dev Grid拖拽移动行的方法

C#实现Dev Grid拖拽移动行的方法

作者:新新人类 字体:[增加 减小] 来源:互联网 时间:2017-05-28

新新人类 通过本文主要向大家介绍了dev grid,dev grid 行颜色,dev gridlookupedit,dev gridcolumn,c#dev等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了C#实现Dev Grid拖拽移动行的方法。分享给大家供大家参考。具体如下:

完整实例代码点击此处本站下载。
   
拖拽时带行截图效果

实现代码如下:

/// <summary>
/// 拖拽帮助类
/// </summary>
public static class DragHelper
{
  /// <summary>
  /// BandedGridView 拖拽
  /// </summary>
  /// <param name="gvMain"></param>
  public static void DragGridRow<T>(this BandedGridView gvMain)
  {
   // 拖拽遮罩控件
   DragMaster dragMaster = new DragMaster();
   // 当前拖拽行绘画区域
   Rectangle _DragRowRect = Rectangle.Empty;
   GridControl gcMain = gvMain.GridControl;
   GridHitInfo _DownHitInfo = null;
   //表格属性 允许拖拽
   gcMain.AllowDrop = true;
   gvMain.OptionsDetail.EnableMasterViewMode = false;
   #region 将对象拖至边界时发生 DragOver
   gcMain.DragOver += delegate(object sender, System.Windows.Forms.DragEventArgs e)
   {
    if (e.Data.GetDataPresent(typeof(T)))
     e.Effect = DragDropEffects.Move;
    else
     e.Effect = DragDropEffects.None;
   };
   #endregion
   #region 拖拽完成时处理数据 DragDrop
   gcMain.DragDrop += delegate(object sender, System.Windows.Forms.DragEventArgs e)
   {
    // 拖过来的新数据
    T newRow = (T)e.Data.GetData(typeof(T));
    // 原来在此坐标的数据
    // e的坐标是相对于屏幕的
    var clientPoint = gcMain.PointToClient(new Point(e.X, e.Y));
    GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(clientPoint.X, clientPoint.Y));
    var oldRow = (T)gvMain.GetRow(hitInfo.RowHandle);
    // 如果相等则不处理
    if (oldRow == null || newRow == null) return;
    // 且目标位置不是最后一行的话要将所有序号重排
    // 原来的行号
    var oldIndex = _DownHitInfo.RowHandle;
    // 新的行号
    var newIndex = hitInfo.RowHandle;
    BindingSource bs = (BindingSource)(gcMain.DataSource);
    if (bs == null)
     return;
    bs.RemoveAt(oldIndex);
    bs.Insert(oldIndex, oldRow);
    bs.RemoveAt(newIndex);
    bs.Insert(newIndex, newRow);
    bs.ResetBindings(false);
   };
   #endregion
   #region 鼠标按下 MouseDown
   gcMain.MouseDown += delegate(object sender, MouseEventArgs e)
   {
    _DownHitInfo = null;
    GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(e.X, e.Y));
    if (Control.ModifierKeys != Keys.None) return;
    if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0)
    {
     // 禁用的Grid不支持拖拽
     if (!gvMain.OptionsBehavior.Editable
      || gvMain.OptionsBehavior.ReadOnly)
      return;
     // 只有点击最前面才能拖拽
     if (hitInfo.InRowCell)
      return;
     // 缓存
     _DownHitInfo = hitInfo;
    }
   };
   #endregion
   #region 鼠标移动 MouseMove
   gcMain.MouseMove += delegate(object sender, MouseEventArgs e)
   {
    if (e.Button == MouseButtons.Left)
    {
     if (_DownHitInfo != null)
     {
      Size dragSize = SystemInformation.DragSize;
      // 偏离区域
      Rectangle dragRect = new Rectangle(new Point(_DownHitInfo.HitPoint.X - dragSize.Width / 2, _DownHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
      if (!dragRect.Contains(new Point(e.X, e.Y)))
      {
       // 屏幕坐标
       var p = gcMain.PointToScreen(e.Location);
       // 刷新是必须要的
       gcMain.Refresh();
       // 获取当前行截图
       var bmp = GetDragRowImage(gcMain, _DownHitInfo, _DragRowRect);
       Point offSetPoint = new Point(p.X + 1, p.Y - dragMaster.DragSize.Height / 2);
       // 开始显示拖拽遮罩
       dragMaster.StartDrag(bmp, offSetPoint, DragDropEffects.Move);
       // 获取要拖拽的数据
       object row = gvMain.GetRow(_DownHitInfo.RowHandle);
       // 开始拖拽
       gcMain.DoDragDrop(row, DragDropEffects.Move);
       // 取消事件
       DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
       // 清空缓存
       _DownHitInfo = null;
      }
     }
    }
   };
   #endregion
   #region 在用鼠标拖动某项时发生,是否允许继续拖放 QueryContinueDrag
   gcMain.QueryContinueDrag += delegate(object sender, QueryContinueDragEventArgs e)
   {
    switch (e.Action)
    {
     case DragAction.Continue:
      // 移动遮罩
      Point offSetPoint = new Point(Cursor.Position.X + 1, Cursor.Position.Y - dragMaster.DragSize.Height / 2);
      dragMaster.DoDrag(offSetPoint, DragDropEffects.Move, false);
      break;
     default:
      // 清空
      _DragRowRect = Rectangle.Empty;
      // 停止拖动
      dragMaster.EndDrag();
      break;
    }
   };
   #endregion
   #region 点击行头移动行
   gvMain.CustomDrawRowIndicator += delegate(object sender, RowIndicatorCustomDrawEventArgs e)
   {
    if (_DragRowRect == Rectangle.Empty && _DownHitInfo != null && _DownHitInfo.RowHandle == e.RowHandle)
    {
     _DragRowRect = e.Bounds;
    }
   };
   #endregion
  }
  /// <summary>
  /// GridView 拖拽
  /// </summary>
  /// <param name="gvMain"></param>
  public static void DragGridRow<T>(this GridView gvMain)
  {
   // 拖拽遮罩控件
   DragMaster dragMaster = new DragMaster();
   // 当前拖拽行绘画区域
   Rectangle _DragRowRect = Rectangle.Empty;
   GridControl gcMain = gvMain.GridControl;
   GridHitInfo _DownHitInfo = null;
   //表格属性 允许拖拽
   gcMain.AllowDrop = true;
   gvMain.OptionsDetail.EnableMasterViewMode = false;
   #region 将对象拖至边界时发生 DragOver
   gcMain.DragOver += delegate(object sender, System.Windows.Forms.DragEventArgs e)
   {
    if (e.Data.GetDataPresent(typeof(T)))
     e.Effect = DragDropEffects.Move;
    else
     e.Effect = DragDropEffects.None;
   };
   #endregion
   #region 拖拽完成时处理数据 DragDrop
   gcMain.DragDrop += delegate(object sender, System.Windows.Forms.DragEventArgs e)
   {
    // 拖过来的新数据
    T newRow = (T)e.Data.GetData(typeof(T));
    // 原来在此坐标的数据
    // e的坐标是相对于屏幕的
    var clientPoint = gcMain.PointToClient(new Point(e.X, e.Y));
    GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(clientPoint.X, clientPoint.Y));
    var oldRow = (T)gvMain.GetRow(hitInfo.RowHandle);
    // 如果相等则不处理
    if (oldRow == null || newRow == null) return;
    // 且目标位置不是最后一行的话要将所有序号重排
    // 原来的行号
    var oldIndex = _DownHitInfo.RowHandle;
    // 新的行号
    var newIndex = hitInfo.RowHandle;
      BindingSource bs = (BindingSource)(gcMain.DataSource);
    if (bs == null)
     return;
      bs.RemoveAt(oldIndex);
    bs.Insert(oldIndex, oldRow);
    bs.RemoveAt(newIndex);
    bs.Insert(newIndex, newRow);
    bs.ResetBindings(false);
   };
   #endregion
   #region 鼠标按下 MouseDown
   gcMain.MouseDown += delegate(object sender, MouseEventArgs e)
   {
    _DownHitInfo = null;
    GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(e.X, e.Y));
    if (Control.ModifierKeys != Keys.None) return;
    if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0)
    {
     // 禁用的Grid不支持拖拽
     if (!gvMain.OptionsBehavior.Editable
      || gvMain.OptionsBehavior.ReadOnly)
      return;
     // 只有点击最前面才能拖拽
     if (hitInfo.InRowCell)
      return;
     // 缓存
     _DownHitInfo = hitInfo;
    }
   };
   #endregion
   #region 鼠标移动 MouseMove
   gcMain.MouseMove += delegate(object sender, MouseEventArgs e)
   {
    if (e.Button == MouseButtons.Left)
    {
     if (_DownHitInfo != null)
     {
      Size dragSize = SystemInformation.DragSize;
      // 偏离区域
      Rectangle dragRect = new Rectangle(new Point(_DownHitInfo.HitPoint.X - dragSize.Width / 2, _DownHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
        if (!dragRect.Contains(new Point(e.X, e.Y)))
      {
       // 屏幕坐标
       var p =



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#实现Dev Grid拖拽移动行的方法

相关文章

  • 2017-05-28C#定制Excel界面并实现与数据库交互的方法
  • 2017-05-28C#数据库操作小结
  • 2017-05-28C#实现计算年龄的简单方法汇总
  • 2017-05-28C# RSA分段加解密实现方法详解
  • 2017-05-28winfrom 打印表格 字符串的封装实现代码 附源码下载
  • 2017-05-28C#生成Word文档代码示例
  • 2017-05-28C#编写ActiveX网页截图控件
  • 2017-05-28C#正则表达式获取下拉菜单(select)的相关属性值
  • 2017-05-28使用windows控制台调试服务的方法
  • 2017-05-28浅谈C# 序列化与反序列化几种格式的转换

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#中winform实现自动触发鼠标、键盘事件的方法
    • WinForm实现同时让两个窗体有激活效果的特效实例
    • C#实现获取枚举中元素个数的方法
    • 深入多线程之:内存栅栏与volatile关键字的使用分析
    • C# Oracle数据库操作类实例详解
    • c# 二分查找算法
    • c#反射机制学习和利用反射获取类型信息
    • C#可用于登录验证码的四位随机数生成方法
    • C#使用LINQ中Enumerable类方法的延迟与立即执行的控制
    • C#实现简单获取及设置Session类

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有