SVN-Revision: r902
This commit is contained in:
tdx
2025-08-05 07:55:42 +00:00
parent 1c0737e1ae
commit becff23d95
2 changed files with 97 additions and 49 deletions
+63 -48
View File
@@ -7103,84 +7103,88 @@ namespace Lskj.Control
private void BuildDynamicGroupedColumns(BandedGridControlEx bandedGridControlEx, DataTable originalDataSource)
{
bandedGridControlEx.BandedView.BeginUpdate();
// 数据源改变时必须重复执行此逻辑
bandedGridControlEx.BandedView.OptionsView.ColumnAutoWidth = false;
// 获取你的定义的主键、分组列、聚合数据列
/* ========= 0. 取列定义 ========= */
GridColumnModel GroupPrimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupPrimary);
GridColumnModel GroupFieldprimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupField == 1);
List<GridColumnModel> GroupField = ColumnList.Where(o => o.IsCustomGroupField == 2).ToList();
List<GridColumnModel> GroupField = ColumnList.Where(o => o.IsCustomGroupField == 2 || o.IsCustomGroupField == 4).ToList(); // 4 = 特殊字段
List<GridColumnModel> sumField = ColumnList.Where(o => o.IsCustomGroupField == 3).ToList();
if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any())
return; // 数据不足直接退出
if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any()) return;
//现有结构
/* ========= 1.现有列 ========= */
bandedGridControlEx.BandedView.Bands.Clear();
bandedGridControlEx.BandedView.Columns.Clear();
// 保留其他非聚合列
/* ========= 2. 创建“基本信息”Band ========= */
List<GridColumnModel> normalColumns = ColumnList.Where(o => o.IsCustomGroupField == 0 || o.IsCustomGroupField == 3).ToList();
// 创建正常列的Band
GridBand normalBand = new GridBand() { Caption = "基本信息" };
normalBand.Fixed = FixedStyle.Left;
GridBand normalBand = new GridBand { Caption = "基本信息", Fixed = FixedStyle.Left };
bandedGridControlEx.BandedView.Bands.Add(normalBand);
// 添加正常列到Band中
foreach (var normalCol in normalColumns)
{
if (originalDataSource.Columns.Contains(normalCol.FieldName))
if (!originalDataSource.Columns.Contains(normalCol.FieldName)) continue;
BandedGridColumn col = new BandedGridColumn
{
BandedGridColumn col = new BandedGridColumn()
{
FieldName = normalCol.FieldName,
Caption = normalCol.FieldText,
Width = normalCol.Width,
Visible = normalCol.Visible,
Tag = normalCol,
//MinWidth = normalCol.Width,
//MaxWidth = normalCol.Width,
OptionsColumn = { AllowEdit = normalCol.Edit, FixedWidth = true }
};
if (!normalCol.Edit)
{
col.AppearanceHeader.Options.UseForeColor = true;
col.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor);
}
if (normalCol.CanNull)
{
col.AppearanceHeader.Options.UseForeColor = true;
col.AppearanceHeader.ForeColor = RequiredForceColor;
}
bandedGridControlEx.SetColumnFormat(col, normalCol);
normalBand.Columns.Add(col);
bandedGridControlEx.BandedView.Columns.Add(col);
FieldName = normalCol.FieldName,
Caption = normalCol.FieldText,
Width = normalCol.Width,
Visible = normalCol.Visible,
Tag = normalCol,
OptionsColumn = { AllowEdit = normalCol.Edit, FixedWidth = true }
};
if (!normalCol.Edit)
{
col.AppearanceHeader.Options.UseForeColor = true;
col.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor);
}
if (normalCol.CanNull)
{
col.AppearanceHeader.Options.UseForeColor = true;
col.AppearanceHeader.ForeColor = RequiredForceColor;
}
bandedGridControlEx.SetColumnFormat(col, normalCol);
normalBand.Columns.Add(col);
bandedGridControlEx.BandedView.Columns.Add(col);
}
// 取得动态列名(自动处理 DateTime、string 及其它类型,不会抛转换异常)
/* ========= 3. 生成动态表头列表 ========= */
var dynamicHeaders = originalDataSource.AsEnumerable()
.Select(r => r[GroupFieldprimary.FieldName]) // 先拿 object
.Where(v => v != null && v != DBNull.Value) // 过滤空值
.Select(v => v is DateTime dt // ↙︎ DateTime 转指定格式
? dt.ToString("yyyy-MM-dd")
: v.ToString()) // 其它类型直接 ToString()
.Select(r => r[GroupFieldprimary.FieldName])
.Where(v => v != null && v != DBNull.Value)
.Select(v => v is DateTime dt ? dt.ToString("yyyy-MM-dd") : v.ToString())
.Distinct()
.ToList();
// 为每个动态表头生成GridBand,并添加子列
/* ========= 4. 生成动态 Band + 子列 ========= */
foreach (string headerName in dynamicHeaders)
{
GridBand dynamicBand = new GridBand() { Caption = headerName };
GridBand dynamicBand = new GridBand { Caption = headerName };
bandedGridControlEx.BandedView.Bands.Add(dynamicBand);
// 尝试把 headerName 解析成日期,以便下面用星期几
DateTime headerDate;
bool isDateHeader = DateTime.TryParse(headerName, out headerDate);
foreach (var subField in GroupField)
{
string dynamicFieldName = $"{headerName}_{subField.FieldName}";
BandedGridColumn subColumn = new BandedGridColumn()
/* —— 计算子列 Caption —— */
string subCaption = subField.FieldText; // 默认
if (subField.IsCustomGroupField == 4 && isDateHeader)
{
// 将星期几转成中文“日一二三四五六”,根据需要可自行改动
string[] cnWeek = { "日", "一", "二", "三", "四", "五", "六" };
subCaption = cnWeek[(int)headerDate.DayOfWeek]; // 0=Sunday
}
BandedGridColumn subColumn = new BandedGridColumn
{
FieldName = dynamicFieldName,
Caption = subField.FieldText,
Caption = subCaption,
Width = subField.Width,
Visible = subField.Visible,
Tag = subField,
@@ -7203,12 +7207,23 @@ namespace Lskj.Control
bandedGridControlEx.BandedView.Columns.Add(subColumn);
}
}
bandedGridControlEx.BandedView.EndUpdate();
// 构建最终动态数据源
DataTable dynamicDataTable = BuildDynamicDataSource(originalDataSource, GroupPrimary, GroupFieldprimary, GroupField, normalColumns, sumField, dynamicHeaders);
/* ========= 5. 构建最终数据源并绑定 ========= */
DataTable dynamicDataTable = BuildDynamicDataSource(
originalDataSource,
GroupPrimary,
GroupFieldprimary,
GroupField,
normalColumns,
sumField,
dynamicHeaders);
bandedGridControlEx.gridControl.DataSource = dynamicDataTable;
}
/// <summary>
/// 构建数据源
/// </summary>
+34 -1
View File
@@ -30,6 +30,7 @@ using Lskj.Core;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Collections;
using DevExpress.XtraGrid.Columns;
namespace Lskj.Control
{
@@ -377,7 +378,11 @@ namespace Lskj.Control
}
else
{
if(this.ModuleGridObj.GridControlObj.CustomGroupBandEx!=null) this.ModuleGridObj.GridControlObj.CustomGroupBandEx.GridView.FocusedRowObjectChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged);
if (this.ModuleGridObj.GridControlObj.CustomGroupBandEx != null)
{
this.ModuleGridObj.GridControlObj.CustomGroupBandEx.GridView.MouseDown += new MouseEventHandler(GridView_MouseDown);
this.ModuleGridObj.GridControlObj.CustomGroupBandEx.GridView.FocusedRowObjectChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged);
}
this.ModuleGridObj.GridControlObj.GridView.FocusedRowObjectChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged);
//this.ModuleGridObj.GridControlObj.GridView.RowCellClick += new RowCellClickEventHandler(GridView_RowCellClick);
this.ModuleGridObj.GridControlObj.GridView.MouseDown += new MouseEventHandler(GridView_MouseDown);
@@ -892,13 +897,41 @@ namespace Lskj.Control
{
sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue);
}
//sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue);
DataRow row = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow();
if (row != null && isLeft)
{
//先替换左侧选中行,在替换主表
sqlValue = ReplaceHelper.ReplaceRowParam(row, sqlValue);
}
// ① 先拿普通 GridView 的焦点列(始终会有)
GridColumn fixColumn = this.ModuleGridObj.GridControlObj.GridView.FocusedColumn;
string columnCaption = fixColumn?.Caption ?? string.Empty;
/* ② 如果启用了多表头(CustomGroupBandEx)
* 尝试用 BandedGridColumn.OwnerBand 获取 Band 标题 */
var bandEx = this.ModuleGridObj.GridControlObj.CustomGroupBandEx;
if (bandEx != null)
{
var bandedView = bandEx.GridView as DevExpress.XtraGrid.Views.BandedGrid.BandedGridView;
if (bandedView != null && bandedView.FocusedColumn != null)
{
// 强转;成功才说明列属于 BandedGridView
var bcol = bandedView.FocusedColumn as DevExpress.XtraGrid.Views.BandedGrid.BandedGridColumn;
if (bcol != null && bcol.OwnerBand != null)
{
// 若只想最顶层 Band,循环 ParentBand 至 null
var band = bcol.OwnerBand;
while (band.ParentBand != null) band = band.ParentBand;
columnCaption = band.Caption; // 用 Band 的标题
}
}
}
// ③ 替换占位符(Replace 会返回新字符串)
sqlValue = sqlValue.Replace("{COLUMN_TITLE}", columnCaption);
if (ReplaceHelper.IsSelect(sqlValue) && !string.IsNullOrEmpty(model.UnionValue))
{
string Conditions = string.Empty;