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>