原創|使用教程|編輯:龔雪|2014-03-18 11:50:36.000|閱讀 7256 次
概述:本文講解的是把DevExpress GridControl中的數據行拖拽到richEditControl里,DevExpress其他控件的拖拽操作也可以類似的進行處理。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
GridControl的數據源只有兩列的DataTable,列分別為Code和Caption。
開始拖拽的思路是:在GridControl的MouseDown以及MoseMove里處理開始拖拽,在richEditControl里執行并且結束拖拽。
以下為GridControl的MouseDown以及MouseMove方法:
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo m_DownHitInfo_TuXing = null; private void gv_TuXing_MouseDown(object sender, MouseEventArgs e) { DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hi = this.gv_TuXing.CalcHitInfo(new Point(e.X, e.Y)); int iMouseRowHandle = hi.RowHandle; if (iMouseRowHandle >= 0 && e.Button == MouseButtons.Left) { m_DownHitInfo_TuXing = hi; } } private void gv_TuXing_MouseMove(object sender, MouseEventArgs e) { GridView view = sender as GridView; if (e.Button == MouseButtons.Left && m_DownHitInfo_TuXing != null) { Size dragSize = SystemInformation.DragSize; Rectangle dragRect = new Rectangle(new Point(m_DownHitInfo_TuXing.HitPoint.X - dragSize.Width / 2, m_DownHitInfo_TuXing.HitPoint.Y - dragSize.Height / 2), dragSize); //當鼠標離開原來的控件區域之后才顯示拖拽效果 if (!dragRect.Contains(new Point(e.X, e.Y))) { m_TmrDragDropCanRun = true; tmr_DragDrop.Start(); DataRow row = view.GetDataRow(m_DownHitInfo_TuXing.RowHandle); Model.DragDropData modelData = new Model.DragDropData(); modelData.Sender = gc_TuXing; modelData.Data = row; view.GridControl.DoDragDrop(modelData, DragDropEffects.Move); m_DownHitInfo_TuXing = null; DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true; } } }
下面這個判斷保證了只有當鼠標移出GridControl的范圍之后才會觸發GridControl的DoDragDrop。
if (!dragRect.Contains(new Point(e.X, e.Y)))
如果你按住鼠標左鍵不放,都是處于DragDrop狀態,這時候有個神奇的事情,所有控件的MouseMove方法都失效了。
我們來處理一下richEditControl的接收,這里要處理兩個方法DragOver以及DragDrop,DragOver在鼠標進入richEditControl區域時改變鼠標樣式,DragDrop處理在richEditControl上釋放鼠標時處理以及結束拖拽。
private void rec_EMR_DragOver(object sender, DragEventArgs e) { rec_EMR.Select(); if (e.Data.GetDataPresent(typeof(Model.DragDropData))) e.Effect = DragDropEffects.Move; else e.Effect = DragDropEffects.None; } private void rec_EMR_DragDrop(object sender, DragEventArgs e) { try { m_TmrDragDropCanRun = false; tmr_DragDrop.Stop(); Model.DragDropData modelData = (Model.DragDropData)e.Data.GetData(typeof(Model.DragDropData)); switch (modelData.Sender.Name) { case "gc_TuXing": //插入圖形 string strImageID = ((DataRow)modelData.Data)["Code"].ToString(); Image imgInsert = m_EMR_BLL.EMR_Image_Get_By_Id(strImageID); rec_EMR.Document.InsertImage(rec_EMR.Document.CaretPosition, imgInsert); break; default: break; } } catch (Exception ex) { XtraMessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { } }
其中的Model.DragDropData是我自行封裝的數據類,兩個屬性分別對應數據的發送者以及數據:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ElectronicMedicalRecords.Model { public class DragDropData { public System.Windows.Forms.Control Sender { get; set; } public object Data { get; set; } } }
那么通過數據的發送者就可以判斷接收的是什么類型的數據以便對具體的情況進行具體的處理。
最后因為拖拽事件過程中所有MouseMove事件都失效,為了解決在richEditControl中不能進行插入符跟隨鼠標定位的問題,在界面上添加了一個Timer,每0.5秒進行一次插入符定位處理以實現控制拖拽數據插入位置的問題,代碼如下:
private bool m_TmrDragDropCanRun = false; private void tmr_DragDrop_Tick(object sender, EventArgs e) { //在拖拽時定位鼠標坐標 if (m_TmrDragDropCanRun) { tmr_DragDrop.Stop(); Point pMouse = Cursor.Position; Point pEMR_Edit = this.rec_EMR.PointToScreen(rec_EMR.Location); Point pTruePoint = new Point(pMouse.X - pEMR_Edit.X, pMouse.Y - pEMR_Edit.Y); Point docPoint = Units.PixelsToDocuments(pTruePoint, rec_EMR.DpiX, rec_EMR.DpiY); DevExpress.XtraRichEdit.API.Native.DocumentPosition pos = rec_EMR.GetPositionFromPoint(docPoint); if (pos != null) { bsi_BianJiLeiXing.Caption = pos.ToString(); rec_EMR.Document.CaretPosition = pos; } else bsi_BianJiLeiXing.Caption = "Mouse:(" + pMouse.X + "|" + pMouse.Y + " E:(" + pTruePoint.X + "|" + pTruePoint.Y + ")"; if (m_TmrDragDropCanRun) { tmr_DragDrop.Start(); } } else { tmr_DragDrop.Stop(); } }
轉載自//blog.csdn.net/a237428367/article/details/7888776
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網