SVN r902
SVN-Revision: r902
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user