原創(chuàng)|使用教程|編輯:龔雪|2014-03-18 11:50:36.000|閱讀 7256 次
概述:本文講解的是把DevExpress GridControl中的數(shù)據(jù)行拖拽到richEditControl里,DevExpress其他控件的拖拽操作也可以類似的進(jìn)行處理。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
GridControl的數(shù)據(jù)源只有兩列的DataTable,列分別為Code和Caption。
開始拖拽的思路是:在GridControl的MouseDown以及MoseMove里處理開始拖拽,在richEditControl里執(zhí)行并且結(jié)束拖拽。
以下為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); //當(dāng)鼠標(biāo)離開原來的控件區(qū)域之后才顯示拖拽效果 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; } } }
下面這個(gè)判斷保證了只有當(dāng)鼠標(biāo)移出GridControl的范圍之后才會(huì)觸發(fā)GridControl的DoDragDrop。
if (!dragRect.Contains(new Point(e.X, e.Y)))
如果你按住鼠標(biāo)左鍵不放,都是處于DragDrop狀態(tài),這時(shí)候有個(gè)神奇的事情,所有控件的MouseMove方法都失效了。
我們來處理一下richEditControl的接收,這里要處理兩個(gè)方法DragOver以及DragDrop,DragOver在鼠標(biāo)進(jìn)入richEditControl區(qū)域時(shí)改變鼠標(biāo)樣式,DragDrop處理在richEditControl上釋放鼠標(biāo)時(shí)處理以及結(jié)束拖拽。
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是我自行封裝的數(shù)據(jù)類,兩個(gè)屬性分別對(duì)應(yīng)數(shù)據(jù)的發(fā)送者以及數(shù)據(jù):
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; } } }
那么通過數(shù)據(jù)的發(fā)送者就可以判斷接收的是什么類型的數(shù)據(jù)以便對(duì)具體的情況進(jìn)行具體的處理。
最后因?yàn)橥献录^程中所有MouseMove事件都失效,為了解決在richEditControl中不能進(jìn)行插入符跟隨鼠標(biāo)定位的問題,在界面上添加了一個(gè)Timer,每0.5秒進(jìn)行一次插入符定位處理以實(shí)現(xiàn)控制拖拽數(shù)據(jù)插入位置的問題,代碼如下:
private bool m_TmrDragDropCanRun = false; private void tmr_DragDrop_Tick(object sender, EventArgs e) { //在拖拽時(shí)定位鼠標(biāo)坐標(biāo) 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(); } }
轉(zhuǎn)載自//blog.csdn.net/a237428367/article/details/7888776
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)