您的位置:首页 > 编程语言 > C#

Dev GridView Winform 横竖合并单元格

2015-02-06 10:34 183 查看
参考:传送门

源码下载地址:下载

以下源码:

待合并单元格对象

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++)
{

c5b6
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]);
}
}
}
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息