SVN-Revision: r401
This commit is contained in:
tdx
2025-03-26 10:46:42 +00:00
parent fbe7ffe7ac
commit 5bad3b898f
+281
View File
@@ -412,6 +412,94 @@ namespace Lskj.Control
this.gridView.DoubleClick += OnShowImageDoubleClick; ; this.gridView.DoubleClick += OnShowImageDoubleClick; ;
#endregion #endregion
} }
/// <summary>
/// 保存前反写多表头数据源
/// </summary>
public void callbackUpdData()
{
try
{
// 获取动态多表头的Grid控件数据源 (假设为DataTable)
DataTable updatedTable = CustomGroupBandEx.gridControl.DataSource as DataTable;
if (updatedTable == null) return;
// 获取原始的GridControl的数据源
DataTable originalDataTable = this.gridControl.DataSource as DataTable;
if (originalDataTable == null) return;
// 获取分组相关的列定义
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();
if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any()) return;
// 遍历每一行更新回原始数据表
foreach (DataRow updatedRow in updatedTable.Rows)
{
string primaryKeyValue = updatedRow[GroupPrimary.FieldName]?.ToString();
// 根据主键定位原始表中的行集合
var originalRows = originalDataTable.AsEnumerable()
.Where(row => row.Field<string>(GroupPrimary.FieldName) == primaryKeyValue).ToList();
if (!originalRows.Any()) continue; // 若没有匹配的行,跳过
// 遍历动态表头的Band及子列
foreach (GridBand band in CustomGroupBandEx.BandedView.Bands)
{
if (band.Caption == "基本信息") continue; // 跳过普通列Band
string groupFieldPrimaryValue = band.Caption;
foreach (BandedGridColumn column in band.Columns)
{
var subField = column.Tag as GridColumnModel;
if (subField == null) continue;
string dynamicFieldName = column.FieldName;
object updatedValue = updatedRow[dynamicFieldName];
// 精确匹配原数据源对应的单行
DataRow targetRow = originalRows.FirstOrDefault(r =>
r.Field<string>(GroupFieldprimary.FieldName) == groupFieldPrimaryValue);
// 若找到行,则更新该行对应的字段
if (targetRow != null && originalDataTable.Columns.Contains(subField.FieldName))
{
targetRow[subField.FieldName] = updatedValue;
}
else if (targetRow == null)
{
// 若没找到,说明可能为新增数据行,插入新行(若业务需要)
DataRow newOriginalRow = originalDataTable.NewRow();
newOriginalRow[GroupPrimary.FieldName] = primaryKeyValue;
newOriginalRow[GroupFieldprimary.FieldName] = groupFieldPrimaryValue;
foreach (var col in ColumnList.Where(x => !x.IsCustomGroupField.Equals(1) && !x.IsCustomGroupPrimary))
{
if (updatedTable.Columns.Contains(col.FieldName) && originalDataTable.Columns.Contains(col.FieldName))
{
newOriginalRow[col.FieldName] = updatedRow[col.FieldName];
}
}
if (originalDataTable.Columns.Contains(subField.FieldName))
{
newOriginalRow[subField.FieldName] = updatedValue;
}
originalDataTable.Rows.Add(newOriginalRow);
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("保存失败:" + ex.Message);
}
}
/// <summary> /// <summary>
/// <para>说明:单元格合并</para> /// <para>说明:单元格合并</para>
@@ -6554,7 +6642,200 @@ namespace Lskj.Control
} }
} }
} }
// 调用动态构建方法
if (CustomGroupBandEx != null)
{
DataTable currentDataSource = gridView.GridControl.DataSource as DataTable;
if (currentDataSource != null)
{
BuildDynamicGroupedColumns(CustomGroupBandEx, currentDataSource);
}
}
} }
/// <summary>
/// 构建多表头格式
/// </summary>
/// <param name="bandedGridControlEx"></param>
/// <param name="originalDataSource"></param>
private void BuildDynamicGroupedColumns(BandedGridControlEx bandedGridControlEx, DataTable originalDataSource)
{
// 数据源改变时必须重复执行此逻辑
bandedGridControlEx.BandedView.OptionsView.ColumnAutoWidth = false;
// 获取你的定义的主键、分组列、聚合数据列
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();
if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any())
return; // 数据不足直接退出
// 清理现有结构
bandedGridControlEx.BandedView.Bands.Clear();
bandedGridControlEx.BandedView.Columns.Clear();
// 保留其他非聚合列
List<GridColumnModel> normalColumns = ColumnList.Where(o => !o.IsCustomGroupPrimary && o.IsCustomGroupField == 0).ToList();
// 创建正常列的Band
GridBand normalBand = new GridBand() { Caption = "基本信息" };
bandedGridControlEx.BandedView.Bands.Add(normalBand);
// 添加正常列到Band中
foreach (var normalCol in normalColumns)
{
if (originalDataSource.Columns.Contains(normalCol.FieldName))
{
BandedGridColumn col = new BandedGridColumn()
{
FieldName = normalCol.FieldName,
Caption = normalCol.FieldText,
Width = normalCol.Width,
Visible = true,
Tag = normalCol,
MinWidth = normalCol.Width,
MaxWidth = normalCol.Width,
OptionsColumn = { FixedWidth = true } // <-- 明确设置此属性
};
normalBand.Columns.Add(col);
bandedGridControlEx.BandedView.Columns.Add(col);
}
}
// 动态获取需要聚合的列
var dynamicHeaders = originalDataSource.AsEnumerable()
.Select(r => r.Field<string>(GroupFieldprimary.FieldName))
.Distinct().Where(x => !string.IsNullOrEmpty(x)).ToList();
// 为每个动态表头生成GridBand,并添加子列
foreach (string headerName in dynamicHeaders)
{
GridBand dynamicBand = new GridBand() { Caption = headerName };
bandedGridControlEx.BandedView.Bands.Add(dynamicBand);
foreach (var subField in GroupField)
{
string dynamicFieldName = $"{headerName}_{subField.FieldName}";
BandedGridColumn subColumn = new BandedGridColumn()
{
FieldName = dynamicFieldName,
Caption = subField.FieldText,
Visible = true,
Tag = subField,
Width = subField.Width, // 如果有特定宽度也可以赋值,若无则忽略
OptionsColumn = { FixedWidth = true } // <-- 明确设置固定宽度
};
dynamicBand.Columns.Add(subColumn);
bandedGridControlEx.BandedView.Columns.Add(subColumn);
}
}
// 构建最终动态数据源
DataTable dynamicDataTable = BuildDynamicDataSource(originalDataSource, GroupPrimary, GroupFieldprimary, GroupField, normalColumns, dynamicHeaders);
bandedGridControlEx.gridControl.DataSource = dynamicDataTable;
// 最后再强制刷新布局
bandedGridControlEx.BandedView.LayoutChanged();
}
/// <summary>
/// 构建数据源
/// </summary>
/// <param name="originalDataSource"></param>
/// <param name="GroupPrimary"></param>
/// <param name="GroupFieldprimary"></param>
/// <param name="GroupField"></param>
/// <param name="normalColumns"></param>
/// <param name="dynamicHeaders"></param>
/// <returns></returns>
private DataTable BuildDynamicDataSource(DataTable originalDataSource,
GridColumnModel GroupPrimary,
GridColumnModel GroupFieldprimary,
List<GridColumnModel> GroupField,
List<GridColumnModel> normalColumns,
List<string> dynamicHeaders)
{
try
{
DataTable dtResult = new DataTable();
// 添加主键列
if (!dtResult.Columns.Contains(GroupPrimary.FieldName))
dtResult.Columns.Add(GroupPrimary.FieldName, typeof(string));
// 添加普通列,仅当原数据源存在时才添加
foreach (var col in normalColumns)
{
if (originalDataSource.Columns.Contains(col.FieldName))
dtResult.Columns.Add(col.FieldName, typeof(string));
}
// 添加动态列 (改为string类型避免异常)
foreach (string header in dynamicHeaders)
{
foreach (var subField in GroupField)
{
string dynamicFieldName = $"{header}_{subField.FieldName}";
if (!dtResult.Columns.Contains(dynamicFieldName))
dtResult.Columns.Add(dynamicFieldName, typeof(string)); // <-- 此处已修改为string
}
}
// 根据主键聚合数据
var groupedData = originalDataSource.AsEnumerable()
.GroupBy(row => row.Field<string>(GroupPrimary.FieldName));
foreach (var group in groupedData)
{
DataRow newRow = dtResult.NewRow();
// 主键列赋值
DataRow firstRow = group.First();
newRow[GroupPrimary.FieldName] = firstRow[GroupPrimary.FieldName];
// 普通列赋值(需判断原数据源中存在)
foreach (var col in normalColumns)
{
if (originalDataSource.Columns.Contains(col.FieldName))
newRow[col.FieldName] = firstRow[col.FieldName];
}
// 动态聚合列赋值
foreach (var header in dynamicHeaders)
{
var matchedRow = group.FirstOrDefault(r => r.Field<string>(GroupFieldprimary.FieldName) == header);
foreach (var subField in GroupField)
{
string dynamicFieldName = $"{header}_{subField.FieldName}";
object value = DBNull.Value;
if (matchedRow != null && originalDataSource.Columns.Contains(subField.FieldName))
{
value = matchedRow[subField.FieldName]?.ToString(); // 明确转换为string,避免类型错误
}
newRow[dynamicFieldName] = value;
}
}
dtResult.Rows.Add(newRow);
}
return dtResult;
}
catch (Exception ex)
{
// 最好将异常记录下来
Console.WriteLine(ex.Message);
return null;
}
}
#endregion #endregion
#region #region