我是靠谱客的博主 灵巧豌豆,最近开发中收集的这篇文章主要介绍Dev GridView Winform 横竖合并单元格,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

参考:传送门

源码下载地址:下载

以下源码:

待合并单元格对象

using System; using System.Collections.Generic; using System.Linq; using System.Text;

using DevExpress.XtraGrid.Columns; namespace MyUtil { public class MyMergedCell { public MyMergedCell(int rowHandle1, GridColumn col1,int rowHandle2,GridColumn col2) { RowHandle1 = rowHandle1; Column1 = col1; RowHandle2 = rowHandle2; Column2 = col2; } public int RowHandle1 { get; set; } public GridColumn Column1 { get; set; } public int RowHandle2 { get; set; } public GridColumn Column2 { get; set; } } }

重绘单元格操作类

using System; using System.Collections.Generic; using System.Linq; using System.Text;

using DevExpress.XtraGrid.Views.Grid.ViewInfo; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Grid.Drawing; using DevExpress.Utils.Drawing; using System.Drawing; using System.Windows.Forms; namespace MyUtil { public class MyGridPainter:GridPainter { public MyGridPainter(GridView view):base(view) { } public bool IsCustomPainting { get; set; } public void DrawMergedCell(MyMergedCell cell,PaintEventArgs e) { int delta=cell.Column1.VisibleIndex - cell.Column2.VisibleIndex; int rowdelta = cell.RowHandle1 - cell.RowHandle2; if(Math.Abs(delta)>1||Math.Abs(rowdelta)>1) { return; } GridViewInfo vi=(GridViewInfo)View.GetViewInfo(); GridCellInfo gridCellInfo1=vi.GetGridCellInfo(cell.RowHandle1, cell.Column1.AbsoluteIndex); GridCellInfo gridCellInfo2=vi.GetGridCellInfo(cell.RowHandle2, cell.Column2.AbsoluteIndex); if(gridCellInfo1==null || gridCellInfo2==null) { return; } if (gridCellInfo1.IsMerged || gridCellInfo2.IsMerged) { return; } Rectangle targetRect=Rectangle.Union(gridCellInfo1.Bounds, gridCellInfo2.Bounds); gridCellInfo1.Bounds = targetRect; gridCellInfo1.CellValueRect = targetRect; gridCellInfo2.Bounds = targetRect; gridCellInfo2.CellValueRect = targetRect; if (delta < 0||rowdelta<0) { gridCellInfo1 = gridCellInfo2; } Rectangle bounds = gridCellInfo1.ViewInfo.Bounds; bounds.Width = targetRect.Width; bounds.Height = targetRect.Height; gridCellInfo1.ViewInfo.Bounds = bounds; gridCellInfo1.ViewInfo.CalcViewInfo(e.Graphics); IsCustomPainting = true; var cache=new GraphicsCache(e.Graphics); gridCellInfo1.Appearance.FillRectangle(cache, gridCellInfo1.Bounds); gridCellInfo1.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; DrawRowCell(new GridViewDrawArgs(cache, vi, vi.ViewRects.Bounds), gridCellInfo1); IsCustomPainting = false; } } }

绑定视图类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Columns; using System.Windows.Forms; using DevExpress.XtraGrid.Views.Grid.ViewInfo; namespace MyUtil { public class MyCellMergeHelper { private GridView _view; private MyGridPainter painter; private List<MyMergedCell> _MergedCells=new List<MyMergedCell>(); public MyCellMergeHelper(GridView view) { _view=view; //view.CustomDrawCell += new RowCellCustomDrawEventHandler(view_CustomDrawCell); view.GridControl.Paint += new PaintEventHandler(GridControl_Paint); view.CellValueChanged += new CellValueChangedEventHandler(view_CellValueChanged); view.GridControl.Load += new EventHandler(GridControl_Load); painter=new MyGridPainter(view); } void GridControl_Load(object sender, EventArgs e) { Run(); } void view_CellValueChanged(object sender, CellValueChangedEventArgs e) { SafeSetMergedCellValue(GetMergedCell(e.RowHandle, e.Column), e.Value); } void GridControl_Paint(object sender, PaintEventArgs e) { DrawMergedCells(e); } void view_CustomDrawCell(object sender, RowCellCustomDrawEventArgs e) { //if (IsMergedCell(e.RowHandle, e.Column)) //{ // e.Handled = painter.IsCustomPainting; //}         } public List<MyMergedCell> MergedCells { get{ return _MergedCells;} } protected MyMergedCell AddMergedCell(int rowHandle1, GridColumn col1, int rowHandle2, GridColumn col2) { MyMergedCell cell=new MyMergedCell(rowHandle1, col1,rowHandle2, col2); _MergedCells.Add(cell); return cell; } protected void AddMergedCell(int rowHandle1, int col1, int rowHandle2, int col2, object value) { AddMergedCell(rowHandle1, _view.Columns[col1],rowHandle2, _view.Columns[col2], value); } protected void AddMergedCell(int rowHandle1, GridColumn col1, int rowHandle2, GridColumn col2, object value) { MyMergedCell cell=AddMergedCell(rowHandle1, col1,rowHandle2, col2); List<MyMergedCell> cells = new List<MyMergedCell>(); cells.Add(cell); SafeSetMergedCellValue(cells, value); } protected void SafeSetMergedCellValue(List<MyMergedCell> cells, object value) { if (_view.OptionsView.AllowCellMerge) { GridViewInfo vi = (GridViewInfo)_view.GetViewInfo(); foreach (MyMergedCell cell in cells) { GridCellInfo gridCellInfo1 = vi.GetGridCellInfo(cell.RowHandle1, cell.Column1.AbsoluteIndex); GridCellInfo gridCellInfo2 = vi.GetGridCellInfo(cell.RowHandle2, cell.Column2.AbsoluteIndex); if (gridCellInfo1 == null || gridCellInfo2 == null) { SafeSetCellValue(cell.RowHandle1, cell.Column1, value); SafeSetCellValue(cell.RowHandle2, cell.Column2, value); } else { if (!gridCellInfo1.IsMerged && !gridCellInfo2.IsMerged) { SafeSetCellValue(cell.RowHandle1, cell.Column1, value); SafeSetCellValue(cell.RowHandle2, cell.Column2, value); } } } } else { foreach (MyMergedCell cell in cells) { SafeSetCellValue(cell.RowHandle1, cell.Column1, value); SafeSetCellValue(cell.RowHandle2, cell.Column2, value); } } } protected void SafeSetCellValue(int rowHandle,GridColumn column,object value) { if(_view.GetRowCellValue(rowHandle,column)!=value) { _view.SetRowCellValue(rowHandle, column, value); } } private List<MyMergedCell> GetMergedCell(int rowHandle,GridColumn column) { List<MyMergedCell> cells = new List<MyMergedCell>(); foreach(MyMergedCell cell in _MergedCells) { if ((cell.RowHandle1 == rowHandle || cell.RowHandle2==rowHandle) && (column == cell.Column1 || column == cell.Column2)) { cells.Add(cell); } } return cells; } private bool IsMergedCell(int rowHandle,GridColumn column) { List<MyMergedCell> cells=GetMergedCell(rowHandle, column); if (cells.Count > 0) { return true; } else return false; } private void DrawMergedCells(PaintEventArgs e) { foreach(MyMergedCell cell in _MergedCells) { painter.DrawMergedCell(cell, e); } } private void Run() { _MergedCells.Clear(); for (int i = 0; i < _view.RowCount; i++) { for (int j = 0; j < _view.Columns.Count; j++) { if (_view.Columns[j].OptionsColumn.AllowMerge == DevExpress.Utils.DefaultBoolean.False) continue; GridViewInfo vi = (GridViewInfo)_view.GetViewInfo(); GridCellInfo gridCellInfo1 = vi.GetGridCellInfo(i, _view.Columns[j].AbsoluteIndex); if (gridCellInfo1 != null) if (gridCellInfo1.IsMerged) continue; bool fRrigt = false; bool fBottem = false; bool fSp = false; bool fself = IsMergedCell(i, _view.Columns[j]); //向右合并 if (j != _view.Columns.Count - 1) { GridCellInfo gridCellInfo2 = vi.GetGridCellInfo(i, _view.Columns[j + 1].AbsoluteIndex); if (gridCellInfo2 != null) { if (!gridCellInfo2.IsMerged) { if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i, _view.Columns[j + 1])) { if (_view.Columns[j].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False && _view.Columns[j + 1].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False) fRrigt = true; } } } else { if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i, _view.Columns[j + 1])) { if (_view.Columns[j].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False && _view.Columns[j + 1].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False) fRrigt = true; } } } //向下合并 if (i != _view.RowCount - 1) { GridCellInfo gridCellInfo2 = vi.GetGridCellInfo(i+1, _view.Columns[j].AbsoluteIndex); if (gridCellInfo2 != null) { if (!gridCellInfo2.IsMerged) { if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i + 1, _view.Columns[j])) { if (_view.Columns[j].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False) { if (!fself) fBottem = true; else { //检查左下是否参与合并 if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i + 1, _view.Columns[j - 1])) fBottem = true; else fBottem = false; } } } } } else { if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i + 1, _view.Columns[j])) { if (_view.Columns[j].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False) { if (!fself) fBottem = true; else { //检查左下是否参与合并 if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i + 1, _view.Columns[j - 1])) fBottem = true; else fBottem = false; } } } } } if ((i != _view.RowCount - 1) && (j != _view.Columns.Count - 1)) { GridCellInfo gridCellInfo2 = vi.GetGridCellInfo(i+1, _view.Columns[j+1].AbsoluteIndex); if (gridCellInfo2 != null) { if (!gridCellInfo2.IsMerged) { if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i + 1, _view.Columns[j + 1])) { if (_view.Columns[j].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False && _view.Columns[j + 1].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False) fSp = true; } } } else { if (_view.GetRowCellDisplayText(i, _view.Columns[j]) == _view.GetRowCellDisplayText(i + 1, _view.Columns[j + 1])) { if (_view.Columns[j].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False && _view.Columns[j + 1].OptionsColumn.AllowMerge != DevExpress.Utils.DefaultBoolean.False) fSp = true; } } } //右、下、右下值相同 if (fRrigt && fBottem && fSp) { AddMergedCell(i, _view.Columns[j], i, _view.Columns[j + 1]); AddMergedCell(i, _view.Columns[j], i + 1, _view.Columns[j]); } else { if (fRrigt && fBottem) { AddMergedCell(i, _view.Columns[j], i + 1, _view.Columns[j]); } else { if (fRrigt) AddMergedCell(i, _view.Columns[j], i, _view.Columns[j + 1]); if (fBottem) AddMergedCell(i, _view.Columns[j], i + 1, _view.Columns[j]); } } } } } } }




最后

以上就是灵巧豌豆为你收集整理的Dev GridView Winform 横竖合并单元格的全部内容,希望文章能够帮你解决Dev GridView Winform 横竖合并单元格所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部