protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (DesignMode) { return; } m_MouseMovePos = e.Location; m_MouseMovePos.X += _hScroll.Value; m_MouseMovePos.Y += _vScroll.Value; if (_vScroll.IsMouseDown) { return; } if (_hScroll.IsMouseDown) { return; } int i = 0; if (AllowUserToResizeColumns && m_DragRowOrColumn != 2)//调整列宽 { foreach (var item in TableColumns) { RectangleF temp = new RectangleF(item.Bounds.Right - 2, 0, 4, item.Bounds.Height); if (temp.Contains(e.Location)) { this.Cursor = Cursors.SizeWE; m_DragColumnPos = i; m_MouseIntent = MouseIntent.PressMove; return; } i++; } m_DragColumnPos = -1; this.Cursor = Cursors.Default; } //this.Cursor = Cursors.Default; i = 0; int t = -1; foreach (var item in _rows) { if (item.Contains(m_MouseMovePos)) { t = i; break; } i++; } if (e.Button == MouseButtons.Left && m_DragRowOrColumn > -1) { i = 0; if (m_DragRowOrColumn == 1) { foreach (var item in TableColumns) { if (item.Bounds.Contains(e.Location)) { m_Prepare = new RectangleF(item.Bounds.Location, new SizeF(2, item.Bounds.Height)); m_AfterDragPos = i; m_MouseIntent = MouseIntent.PressMove; this.Invalidate(); return; } i++; } } else if (m_DragRowOrColumn == 0) { //处理行拖放 if (t > -1) { m_Prepare = new RectangleF(_rows[t].Location, new SizeF(100, 2)); //m_Prepare = new RectangleF(m_MouseMovePos, new SizeF(100, 2)); m_AfterDragPos = t; m_MouseIntent = MouseIntent.PressMove; this.Invalidate(); return; } } else if (m_DragRowOrColumn == 2) { float w = m_MouseMovePos.X - m_MouseDownPos.X; if (w == 0) { return; } TableColumns[m_DragColumnPos].Width = (int)(TableColumns[m_DragColumnPos].Bounds.Width + w); this.ResetColumns(); this.Invalidate(); m_MouseDownPos = m_MouseMovePos; m_MouseIntent = MouseIntent.PressMove; return; //Console.WriteLine(m_DragColumnPos); } //this.Invalidate(); } MouseMoveIndex = t; //if (m_MouseMoveIndex > -1) //this.Invalidate(); }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (DesignMode) { return; } if (_vScroll.IsMouseDown) { return; } if (m_DragRowOrColumn > -1 && m_AfterDragPos != m_BeforeDragPos && m_AfterDragPos > -1 && m_BeforeDragPos > -1) { //切换位置 if (m_DragRowOrColumn == 1) { TableColumns.Transposition(m_BeforeDragPos, m_AfterDragPos); ResetColumns(); OnColumnDragChanged(EventArgs.Empty); m_MouseIntent = MouseIntent.None; } else { m_SelectionIndex = -1; object temp = dataSource[m_BeforeDragPos]; dataSource.Remove(temp); dataSource.Insert(m_AfterDragPos, temp); OnRowDragChanged(EventArgs.Empty); m_MouseIntent = MouseIntent.None; } } int tempIndex = m_BeforeDragPos; int tempDrag = m_DragRowOrColumn; MouseIntent tempIntent = m_MouseIntent; m_MouseIntent = MouseIntent.None; m_DragRowOrColumn = -1; m_DragColumnPos = -1; m_AfterDragPos = -1; m_BeforeDragPos = -1; m_Prepare = Rectangle.Empty; m_MouseDownOffset = PointF.Empty; this.Cursor = Cursors.Default; if (m_MousePreview != null) { m_MousePreview.Dispose(); m_MousePreview = null; this.Invalidate(); } switch (tempIntent) { case MouseIntent.None: //判断按下位置 HandleEvent(e); break; case MouseIntent.MouseDown: //按下触发 点击事件 //判断按下位置为行/标题 if (tempDrag == 1 && tempIndex > -1) { //按下位置为 标题行 TableColumn item = TableColumns[tempIndex]; if (!item.SortColumn) { return; } item.Desc = !item.Desc; OnSortClick(new TableColumnSortEventArgs(item)); } else { SelectionIndex = tempIndex; OnSelectionChanged(new SelectionChangeEventArgs(tempIndex)); } break; case MouseIntent.PressMove: break; default: break; } }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (DesignMode) { return; } m_MouseDownPos = e.Location; m_MouseDownPos.X += _hScroll.Value; m_MouseDownPos.Y += _vScroll.Value; if (_vScroll.IsMouseDown) { return; } if (_hScroll.IsMouseDown) { return; } if (e.Button == MouseButtons.Left) { int i = 0; if (m_DragColumnPos > 0) { m_DragRowOrColumn = 2; return; } if (AllowUserToOrderColumns) { i = 0; foreach (var item in TableColumns) { if (item.Bounds.Contains(e.Location)) { m_DragRowOrColumn = 1; m_MousePreview?.Dispose(); m_MousePreview = new Bitmap((int)item.Bounds.Width, (int)item.Bounds.Height); using (Graphics g = Graphics.FromImage(m_MousePreview)) { g.Clear(Color.FromArgb(60, Color.White)); using (SolidBrush solidBrush = new SolidBrush(this.ForeColor)) item.Draw(g, solidBrush, new RectangleF(0, 0, item.Bounds.Width, item.Bounds.Height)); } m_BeforeDragPos = i; m_MouseDownOffset = new PointF(m_MouseDownPos.X - item.Bounds.X, m_MouseDownPos.Y - item.Bounds.Y); m_MouseIntent = MouseIntent.MouseDown; return; } i++; } } //处理行拖放 i = 0; if (AllowUserToOrderRows) { foreach (var item in _rows) { if (item.Contains(m_MouseDownPos)) { m_DragRowOrColumn = 0; m_MousePreview?.Dispose(); m_MousePreview = new Bitmap((int)item.Width, (int)item.Height); using (Graphics g = Graphics.FromImage(m_MousePreview)) { g.Clear(Color.FromArgb(60, Color.White)); using (SolidBrush solidBrush = new SolidBrush(this.ForeColor)) { Pen pen = new Pen(BorderColor); DrawRow(g, solidBrush, pen, 0, DataSource[i]); } } m_BeforeDragPos = i; m_MouseDownOffset = new PointF(m_MouseDownPos.X - item.X, m_MouseDownPos.Y - item.Y); m_MouseIntent = MouseIntent.MouseDown; return; } i++; } } } }