diff --git a/插件库/Lskj.ProductSched/FrmProductSched.cs b/插件库/Lskj.ProductSched/FrmProductSched.cs index 7f184c5..ab793e3 100644 --- a/插件库/Lskj.ProductSched/FrmProductSched.cs +++ b/插件库/Lskj.ProductSched/FrmProductSched.cs @@ -58,7 +58,7 @@ namespace Lskj.ProductiSched InitControlEvents(); SetControlData(); } - + /// /// 获取数据 @@ -1990,85 +1990,109 @@ namespace Lskj.ProductiSched } // **5. 一次性填充 DataTable(避免逐行赋值带来的性能问题)** - foreach (DataRow row in dataMain.Rows) - { - string key = row[topPrimaryKey].ToString(); - if (dataMap.ContainsKey(key)) - { - foreach (var col in dataMap[key]) - { - row[col.Key] = col.Value; - } - } - } - // **6. 解决渲染问题** bandGcTop.rowDateValues.Clear(); if (!dataMain.Columns.Contains("PrecomputedMaxDate")) { dataMain.Columns.Add("PrecomputedMaxDate", typeof(string)); } - // 遍历所有行 for (int rowIndex = 0; rowIndex < dataMain.Rows.Count; rowIndex++) { DataRow row = dataMain.Rows[rowIndex]; - var validDateColumns = new List(); - - // 遍历当前行所有列 - foreach (DataColumn column in dataMain.Columns) + List validDateColumns = new List(); + bandGcTop.rowDateValues[rowIndex] = validDateColumns; + string key = row[topPrimaryKey].ToString(); + if (dataMap.ContainsKey(key)) { - var cellValue = row[column]?.ToString(); - - // 检查单元格值是否不为空,且可解析为日期格式 - if (!string.IsNullOrEmpty(cellValue) && DateTime.TryParse(column.ToString(), out DateTime newDate)) + foreach (var col in dataMap[key]) { - if(!validDateColumns.Contains(newDate))validDateColumns.Add(newDate); + DataColumn column = row.Table.Columns[col.Key]; + var cellValue = col.Value; + row[column] = cellValue; + // 检查列可解析为日期格式 + if (cellValue > 0 && DateTime.TryParse(column.ToString(), out DateTime newDate)) + { + if (!validDateColumns.Contains(newDate)) + { + validDateColumns.Add(newDate); + } + } } } - // 将当前行索引和有效日期列的集合添加到字典中 - bandGcTop.rowDateValues[rowIndex] = validDateColumns; // 赋值操作,确保为字符串格式 - row["PrecomputedMaxDate"] = validDateColumns.Count>0?validDateColumns.Max().ToString("yyyy-MM-dd"):""; + row["PrecomputedMaxDate"] = validDateColumns.Count > 0 ? validDateColumns.Max().ToString("yyyy-MM-dd") : ""; } - //if (!dataMain.Columns.Contains("PrecomputedMaxDate")) - //{ - // dataMain.Columns.Add("PrecomputedMaxDate", typeof(string)); - //} - - //foreach (DataRow row in dataMain.Rows) - //{ - // DateTime? maxDate = null; // 初始化为 null,表示尚未找到有效日期 - // foreach (DataColumn column in row.Table.Columns) - // { - // // 检查列是否为日期类型,这里假设您已确保列名适当反映了它们是日期类型 - // if (DateTime.TryParse(column.ToString(), out DateTime tempDate)) - // { - // if (!string.IsNullOrEmpty(row[column] + "")) // 只有在找到更大的日期时才更新 - // { - // if (maxDate == null || tempDate > maxDate) - // { - // maxDate = tempDate; - // } - // } - // } - // } - // // 赋值操作,确保为字符串格式 - // row["PrecomputedMaxDate"] = maxDate.HasValue ? maxDate.Value.ToString("yyyy-MM-dd") : ""; - //} + dataMain.ColumnChanged += OnDataMainColumnChanged; return dataMain; } - /// - /// 构建带日期的数据源 - /// - /// - /// - /// - /// - private void UpdateRowWithDayPlan(DataRow focusedRow, DataTable dataDayPlan, DateTime startDate) + + /// + /// 数据值改变时 + /// + /// + /// + private void OnDataMainColumnChanged(object sender, DataColumnChangeEventArgs e) + { + DataTable dataMain = (DataTable)sender; + if (e.Column.ColumnName.Equals("PrecomputedMaxDate")) + { + return; + } + if (dataMain != null && dataMain.Columns.Contains("PrecomputedMaxDate")) + { + var value = e.Row[e.Column]; + int rowHandle = dataMain.Rows.IndexOf(e.Row); + DateTime? maxDate = null; // 初始化为 null,表示尚未找到有效日期 + bool isdatefile = DateTime.TryParse(e.Column.ColumnName, out DateTime tempDate);//获取改变当前列日期 + bool isMaxDatefile = bandGcTop.rowDateValues.TryGetValue(rowHandle, out List currentRowDateColumns);//获取记录日期 + if (isdatefile) + { + if (isMaxDatefile && currentRowDateColumns.Count > 0) + { + List mvalidDateColumns = bandGcTop.rowDateValues[rowHandle]; + if (tempDate > currentRowDateColumns.Max()) // 只有在找到更大的日期时才更新 + { + if (decimal.TryParse(value + "", out decimal dValue) && dValue > 0) + { + mvalidDateColumns.Add(tempDate); + e.Row["PrecomputedMaxDate"] = tempDate.ToString("yyyy-MM-dd"); + } + } + else if (tempDate == currentRowDateColumns.Max() && string.IsNullOrEmpty(value + "")) + { + bandGcTop.rowDateValues[rowHandle].Remove(tempDate); + e.Row["PrecomputedMaxDate"] = currentRowDateColumns.Count > 0 ? currentRowDateColumns.Max().ToString("yyyy-MM-dd") : ""; + } + else + { + if (!mvalidDateColumns.Contains(tempDate)) + { + mvalidDateColumns.Add(tempDate); + } + e.Row["PrecomputedMaxDate"] = tempDate.ToString("yyyy-MM-dd"); + } + } + else if (decimal.TryParse(value + "", out decimal dValue) && dValue > 0) + { + bandGcTop.rowDateValues[rowHandle].Add(tempDate); + e.Row["PrecomputedMaxDate"] = tempDate.ToString("yyyy-MM-dd"); + } + } + } + } + + /// + /// 构建带日期的数据源 + /// + /// + /// + /// + /// + private void UpdateRowWithDayPlan(DataRow focusedRow, DataTable dataDayPlan, DateTime startDate) { string rightPrimaryKey = DataModel.RightModuleModel.ParmaryKey; string topPrimaryKey = DataModel.TopModuleModel.ParmaryKey; DateTime endDate = startDate.AddMonths(3).AddDays(-1); // 计算结束日期 - // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** + // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** Dictionary> dayPlanMap = new Dictionary>(); foreach (DataRow row in dataDayPlan.Rows) {