using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DevExpress.XtraGrid.Views.Grid; namespace SystemX.Product.TRA.UIControl.Helper { public class MergedRowsHelper { List _rows = new List(); GridView _gridView; public void Register(GridView gridView) { if(gridView == null) return; _gridView = gridView; gridView.FocusedRowChanged += gridView_FocusedRowChanged; gridView.RowStyle += gridView_RowStyle; gridView.GridControl.Load += GridControl_Load; gridView.RowCellStyle += gridView_RowCellStyle; } void GridControl_Load(object sender, EventArgs e) { RefreshMergedRows(); } void gridView_RowStyle(object sender, RowStyleEventArgs e) { if (_rows.Contains(_gridView.GetDataSourceRowIndex(e.RowHandle))) { e.Appearance.Assign(_gridView.PaintAppearance.FocusedRow); e.HighPriority = true; } } void gridView_RowCellStyle(object sender, RowCellStyleEventArgs e) { e.Appearance.TextOptions.HAlignment = e.Column.AppearanceCell.HAlignment; } void gridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { RefreshMergedRows(); _gridView.LayoutChanged(); } void RefreshMergedRows() { _rows = GetMergedRows(_gridView.FocusedRowHandle); _gridView.RefreshData(); } List GetMergedRows(int rowHandle) { HashSet mergedRows = new HashSet(); foreach(DevExpress.XtraGrid.Columns.GridColumn col in _gridView.VisibleColumns) { var originalCell = _gridView.GetRowCellDisplayText(rowHandle, col); for(int i = rowHandle; ; i--) { if(!_gridView.IsValidRowHandle(i)) break; var cell = _gridView.GetRowCellDisplayText(i, col); if(cell == originalCell) mergedRows.Add(i); else break; } for(int i = rowHandle; ; i++) { if(!_gridView.IsValidRowHandle(i)) break; var cell = _gridView.GetRowCellDisplayText(i, col); if(cell == originalCell) mergedRows.Add(i); else break; } } List result = new List(); foreach(var item in mergedRows) { result.Add(_gridView.GetDataSourceRowIndex(item)); } return result; } } }