国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現Dev Grid拖拽移動行的方法

2020-01-24 01:52:54
字體:
來源:轉載
供稿:網友

本文實例講述了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 = 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>  /// 獲取拖拽截圖  /// </summary>  /// <param name="hitInfo"></param>  /// <param name="gcMain"></param>  /// <param name="dragRowRect"></param>  /// <returns></returns>  private static Bitmap GetDragRowImage(GridControl gcMain, GridHitInfo hitInfo, Rectangle dragRowRect)  {   // 截圖   var bmp = DevImageCapturer.GetControlBitmap(gcMain, null   , dragRowRect.Width + 1, dragRowRect.Top   , gcMain.Width - dragRowRect.Width - 4, dragRowRect.Height - 1);     using (Graphics g = Graphics.FromImage(bmp))   {    var p1 = new Point(1, 1);    var p2 = new Point(bmp.Width - 1, 1);    var p3 = new Point(1, bmp.Height - 2);    var p4 = new Point(bmp.Width - 1, bmp.Height - 2);    using (Pen pen = new Pen(gcMain.ForeColor))    {     g.DrawLine(pen, p1, p2);     g.DrawLine(pen, p1, p3);     g.DrawLine(pen, p2, p4);     g.DrawLine(pen, p3, p4);    }   }   return bmp;  }}/// <summary>/// 拖拽窗口/// </summary>public partial class DragWindow : DevExpress.Utils.Win.TopFormBase{  private Bitmap dragBitmap;  private bool dragging;  private Point hotSpot;  public static readonly Point InvisiblePoint = new Point(-100000, -100000);  public DragWindow()  {   hotSpot = Point.Empty;   dragging = false;   SetStyle(ControlStyles.Selectable, false);   this.Size = Size.Empty;   this.ShowInTaskbar = false;   Form prevActive = Form.ActiveForm;   InitializeComponent();  }  void ActivateForm(object sender, EventArgs e)  {   Form form = sender as Form;   if (form == null || !form.IsHandleCreated) return;   form.Activate();  }  public void MakeTopMost()  {   UpdateZOrder();  }  private void InitializeComponent()  {   this.StartPosition = FormStartPosition.Manual;   dragBitmap = null;   this.Enabled = false;   this.MinimumSize = Size.Empty;   this.Size = Size.Empty;   this.Location = InvisiblePoint;   this.Visible = false;   this.TabStop = false;   //this.Opacity = 0.7;// DevExpress.Utils.DragDrop.DragWindow.DefaultOpacity;  }  protected void InternalMoveBitmap(Point p)  {   //p.Offset(-hotSpot.X, -hotSpot.Y);   this.SuspendLayout();   this.Location = p;   this.ResumeLayout();  }  protected override void OnResize(System.EventArgs e)  {   base.OnResize(e);  }  public bool ShowDrag(Point p)  {   if (this.BackgroundImage == null) return false;   dragging = true;   Visible = true;   Refresh();   InternalMoveBitmap(p);   return true;  }  public bool MoveDrag(Point p)  {   if (!dragging) return false;   InternalMoveBitmap(p);   return true;  }  public bool HideDrag()  {   if (!dragging) return false;   Visible = false;   BackgroundImage = null;   dragging = false;   this.SuspendLayout();   this.Size = Size.Empty;   this.Location = InvisiblePoint;   this.ResumeLayout();   return true;  }  public Point HotSpot { get { return hotSpot; } set { hotSpot = value; } }  public Bitmap DragBitmap  {   get { return dragBitmap; }   set   {    this.BackgroundImage = value;    if (value == null)    {     HideDrag();    }    else     hotSpot = new Point(value.Size.Width / 2, value.Size.Height / 2);    dragBitmap = value;    Size = BackgroundImage.Size;   }  }}/// <summary>/// 截圖/// </summary>public class DevImageCapturer{  [System.Runtime.InteropServices.DllImport("USER32.dll")]  internal static extern IntPtr GetDC(IntPtr dc);  [System.Runtime.InteropServices.DllImport("USER32.dll")]  internal static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);  [System.Runtime.InteropServices.DllImport("USER32.dll")]  internal static extern IntPtr GetDesktopWindow();  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern IntPtr CreateCompatibleDC(IntPtr hdc);  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern bool DeleteObject(IntPtr hObject);  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern IntPtr CreateSolidBrush(int color);  [System.Runtime.InteropServices.DllImport("gdi32.dll")]  internal static extern IntPtr CreatePatternBrush(IntPtr hBitmap);  /// <summary>  /// 獲取控件的截圖  /// </summary>  /// <param name="control">控件</param>  /// <param name="pattern">圖片</param>  /// <returns></returns>  public static Bitmap GetControlBitmap(Control control, Bitmap pattern)  {   int width = control.Width;   int height = control.Height;   if (control is Form)   {    width = control.ClientRectangle.Width;    height = control.ClientRectangle.Height;   }   IntPtr hdc = GetDC(control.Handle);   IntPtr compDC = CreateCompatibleDC(hdc);   IntPtr compHBmp = CreateCompatibleBitmap(hdc, width, height);   IntPtr prev = SelectObject(compDC, compHBmp);   IntPtr brush = IntPtr.Zero, prevBrush = IntPtr.Zero;   if (pattern != null)   {    brush = CreatePatternBrush(pattern.GetHbitmap());    prevBrush = SelectObject(compDC, brush);   }   Point pt = new Point(0, 0);   BitBlt(compDC, 0, 0, width, height, hdc, pt.X, pt.Y, 0x00C000CA);   SelectObject(compDC, prev);   if (prevBrush != IntPtr.Zero)    SelectObject(compDC, prevBrush);   ReleaseDC(control.Handle, hdc);   NativeMethods.DeleteDC(compDC);   Bitmap bmp = Bitmap.FromHbitmap(compHBmp);   DeleteObject(compHBmp);   if (brush != IntPtr.Zero)    DeleteObject(brush);   return bmp;  }  /// <summary>  /// 獲取控件的截圖  /// </summary>  /// <param name="control">控件</param>  /// <param name="pattern">圖片</param>  /// <param name="offSetX">X</param>  /// <param name="offSetY">Y</param>  /// <param name="width">寬</param>  /// <param name="height">高</param>  /// <returns></returns>  public static Bitmap GetControlBitmap(Control control, Bitmap pattern, int offSetX = 0, int offSetY = 0, int width = 0, int height = 0)  {   width = width == 0 ? control.Width : width;   height = height == 0 ? control.Height : height;   if (control is Form)   {    width = control.ClientRectangle.Width;    height = control.ClientRectangle.Height;   }   IntPtr hdc = GetDC(control.Handle);   IntPtr compDC = CreateCompatibleDC(hdc);   IntPtr compHBmp = CreateCompatibleBitmap(hdc, width, height);   IntPtr prev = SelectObject(compDC, compHBmp);   IntPtr brush = IntPtr.Zero, prevBrush = IntPtr.Zero;   if (pattern != null)   {    brush = CreatePatternBrush(pattern.GetHbitmap());    prevBrush = SelectObject(compDC, brush);   }   Point pt = new Point(offSetX, offSetY);   BitBlt(compDC, 0, 0, width, height, hdc, pt.X, pt.Y, 0x00C000CA);   SelectObject(compDC, prev);   if (prevBrush != IntPtr.Zero)    SelectObject(compDC, prevBrush);   ReleaseDC(control.Handle, hdc);   NativeMethods.DeleteDC(compDC);   Bitmap bmp = Bitmap.FromHbitmap(compHBmp);   DeleteObject(compHBmp);   if (brush != IntPtr.Zero)    DeleteObject(brush);   return bmp;  }} public class DragMaster {  [ThreadStatic]  static DragWindow dragWindow;  bool dragInProgress;  DragDropEffects effects;  DragDropEffects lastEffect;  static Cursor customizationCursor = null;  double _opacity = 0.7;    public double Opacity  {   get { return _opacity; }   set { _opacity = value; }  }  public DragMaster()  {   dragInProgress = false;   lastEffect = effects = DragDropEffects.None;  }    DragWindow DragWindow  {   get   {    if (dragWindow == null) dragWindow = new DragWindow() { Opacity = this.Opacity };    return dragWindow;   }  }  public DragDropEffects LastEffect  {   get { return lastEffect; }  }  public bool DragInProgress  {   get { return dragInProgress; }  }    /// <summary>  /// 繪制大小  /// </summary>  public Size DragSize  {   get   {    if (DragWindow.DragBitmap == null) return Size.Empty;    return DragWindow.DragBitmap.Size;   }  }  /// <summary>  /// 開始拖拽  /// </summary>  /// <param name="bmp"></param>  /// <param name="startPoint"></param>  /// <param name="effects"></param>  public void StartDrag(Bitmap bmp, Point startPoint, DragDropEffects effects)  {   StopDrag();   dragInProgress = true;   this.effects = effects;   lastEffect = effects;   DragWindow.MakeTopMost();   DragWindow.DragBitmap = bmp;   DragWindow.ShowDrag(startPoint);   SetDragCursor(effects);  }  /// <summary>  /// 停止拖拽  /// </summary>  protected void StopDrag()  {   dragInProgress = false;   lastEffect = effects = DragDropEffects.None;   DragWindow.HideDrag();  }  /// <summary>  /// 設置拖拽鼠標類型  /// </summary>  /// <param name="e"></param>  public void SetDragCursor(DragDropEffects e)  {   if (e == DragDropEffects.None)    Cursor.Current = CustomizationCursor;   else    Cursor.Current = Cursors.Default;  }  /// <summary>  /// 拖拽  /// </summary>  /// <param name="p"></param>  /// <param name="e"></param>  /// <param name="setCursor"></param>  public void DoDrag(Point p, DragDropEffects e, bool setCursor)  {   if (!dragInProgress) return;   lastEffect = e;   if (setCursor) SetDragCursor(e);   DragWindow.MoveDrag(p);  }  /// <summary>  /// 取消拖拽  /// </summary>  public void CancelDrag()  {   if (!dragInProgress) return;   StopDrag();  }  /// <summary>  /// 結束拖拽  /// </summary>  public void EndDrag()  {   if (!dragInProgress) return;   StopDrag();  }  /// <summary>  /// 自定義Cursor  /// </summary>  static Cursor CustomizationCursor  {   get   {    if (customizationCursor == null) customizationCursor = ResourceImageHelper.CreateCursorFromResources("DevExpress.XtraTreeList.Images.customization.cur", typeof(DragMaster).Assembly);    return customizationCursor;   }  }}

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 门头沟区| 柳江县| 祁连县| 遂昌县| 江都市| 仁怀市| 搜索| 镇宁| 安岳县| 利津县| 上虞市| 衡水市| 宁河县| 三穗县| 东山县| 宜君县| 佳木斯市| 南开区| 靖西县| 南安市| 江安县| 吴桥县| 孙吴县| 开封市| 永福县| 南漳县| 常宁市| 弋阳县| 常山县| 治多县| 三原县| 洮南市| 根河市| 来宾市| 榆林市| 松江区| 承德市| 海淀区| 奈曼旗| 雷波县| 江永县|