SVN r401
SVN-Revision: r401
This commit is contained in:
@@ -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 绑定表格树结构弹出框
|
||||||
|
|||||||
Reference in New Issue
Block a user