From e6ec3e4886371d65d996370e0bb349922fe775a1 Mon Sep 17 00:00:00 2001 From: cyf Date: Thu, 7 Aug 2025 09:29:22 +0000 Subject: [PATCH] SVN r924 SVN-Revision: r924 --- 插件库/Lskj.Control/AuditPanel2.cs | 125 +- 插件库/Lskj.Control/AuditPanelEx.cs | 44 +- 插件库/Lskj.Control/BaseUserControl.cs | 27 +- .../Lskj.Control/BrowserSetting/BsClient.cs | 8 +- 插件库/Lskj.Control/FrmBackSelectEx.cs | 5 + .../FrmPositioningColumn.Designer.cs | 82 + 插件库/Lskj.Control/FrmPositioningColumn.cs | 65 + 插件库/Lskj.Control/FrmPositioningColumn.resx | 120 + .../Lskj.Control/FrmProductSched.Designer.cs | 218 ++ 插件库/Lskj.Control/FrmProductSched.cs | 2636 +++++++++++++++++ 插件库/Lskj.Control/FrmProductSched.resx | 120 + 插件库/Lskj.Control/GridControlEx.cs | 372 ++- 插件库/Lskj.Control/LabelAutoGridLook.cs | 52 +- .../Lskj.Control/LabelMultiAutoTextEdit4.cs | 56 +- 插件库/Lskj.Control/Model/ControlModel.cs | 10 +- 插件库/Lskj.Control/Model/GridDetailModel.cs | 13 +- 插件库/Lskj.Control/Model/GridDragGrid.cs | 92 +- 插件库/Lskj.Control/Model/GridExtend.cs | 8 +- .../Model/MenuStrip/BaseMenuStrip.cs | 18 +- 插件库/Lskj.Control/Model/MyControl.cs | 55 +- 插件库/Lskj.Control/ModuleGridDetailEx.cs | 64 +- 插件库/Lskj.Control/ModuleGridEx.cs | 80 +- 插件库/Lskj.Control/ModulePanelEx.cs | 5 + 插件库/Lskj.Control/TabControlEx.cs | 59 +- 插件库/Lskj.Control/TabMultipledetails.cs | 36 +- .../Lskj.Control/TreeBandedGridControlEx.cs | 103 +- 插件库/Lskj.Control/TreeGridControlEx.cs | 92 +- 27 files changed, 4288 insertions(+), 277 deletions(-) create mode 100644 插件库/Lskj.Control/FrmPositioningColumn.Designer.cs create mode 100644 插件库/Lskj.Control/FrmPositioningColumn.cs create mode 100644 插件库/Lskj.Control/FrmPositioningColumn.resx create mode 100644 插件库/Lskj.Control/FrmProductSched.Designer.cs create mode 100644 插件库/Lskj.Control/FrmProductSched.cs create mode 100644 插件库/Lskj.Control/FrmProductSched.resx diff --git a/插件库/Lskj.Control/AuditPanel2.cs b/插件库/Lskj.Control/AuditPanel2.cs index e268668..6e47229 100644 --- a/插件库/Lskj.Control/AuditPanel2.cs +++ b/插件库/Lskj.Control/AuditPanel2.cs @@ -556,30 +556,31 @@ namespace Lskj.Control item.GridControlObj.SetReadOnlyColumns(dtColumns, modelkeyName + key); // 追加复选框用于批量审批 - if (item.GridControlObj.GridView.Columns.FirstOrDefault(x => "_check".Equals(x.Name)) == null && (BaseAccraditModelObj.MuitlAuditFlag || BaseAccraditModelObj.MuitlAuditBackFlag)) + if ( BaseAccraditModelObj.MuitlAuditFlag || BaseAccraditModelObj.MuitlAuditBackFlag) { - GridColumn checkColumn = new GridColumn(); - checkColumn.Name = checkColumn.FieldName = "_check"; - checkColumn.Caption = "选"; - checkColumn.Width = 30; - checkColumn.Visible = true; - checkColumn.VisibleIndex = 0; - checkColumn.OptionsColumn.AllowEdit = false; - item.GridControlObj.GridView.Columns.Insert(0, checkColumn); - item.GridControlObj.GridView.RowCellClick += new RowCellClickEventHandler(OnGridViewRowCellClick); + GridDragGrid.GridAddCheckBox(item.GridControlObj.GridView); + //GridColumn checkColumn = new GridColumn(); + //checkColumn.Name = checkColumn.FieldName = "_check"; + //checkColumn.Caption = "选"; + //checkColumn.Width = 30; + //checkColumn.Visible = true; + //checkColumn.VisibleIndex = 0; + //checkColumn.OptionsColumn.AllowEdit = false; + //item.GridControlObj.GridView.Columns.Insert(0, checkColumn); + //item.GridControlObj.GridView.RowCellClick += new RowCellClickEventHandler(OnGridViewRowCellClick); } item.GridControlObj.SetGridViewDataSource(BaseImpl.GetDataTableResult(item.AuditModel.StepSql)); item.GridControlObj.GridView.RowClick += new DevExpress.XtraGrid.Views.Grid.RowClickEventHandler(OnPcgridRowCellClick); // 为表格增加一列复选框列 DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; - if (table != null && !table.Columns.Contains("_check") && (BaseAccraditModelObj.MuitlAuditFlag || BaseAccraditModelObj.MuitlAuditBackFlag)) - { - table.Columns.Add("_check", typeof(bool)); - foreach (DataRow row in table.Rows) - { - row["_check"] = 0; - } - } + //if (table != null && !table.Columns.Contains("_check") && (BaseAccraditModelObj.MuitlAuditFlag || BaseAccraditModelObj.MuitlAuditBackFlag)) + //{ + // table.Columns.Add("_check", typeof(bool)); + // foreach (DataRow row in table.Rows) + // { + // row["_check"] = 0; + // } + //} //item.GridControlObj.GridView.DataSourceChanged += new EventHandler(OnPcgridRowFocusedRowChanged); cnt += item.GridControlObj.GridView.RowCount; Application.DoEvents(); @@ -1421,16 +1422,41 @@ namespace Lskj.Control this.ControlObj.SetRequiredControl(fieldName, RequiredFields.Split(',').Contains(fieldName), false); } } + //判断操作字段和字段的权限(没测试,先不开放) + //DataTable AuthorityTable = PowerImpl.GetModuleAuthorityEnable(this.SysModel.ModuleCode); + //foreach (DataRow dr in this._dtBillInfoFiled.Rows) + //{ + // string fieldName = dr["fieldName"] + ""; + // BaseUserControl control = this.ControlObj.FindControl(fieldName); + // if (string.IsNullOrWhiteSpace(control.Model.PrivilegeOper)) + // { + // //没有人员权限,转成可编辑 + // this.ControlObj.SetReadOnlyControl(fieldName, !billFields.Split(',').Contains(fieldName), false); + // } + // else + // { + // List targetPrivTypeIds = new List(); + // foreach (string permission in control.Model.PrivilegeOper.Split(',')) + // { + // targetPrivTypeIds.Add(int.Parse(permission)); + // } + // //获取权限对应的人员名称 + // string userString = string.Join(",", AuthorityTable.AsEnumerable() + // .Where(row => targetPrivTypeIds.Contains(row.Field("privTypeId"))) + // .Select(row => row.Field("userList")) + // .Where(value => value != null) + // .ToList()) + ","; + // //有权限的字段,转成可编辑 + // if (userString.Contains(ERPInfo.Instance.UserName + ",") || ERPInfo.Instance.UserName.Equals("管理员")) this.ControlObj.SetReadOnlyControl(fieldName, !billFields.Split(',').Contains(fieldName), false); ; + // } + //} //操作字段 foreach (DataRow dr in this._dtBillInfoFiled.Rows) { string fieldName = dr["fieldName"] + ""; this.ControlObj.SetReadOnlyControl(fieldName, !billFields.Split(',').Contains(fieldName), false); } - - - } } #endregion @@ -1656,14 +1682,20 @@ namespace Lskj.Control { foreach (TabPageItemObj item in tab.TabPageItemObjs) { - DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; - foreach (DataRow row in table.Rows) + int[] mSelectRows = item.GridControlObj.GridView.GetSelectedRows(); + foreach (int itemIndex in mSelectRows) { - if ("1".Equals(row["_check"] + "") || "true".Equals(row["_check"] + "", StringComparison.OrdinalIgnoreCase)) - { - rowItems.Add(row); - } + DataRow selectRow = item.GridControlObj.GridView.GetDataRow(itemIndex); + rowItems.Add(selectRow); } + //DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; + //foreach (DataRow row in table.Rows) + //{ + // if ("1".Equals(row["_check"] + "") || "true".Equals(row["_check"] + "", StringComparison.OrdinalIgnoreCase)) + // { + // rowItems.Add(row); + // } + //} } } } @@ -2170,14 +2202,20 @@ namespace Lskj.Control { foreach (TabPageItemObj item in tab.TabPageItemObjs) { - DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; - foreach (DataRow row in table.Rows) + int[] mSelectRows = item.GridControlObj.GridView.GetSelectedRows(); + foreach (int itemIndex in mSelectRows) { - if ("1".Equals(row["_check"] + "") || "true".Equals(row["_check"] + "", StringComparison.OrdinalIgnoreCase)) - { - rowItems.Add(row); - } + DataRow selectRow = item.GridControlObj.GridView.GetDataRow(itemIndex); + rowItems.Add(selectRow); } + //DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; + //foreach (DataRow row in table.Rows) + //{ + // if ("1".Equals(row["_check"] + "") || "true".Equals(row["_check"] + "", StringComparison.OrdinalIgnoreCase)) + // { + // rowItems.Add(row); + // } + //} } } } @@ -2737,17 +2775,22 @@ namespace Lskj.Control int cnt = 0; foreach (TabPageItemObj item in tab.TabPageItemObjs) { + int oldRowHandle = item.GridControlObj.GridView.FocusedRowHandle; item.GridControlObj.SetGridViewDataSource(BaseImpl.GetDataTableResult(item.AuditModel.StepSql)); cnt += item.GridControlObj.GridView.RowCount; // 为表格增加一列复选框列 - DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; - if (table != null && !table.Columns.Contains("_check")) + //DataTable table = item.GridControlObj.gridControl.DataSource as DataTable; + //if (table != null && !table.Columns.Contains("_check")) + //{ + // table.Columns.Add("_check", typeof(bool)); + // foreach (DataRow row in table.Rows) + // { + // row["_check"] = 0; + // } + //} + if (!(BaseAccraditModelObj.MuitlAuditFlag || BaseAccraditModelObj.MuitlAuditBackFlag)) { - table.Columns.Add("_check", typeof(bool)); - foreach (DataRow row in table.Rows) - { - row["_check"] = 0; - } + item.GridControlObj.GridView.SelectRowHandler(oldRowHandle); } Application.DoEvents(); } @@ -3104,7 +3147,7 @@ namespace Lskj.Control if (!string.IsNullOrEmpty(mRecordPrimaryField) && table.Columns.Contains(this.mRecordPrimaryField)) { // 检查数据是否为分配后的行 - if (!string.IsNullOrEmpty(rowItem[this.mRecordPrimaryField] + "")) + if (!string.IsNullOrEmpty(rowItem[this.mRecordPrimaryField] + "") && !this.BillModelObj.IgnoreAllocated) { MessageUtil.Show("该行数据为已分配后的数据,无需分配!"); return; diff --git a/插件库/Lskj.Control/AuditPanelEx.cs b/插件库/Lskj.Control/AuditPanelEx.cs index 1d5123d..61b1de0 100644 --- a/插件库/Lskj.Control/AuditPanelEx.cs +++ b/插件库/Lskj.Control/AuditPanelEx.cs @@ -398,8 +398,8 @@ namespace Lskj.Control dtCustomQueryFields = BaseModuleImpl.GetCustomQueryFields(this.BaseAccraditModelObj.OverBackKey); } string tmpsql = this.BaseAccraditModelObj.OverBackSql; - if (!string.IsNullOrWhiteSpace(BaseAccraditModelObj.OverBackOper)) - tmpsql = tmpsql + " and charindex('" + ERPInfo.Instance.UserName + ",','" + BaseAccraditModelObj.OverBackOper + ",')>0"; + //if (!string.IsNullOrWhiteSpace(BaseAccraditModelObj.OverBackOper)) + // tmpsql = tmpsql + " and charindex('" + ERPInfo.Instance.UserName + ",','" + BaseAccraditModelObj.OverBackOper + ",')>0"; this._searchContrl = new MyControl(tmpsql, this.gridFinish); this.pl_top.Height = this._searchContrl.InitSearchControl(dtCustomQueryFields, this.pl_top); } @@ -581,7 +581,7 @@ namespace Lskj.Control { accrModel = new AccraditationModel(flowList.Rows[i - 1]); } - string key = "FLOWSTEP_" + this.SysModel.ModuleCode + "_" + model.StepCode + "_" + accrModel.Id + ""; + string key = "FLOWSTEP_" + this.SysModel.ModuleCode + "_" + accrModel.StepCode + "_" + accrModel.Id + ""; gridPanel.Padding = new System.Windows.Forms.Padding(2); gridPanel.Dock = DockStyle.Right; gridPanel.BorderStyle = BorderStyles.NoBorder; @@ -719,7 +719,11 @@ namespace Lskj.Control DataTable dataSourceTable = BaseImpl.GetDataTableResult(item.AuditModel.StepSql); item.GridControlObj.SetGridViewDataSource(dataSourceTable); item.LabelObj.Text = item.AuditModel.CurstepName + " (" + string.Format(ResourceKeys.RowCountRecond, item.GridControlObj.GridView.RowCount) + " )"; - item.GridControlObj.GridView.SelectRowHandler(oldRowHandle); + if (!(BaseAccraditModelObj.MuitlAuditFlag || BaseAccraditModelObj.MuitlAuditBackFlag)) + { + item.GridControlObj.GridView.SelectRowHandler(oldRowHandle); + } + cnt += item.GridControlObj.GridView.RowCount; } tab.TabPage.Text = tab.FlowStepModel.StepGroup + "(" + cnt + ")"; @@ -1780,34 +1784,4 @@ namespace Lskj.Control /// /// 说明:设置分割条位置 /// 创建人:龚宇超 - /// 创建日期:2018-02-01 - /// 修改人: - /// 修改日期: - /// 修改备注: - /// 版本:1.0 - /// - protected void InitlizeSpiltLocation() - { - try - { - if (splitBelow.PanelVisibility == SplitPanelVisibility.Both) - { - string width = IniHelper.Read(string.Format("BelowDetai_width_{0}", this.SysModel.ModuleCode));//通过Key获取Value值 - if (!string.IsNullOrEmpty(width)) - { - this.splitBelow.SplitterPosition = Convert.ToInt32(width); - - } - } - - } - catch (Exception ex) - { - LogHelper.Instance.WriteError(ex); - string Message = ErrorMessage.PromptErrorMessage(ex); - MessageUtil.Show(Message, ex.Message); - } - } - - } -} \ No newline at end of file + /// 创建日期 \ No newline at end of file diff --git a/插件库/Lskj.Control/BaseUserControl.cs b/插件库/Lskj.Control/BaseUserControl.cs index 2e3df2c..c814863 100644 --- a/插件库/Lskj.Control/BaseUserControl.cs +++ b/插件库/Lskj.Control/BaseUserControl.cs @@ -130,29 +130,4 @@ namespace Lskj.Control /// protected void GetCharWidthMultilingual(Label label, string text, Panel panel) { - //之前只对非中文模式生效,后发现GetCharWidth()方法计算不准确,就改成通用设置 - //Business.Impl.LanguageTranslation.Translatable && - if (text.Length > 0) - { - using (Graphics graphics = label.CreateGraphics()) - { - // 使用TextRenderer而不是Graphics.MeasureString,以匹配Label的文本渲染方式 - Size textSize = TextRenderer.MeasureText(graphics, text, label.Font); - panel.Width= textSize.Width; - } - } - } - - - public BaseUserControl() - { - InitializeComponent(); - } - - public void ModifyDefaultColors(Color color) - { - DefaultLabelForceColor = color; - } - - } -} + \ No newline at end of file diff --git a/插件库/Lskj.Control/BrowserSetting/BsClient.cs b/插件库/Lskj.Control/BrowserSetting/BsClient.cs index 6b73235..cf5d72f 100644 --- a/插件库/Lskj.Control/BrowserSetting/BsClient.cs +++ b/插件库/Lskj.Control/BrowserSetting/BsClient.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Forms; using Xilium.CefGlue; namespace Lskj.Control.BrowserSetting @@ -90,4 +91,9 @@ namespace Lskj.Control.BrowserSetting } else { - BsOpenModuleHandler.OpenRightModule(arg0, ar \ No newline at end of file + BsOpenModuleHandler.OpenRightModule(arg0, arg1, arg2, arg3); + } + } + else if (message.Name.Equals("CloseWin")) + { + \ No newline at end of file diff --git a/插件库/Lskj.Control/FrmBackSelectEx.cs b/插件库/Lskj.Control/FrmBackSelectEx.cs index 2df61be..ae37566 100644 --- a/插件库/Lskj.Control/FrmBackSelectEx.cs +++ b/插件库/Lskj.Control/FrmBackSelectEx.cs @@ -87,6 +87,11 @@ namespace Lskj.Control this.combox_returnStep.TextField = "stepName"; this.combox_returnStep.ValueField = "stepCode"; this.combox_returnStep.SetDataSource(dt); + if (SystemInfo.Instance.FallbackDefaultSelection) + { + this.combox_returnStep.EditText = "0"; + } + } /// /// 说明:确定操作/para> diff --git a/插件库/Lskj.Control/FrmPositioningColumn.Designer.cs b/插件库/Lskj.Control/FrmPositioningColumn.Designer.cs new file mode 100644 index 0000000..2816985 --- /dev/null +++ b/插件库/Lskj.Control/FrmPositioningColumn.Designer.cs @@ -0,0 +1,82 @@ + +namespace Lskj.Control +{ + partial class FrmPositioningColumn + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + DevExpress.XtraGrid.GridLevelNode gridLevelNode2 = new DevExpress.XtraGrid.GridLevelNode(); + this.gridControl = new DevExpress.XtraGrid.GridControl(); + this.gridView = new DevExpress.XtraGrid.Views.Grid.GridView(); + ((System.ComponentModel.ISupportInitialize)(this.gridControl)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.gridView)).BeginInit(); + this.SuspendLayout(); + // + // gridControl + // + this.gridControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.gridControl.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(4); + gridLevelNode2.RelationName = "Level1"; + this.gridControl.LevelTree.Nodes.AddRange(new DevExpress.XtraGrid.GridLevelNode[] { + gridLevelNode2}); + this.gridControl.Location = new System.Drawing.Point(0, 0); + this.gridControl.MainView = this.gridView; + this.gridControl.Margin = new System.Windows.Forms.Padding(4); + this.gridControl.Name = "gridControl"; + this.gridControl.Size = new System.Drawing.Size(535, 309); + this.gridControl.TabIndex = 5; + this.gridControl.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { + this.gridView}); + // + // gridView + // + this.gridView.Appearance.HeaderPanel.Font = new System.Drawing.Font("宋体", 9F); + this.gridView.Appearance.HeaderPanel.Options.UseFont = true; + this.gridView.Appearance.HeaderPanel.Options.UseTextOptions = true; + this.gridView.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; + this.gridView.Appearance.HeaderPanel.TextOptions.WordWrap = DevExpress.Utils.WordWrap.Wrap; + this.gridView.Appearance.Preview.Font = new System.Drawing.Font("宋体", 9F); + this.gridView.Appearance.Preview.Options.UseFont = true; + this.gridView.Appearance.Row.Font = new System.Drawing.Font("宋体", 9F); + this.gridView.Appearance.Row.Options.UseBackColor = true; + this.gridView.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Flat; + this.gridView.GridControl = this.gridControl; + this.gridView.IndicatorWidth = 40; + this.gridView.Name = "gridView"; + this.gridView.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.True; + this.gridView.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.False; + this.gridView.OptionsFilter.ShowAllTableValuesInCheckedFilterPopup = false; + this.gridView.OptionsFilter.ShowAllTableValuesInFilterPopup = true; + this.gridView.OptionsFind.FindNullPrompt = ""; + this.gridView.OptionsSelection.MultiSelect = true; + this.gridView.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CellSelect; + this.gridView.OptionsView.AllowHtmlDrawHeaders = true; + this.gridView.OptionsView.ColumnAutoWidth = false; + this.gridView.OptionsView.ColumnHeaderAutoHeight = DevExpress.Utils.DefaultBoolean.True; + this.gridView.OptionsView.RowAutoHeight = true; + this.gridView.OptionsView.ShowGroupPanel = false; + this.gridView.PaintStyleNam \ No newline at end of file diff --git a/插件库/Lskj.Control/FrmPositioningColumn.cs b/插件库/Lskj.Control/FrmPositioningColumn.cs new file mode 100644 index 0000000..d3c6fa4 --- /dev/null +++ b/插件库/Lskj.Control/FrmPositioningColumn.cs @@ -0,0 +1,65 @@ +using DevExpress.XtraGrid.Columns; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Lskj.Control +{ + public partial class FrmPositioningColumn : BaseForm + { + /// + /// 显示列的列名和对应名称 + /// + public Dictionary ColumnInformation = new Dictionary(); + /// + /// 查找列名称 + /// + public string FindName; + + public FrmPositioningColumn() + { + InitializeComponent(); + } + + public FrmPositioningColumn(Dictionary columnInformation) + { + InitializeComponent(); + this.ColumnInformation = columnInformation; + this.CreateColumn(); + + this.gridView.DoubleClick += GridView_DoubleClick; + } + + + + private void CreateColumn() + { + GridColumn Caption = new GridColumn(); + Caption.Caption = "用户名称"; + Caption.FieldName = "Caption"; + Caption.MinWidth = 38; + Caption.Visible = true; + Caption.VisibleIndex = 1; + Caption.Width = 100; + Caption.OptionsColumn.AllowEdit = false; + + GridColumn FieldName = new GridColumn(); + FieldName.Caption = "系统名称"; + FieldName.FieldName = "FieldName"; + FieldName.MinWidth = 38; + FieldName.Visible = true; + FieldName.VisibleIndex = 0; + FieldName.Width = 150; + FieldName.OptionsColumn.AllowEdit = false; + + this.gridView.Columns.AddRange(new GridColumn[] { + FieldName, + Caption, + }); + + // 初始 \ No newline at end of file diff --git a/插件库/Lskj.Control/FrmPositioningColumn.resx b/插件库/Lskj.Control/FrmPositioningColumn.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.Control/FrmPositioningColumn.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.Control/FrmProductSched.Designer.cs b/插件库/Lskj.Control/FrmProductSched.Designer.cs new file mode 100644 index 0000000..5e6cb03 --- /dev/null +++ b/插件库/Lskj.Control/FrmProductSched.Designer.cs @@ -0,0 +1,218 @@ + +namespace Lskj.Control +{ + partial class FrmProductSched + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.pl_main = new DevExpress.XtraEditors.PanelControl(); + this.splitMainControl = new DevExpress.XtraEditors.SplitContainerControl(); + this.splitLeftControl = new DevExpress.XtraEditors.SplitContainerControl(); + this.pltopmain = new DevExpress.XtraEditors.PanelControl(); + this.bandGcTop = new Lskj.Control.BandedGridControlEx(); + this.treebandGcTop = new Lskj.Control.TreeBandedGridControlEx(); + this.pl_mainSearch = new DevExpress.XtraEditors.PanelControl(); + this.pl_search = new DevExpress.XtraEditors.PanelControl(); + this.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.btnSave = new DevExpress.XtraEditors.SimpleButton(); + this.gcRight = new Lskj.Control.ModuleGridEx(); + this.tabBottom = new Lskj.Control.TabControlEx(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main)).BeginInit(); + this.pl_main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitMainControl)).BeginInit(); + this.splitMainControl.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitLeftControl)).BeginInit(); + this.splitLeftControl.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pltopmain)).BeginInit(); + this.pltopmain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_mainSearch)).BeginInit(); + this.pl_mainSearch.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_search)).BeginInit(); + this.flowLayoutPanel.SuspendLayout(); + this.SuspendLayout(); + // + // pl_main + // + this.pl_main.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main.Appearance.Options.UseBackColor = true; + this.pl_main.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main.Controls.Add(this.splitMainControl); + this.pl_main.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_main.Location = new System.Drawing.Point(0, 0); + this.pl_main.LookAndFeel.UseDefaultLookAndFeel = false; + this.pl_main.Name = "pl_main"; + this.pl_main.Size = new System.Drawing.Size(1317, 679); + this.pl_main.TabIndex = 11; + // + // splitMainControl + // + this.splitMainControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitMainControl.Location = new System.Drawing.Point(0, 0); + this.splitMainControl.Margin = new System.Windows.Forms.Padding(2); + this.splitMainControl.Name = "splitMainControl"; + this.splitMainControl.Panel1.Controls.Add(this.splitLeftControl); + this.splitMainControl.Panel1.Text = "Panel1"; + this.splitMainControl.Panel2.Controls.Add(this.gcRight); + this.splitMainControl.Panel2.Text = "Panel2"; + this.splitMainControl.Size = new System.Drawing.Size(1317, 679); + this.splitMainControl.SplitterPosition = 997; + this.splitMainControl.TabIndex = 1; + this.splitMainControl.Text = "splitContainerControl1"; + // + // splitLeftControl + // + this.splitLeftControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitLeftControl.Horizontal = false; + this.splitLeftControl.Location = new System.Drawing.Point(0, 0); + this.splitLeftControl.Margin = new System.Windows.Forms.Padding(2); + this.splitLeftControl.Name = "splitLeftControl"; + this.splitLeftControl.Panel1.Controls.Add(this.pltopmain); + this.splitLeftControl.Panel1.Controls.Add(this.pl_mainSearch); + this.splitLeftControl.Panel1.Text = "Panel1"; + this.splitLeftControl.Panel2.Controls.Add(this.tabBottom); + this.splitLeftControl.Panel2.Text = "Panel2"; + this.splitLeftControl.Size = new System.Drawing.Size(997, 679); + this.splitLeftControl.SplitterPosition = 353; + this.splitLeftControl.TabIndex = 7; + this.splitLeftControl.Text = "splitContainerControl2"; + // + // pltopmain + // + this.pltopmain.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pltopmain.Controls.Add(this.bandGcTop); + this.pltopmain.Controls.Add(this.treebandGcTop); + this.pltopmain.Dock = System.Windows.Forms.DockStyle.Fill; + this.pltopmain.Location = new System.Drawing.Point(0, 0); + this.pltopmain.Name = "pltopmain"; + this.pltopmain.Size = new System.Drawing.Size(997, 320); + this.pltopmain.TabIndex = 22; + // + // bandGcTop + // + this.bandGcTop.AdapterObj = null; + this.bandGcTop.Dock = System.Windows.Forms.DockStyle.Fill; + this.bandGcTop.Location = new System.Drawing.Point(0, 0); + this.bandGcTop.Margin = new System.Windows.Forms.Padding(4); + this.bandGcTop.Name = "bandGcTop"; + this.bandGcTop.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; + this.bandGcTop.Size = new System.Drawing.Size(997, 320); + this.bandGcTop.TabIndex = 17; + // + // treebandGcTop + // + this.treebandGcTop.AdapterObj = null; + this.treebandGcTop.Dock = System.Windows.Forms.DockStyle.Fill; + this.treebandGcTop.Location = new System.Drawing.Point(0, 0); + this.treebandGcTop.Margin = new System.Windows.Forms.Padding(4); + this.treebandGcTop.Name = "treebandGcTop"; + this.treebandGcTop.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; + this.treebandGcTop.Size = new System.Drawing.Size(997, 320); + this.treebandGcTop.TabIndex = 19; + // + // pl_mainSearch + // + this.pl_mainSearch.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_mainSearch.Appearance.Options.UseBackColor = true; + this.pl_mainSearch.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_mainSearch.Controls.Add(this.pl_search); + this.pl_mainSearch.Controls.Add(this.flowLayoutPanel); + this.pl_mainSearch.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pl_mainSearch.Location = new System.Drawing.Point(0, 320); + this.pl_mainSearch.LookAndFeel.UseDefaultLookAndFeel = false; + this.pl_mainSearch.Name = "pl_mainSearch"; + this.pl_mainSearch.Size = new System.Drawing.Size(997, 33); + this.pl_mainSearch.TabIndex = 12; + // + // pl_search + // + this.pl_search.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_search.Appearance.Options.UseBackColor = true; + this.pl_search.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_search.Dock = System.Windows.Forms.DockStyle.Left; + this.pl_search.Location = new System.Drawing.Point(0, 0); + this.pl_search.LookAndFeel.UseDefaultLookAndFeel = false; + this.pl_search.Name = "pl_search"; + this.pl_search.Size = new System.Drawing.Size(221, 33); + this.pl_search.TabIndex = 14; + // + // flowLayoutPanel + // + this.flowLayoutPanel.Controls.Add(this.btnSave); + this.flowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Right; + this.flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + this.flowLayoutPanel.Location = new System.Drawing.Point(825, 0); + this.flowLayoutPanel.Name = "flowLayoutPanel"; + this.flowLayoutPanel.Size = new System.Drawing.Size(172, 33); + this.flowLayoutPanel.TabIndex = 13; + this.flowLayoutPanel.WrapContents = false; + // + // btnSave + // + this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnSave.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSave.Appearance.Options.UseFont = true; + this.btnSave.Location = new System.Drawing.Point(97, 3); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(72, 26); + this.btnSave.TabIndex = 40; + this.btnSave.Text = "保存(&S)"; + + // + // gcRight + // + this.gcRight.Dock = System.Windows.Forms.DockStyle.Fill; + this.gcRight.Location = new System.Drawing.Point(0, 0); + this.gcRight.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.gcRight.Name = "gcRight"; + this.gcRight.Size = new System.Drawing.Size(315, 679); + this.gcRight.TabIndex = 11; + // + // tabBottom + // + this.tabBottom.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabBottom.Location = new System.Drawing.Point(0, 0); + this.tabBottom.Name = "tabBottom"; + this.tabBottom.Size = new System.Drawing.Size(997, 321); + this.tabBottom.TabIndex = 14; + // + // FrmProductSched + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.pl_main); + this.Name = "FrmProductSched"; + this.Size = new System.Drawing.Size(1317, 679); + ((System.ComponentModel.ISupportInitialize)(this.pl_main)).EndInit(); + this.pl_main.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitMainControl)).EndInit(); + this.splitMainControl.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitLeftControl)).EndInit(); + this.splitLeftControl.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pltopmain)).EndInit(); + this.pltopmain.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_mainSearch)).EndInit(); + this.pl_ \ No newline at end of file diff --git a/插件库/Lskj.Control/FrmProductSched.cs b/插件库/Lskj.Control/FrmProductSched.cs new file mode 100644 index 0000000..bdd79d1 --- /dev/null +++ b/插件库/Lskj.Control/FrmProductSched.cs @@ -0,0 +1,2636 @@ +using DevExpress.Data; +using DevExpress.Utils; +using DevExpress.XtraEditors.Controls; +using DevExpress.XtraGrid; +using DevExpress.XtraGrid.Columns; +using DevExpress.XtraGrid.Views.BandedGrid; +using DevExpress.XtraGrid.Views.BandedGrid.ViewInfo; +using DevExpress.XtraGrid.Views.Base; +using DevExpress.XtraGrid.Views.Grid; +using DevExpress.XtraGrid.Views.Grid.ViewInfo; +using DevExpress.XtraTab; +using DevExpress.XtraTreeList; +using DevExpress.XtraTreeList.Columns; +using DevExpress.XtraTreeList.Nodes; +using Lskj.Business; +using Lskj.Business.Impl; +using Lskj.Control; +using Lskj.Control.Model; +using Lskj.Data; +using Lskj.Model; +using Lskj.Util; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Lskj.Control +{ + public partial class FrmProductSched : UserControl + { + + public bool TreeMultiHeader; + public bool isAddBottom; + public Control.BandedGridControlEx bandGcBottom; + public ProductDataModel DataModel; + public FrmProductSched() + { + InitializeComponent(); + } + + + public void InitializeControl(DynamicFrmProductSchedModel mainModel) + { + GetControlData(mainModel); + InitSpiltLocation(); + InitControlView(); + InitControlEvents(); + SetControlData(); + } + + + /// + /// 获取数据 + /// + public void GetControlData(DynamicFrmProductSchedModel mainModel) + { + DataModel = new ProductDataModel(); + DataModel.TopSysModel = mainModel; + DataRow topSysRow = MainImpl.GetSystemdllTab(DataModel.TopSysModel.ModuleCode); + DataModel.TopModuleModel = new ModuleModel(topSysRow); + DataModel.TopModuleModel.ParmaryKey = BaseImpl.GetBasePrimaryKey(DataModel.TopSysModel.ModuleCode); + DataModel.TopGridColumns = BaseModuleImpl.GetBaseGridColumns(DataModel.TopSysModel.ModuleCode); + DataModel.TopRightMenus = BaseModuleImpl.GetBaseGridRightMenus(DataModel.TopModuleModel.FormKey); + DataModel.TopRowColors = BaseModuleImpl.GetBaseGridRowColors(DataModel.TopModuleModel.FormKey); + DataModel.TopSearchTab = BaseModuleImpl.GetCustomQueryFields(DataModel.TopModuleModel.CondKey); + DataModel.TopSchemesTable = BaseModuleImpl.GetSchemesList(DataModel.TopSysModel.ModuleId); + if (DataModel.TopModuleModel.TreeAutoMultiHeader == 1) + { + DataModel.TopSearchObj = new MyControl(DataModel.TopModuleModel.MenuSql, treebandGcTop); + } + else + { + DataModel.TopSearchObj = new MyControl(DataModel.TopModuleModel.MenuSql, bandGcTop); + } + DataModel.TopSearchObj.Model = DataModel.TopSysModel; + DataTable detailsTab = BaseModuleImpl.GetBaseDetailPages(DataModel.TopSysModel.ModuleCode);//明细数据 + List detailsTablist = new List(); + if (detailsTab != null) + { + foreach (DataRow item in detailsTab.Rows) + { + GridDetailModel detailModel = new GridDetailModel(item, null, GridCustomColumnStruct.BaseDetailGridView); + DataTable gridColumns = ReportImpl.GetReportDetailColumns(DataModel.TopSysModel.ModuleCode, item["id"] + "");//获取报表明细列 + detailModel.GridColumns = gridColumns; + if (detailModel.Orderid == -1)//序号为-1固定配置右键 + { + string moduleCode = detailModel.UnionModule; + DataModel.RightDetailModel = detailModel; + DataModel.RightSysModel = new DynamicModel(new string[] { DataModel.TopSysModel.FormText, DataModel.TopSysModel.UserId, DataModel.TopSysModel.UserName, DataModel.TopSysModel.Privilege, moduleCode }); + DataRow sysRow = MainImpl.GetSystemdllTab(DataModel.RightSysModel.ModuleCode); + DataModel.RightModuleModel = new ModuleModel(sysRow); + DataModel.RightModuleModel.ParmaryKey = BaseImpl.GetBasePrimaryKey(DataModel.RightSysModel.ModuleCode); + DataModel.RightGridColumns = BaseModuleImpl.GetBaseGridColumns(DataModel.RightSysModel.ModuleCode); + DataModel.RightRightMenus = BaseModuleImpl.GetBaseGridRightMenus(DataModel.TopModuleModel.FormKey); + DataModel.RightRowColors = BaseModuleImpl.GetBaseGridRowColors(DataModel.TopModuleModel.FormKey); + } + else + { + detailsTablist.Add(detailModel); + } + } + tabBottom.Model = DataModel.TopSysModel; + tabBottom.InitTabPages(detailsTablist); + this.isAddBottom = detailsTablist.Where(o => o.displayMode != 1 && o.rightVisible != 1 && o.Orderid == -2).ToList().Count > 0; + + + } + } + /// + /// 设置数据 + /// + public void SetControlData() + { + + } + /// + /// 初始化控件 + /// + public void InitControlView() + { + //搜索控件 + bool fixedQuery = DataModel.TopSearchTab == null || DataModel.TopSearchTab.Rows.Count == 0; + TreeMultiHeader = DataModel.TopModuleModel.TreeAutoMultiHeader == 1; + if (!fixedQuery) + { + this.pl_mainSearch.Height = DataModel.TopSearchObj.InitSearchControl(DataModel.TopSearchTab, this.pl_search, true, DataModel.TopSchemesTable, DataModel.TopSysModel); + this.pl_search.Width = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Max(n => n.Location.X + n.Width) + 5; + } + //构建树表格 + if (TreeMultiHeader)//若为多表头树表格模式 + { + treebandGcTop.Expansion = "3"; + treebandGcTop.Model = DataModel.TopSysModel; + treebandGcTop.moduleModel = DataModel.TopModuleModel; + treebandGcTop.SetEditColumns(DataModel.TopGridColumns, GridCustomColumnStruct.BaseMainGridView + DataModel.TopModuleModel.FormKey); + treebandGcTop.SetGridRightMenus(BaseModuleImpl.GetBaseGridRightMenus(DataModel.TopModuleModel.ModeCode), DataModel.TopSysModel,this.OnGridViewRightCallBack); + treebandGcTop.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(DataModel.TopModuleModel.ModeCode)); + bandGcTop.Visible = false; + } + else + { + //上方表格 + bandGcTop.Model = DataModel.TopSysModel; + bandGcTop.SetEditColumns(DataModel.TopGridColumns, GridCustomColumnStruct.BaseMainGridView + DataModel.TopModuleModel.FormKey); + bandGcTop.SetGridRightMenus(BaseModuleImpl.GetBaseGridRightMenus(DataModel.TopModuleModel.ModeCode), DataModel.TopSysModel,this.OnGridViewRightCallBack); + bandGcTop.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(DataModel.TopModuleModel.ModeCode)); + bandGcTop.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(DataModel.TopModuleModel.ModeCode)); + treebandGcTop.Visible = false; + } + if (TreeMultiHeader) + { + AddDataColumns(treebandGcTop); + } + else + { + AddDataColumns(bandGcTop); + } + if (DataModel.TopModuleModel.HasReport) + { + flowLayoutPanel.Visible = false; + } + + if (isAddBottom) + { + GridControlEx gridControl = tabBottom.TabControlObj.TabPages[0].Tag as GridControlEx; + bandGcBottom = gridControl as BandedGridControlEx; + AddDataColumns(bandGcBottom); + foreach (GridBand gridBand in bandGcBottom.BandedView.Bands) + { + gridBand.OptionsBand.AllowSize = false; + foreach (BandedGridColumn bandedGridColumn in gridBand.Columns) + { + bandedGridColumn.OptionsColumn.AllowSize = false; + } + } + if (TreeMultiHeader) + { + OnBandedViewColumnWidthChanged(treebandGcTop.TreeListObj, null); + + } + else + { + OnBandedViewColumnWidthChanged(bandGcTop.BandedView, null); + } + } + if (tabBottom.TabControlObj.TabPages.Count == 0) + { + splitLeftControl.PanelVisibility = DevExpress.XtraEditors.SplitPanelVisibility.Panel1; + } + //右侧表格 + if (!string.IsNullOrEmpty(DataModel.RightSysModel.ModuleCode)) + { + DataRow moduleInformation = MainImpl.GetSystemdllTab(DataModel.RightSysModel.ModuleCode); + if (moduleInformation == null) + { + MessageUtil.Show("没有找到编号为" + DataModel.RightSysModel.ModuleCode + "的模块信息"); + return; + } + DataModel.RightDetailModel.SystemModel = new ModuleModel(moduleInformation); + gcRight.OnSaveGridCallBack += OnDetailSaveGridCallBack; + gcRight.Name = "gridEx"; + gcRight.IsDetail = true; + gcRight.Dock = DockStyle.Fill; + gcRight.OperShortMode =false; // 不显示简短模式 + gcRight.VisibleSearchPanel = false; + DataTable rightDt = BaseModuleImpl.GetBaseGridRightMenus(DataModel.RightSysModel.ModuleCode, ModuleType.MrpClickBtn); + gcRight.VisibleOperPanel = !DataModel.RightDetailModel.IsReadOnly; + gcRight.InitializeControl(DataModel.RightDetailModel.SystemModel, DataModel.RightSysModel); + gcRight.GridControlObj.Tag = DataModel.RightDetailModel; + if (DataModel.RightDetailModel.IsCheck == 1)//加载复选框 + { + GridDragGrid.GridAddCheckBox(gcRight.GridControlObj.GridView); + } + } + } + /// + /// 右侧表格保存回调 + /// + /// + /// + private void OnDetailSaveGridCallBack(object sender, EventArgs e) + { + DataModel.TopSearchObj.ButtonObj.PerformClick(); + } + + + + /// + /// 绑定控件事件 + /// + public void InitControlEvents() + { + splitLeftControl.SplitterPositionChanged += OnSplitContainerPositionChanged; + splitMainControl.SplitterPositionChanged += OnSplitContainerPositionChanged; + DataModel.TopSearchObj.OnDataSourceBindCallBack += OnDataSourceBindCallBack; + DataModel.TopSearchObj.OnSearchBeforeCallBack += OnSearchBeforeCallBack; ; + DataModel.TopSearchObj.OnSearchAfterCallBack += OnSearchAfterCallBack; + if (bandGcBottom != null) + { + bandGcBottom.BandedView.LeftCoordChanged += OnBandedViewLeftCoordChanged; + bandGcBottom.BandedView.CustomDrawColumnHeader += OnCustomDrawColumnHeader; + } + if (TreeMultiHeader) + { + // 改为TreeList的事件绑定 + treebandGcTop.TreeListObj.BandWidthChanged += OnBandedViewColumnWidthChanged; + treebandGcTop.TreeListObj.ColumnWidthChanged += OnBandedViewColumnWidthChanged; // 宽度改变事件 + treebandGcTop.TreeListObj.LeftCoordChanged += OnBandedViewLeftCoordChanged; // 水平滚动事件 + treebandGcTop.TreeListObj.FocusedNodeChanged += OnFocusedNodeChanged; // 单元格点击事件 + treebandGcTop.TreeListObj.KeyDown += OnTreeListKeyDown; // 键盘事件 + treebandGcTop.TreeListObj.CustomDrawFooterCell += OnTreeListCustomDrawFooterCell; // 自定义绘制Footer事件 + treebandGcTop.TreeListObj.CustomDrawColumnHeader += OnTreeListCustomDrawColumnHeader; // 自定义绘制列头事件 + treebandGcTop.TreeListObj.ShowingEditor += OnTreeListShowingEditor; // 编辑器显示前事件 + treebandGcTop.TreeListObj.InvalidValueException += OnInvalidValueException; ; + } + else + { + bandGcTop.BandedView.BandWidthChanged += OnBandedViewColumnWidthChanged; + bandGcTop.BandedView.ColumnWidthChanged += OnBandedViewColumnWidthChanged; + bandGcTop.BandedView.LeftCoordChanged += OnBandedViewLeftCoordChanged; + bandGcTop.BandedView.RowCellClick += OnBandedViewRowCellClick; + bandGcTop.BandedView.KeyDown += OnBandedViewKeyDown; + bandGcTop.BandedView.CustomDrawFooterCell += OnCustomDrawFooterCell; + bandGcTop.BandedView.CustomDrawColumnHeader += OnCustomDrawColumnHeader; + bandGcTop.BandedView.ShowingEditor += OnShowingEditor; + bandGcTop.BandedView.InvalidValueException += OnInvalidValueException; + } + btnSave.Click += OnBtnSaveClick; + } + + /// + /// 判断单元格是否可以编辑 + /// + /// + /// + private void OnRightShowingEditor(object sender, CancelEventArgs e) + { + var view = sender as GridView; + if (view == null) return; + + DataRow row = gcRight.GridControlObj.GetViewFocusedDataRow(); + if (row == null) { e.Cancel = true; return; } // 没有行也不让编辑 + + // —— 1. 解析 day 字段 —— + if (!DateTime.TryParse(row["day"]?.ToString(), out DateTime dayDate)) + { + e.Cancel = true; // 无法解析日期 → 禁止编辑 + return; + } + + // —— 2. 超过 7 天的行不可编辑 —— + if (dayDate.AddDays(7) <= DateTime.Today) + { + e.Cancel = true; + return; + } + } + + /// + /// 判断单元格是否可以编辑 + /// + /// + /// + private void OnShowingEditor(object sender, CancelEventArgs e) + { + BandedGridView view = sender as BandedGridView; + if (view == null) return; + if (DataModel.TopModuleModel.HasReport)//报表所有的都不能编辑 + { + e.Cancel = true; // 取消编辑,单元格变灰 + } + DataRow dataRow = view.GetFocusedDataRow(); + if (dataRow == null) return; + string bj_tig = dataRow["bj_tig"]?.ToString() ?? ""; + if (bj_tig == "0") + { + e.Cancel = true; // 取消编辑,单元格变灰 + } + else + { + string billDocumentId = view.GetRowCellValue(view.FocusedRowHandle, DataModel.TopModuleModel.ParmaryKey) + ""; + // 新方式 (精准替代原有取值方式) + DateTime date; + if (DataModel.columnDateMapping.TryGetValue(view.FocusedColumn, out date)) + { + string columnName = date.ToString("yyyy-MM-dd"); + // 检查该行的 billdocument_id 是否在字典中 + if (DataModel.nonEditableCells.ContainsKey(billDocumentId)) + { + HashSet showDays = DataModel.nonEditableCells[billDocumentId]; + + // 如果列名(日期)在 showday_list 里,则禁用编辑 + if (showDays.Contains(columnName)) + { + e.Cancel = true; // 取消编辑,单元格变灰 + } + } + } + } + } + /// + /// 判断TreeList单元格是否可以编辑(精准适配原BandedGridView逻辑) + /// + private void OnTreeListShowingEditor(object sender, CancelEventArgs e) + { + if (DataModel.TopModuleModel.HasReport)//报表所有的都不能编辑 + { + e.Cancel = true; // 取消编辑,单元格变灰 + } + TreeList treeList = sender as TreeList; + string bj_tig = treeList.FocusedNode.GetValue("bj_tig")?.ToString() ?? ""; + if (treeList == null || treeList.FocusedNode == null) return; + if (bj_tig == "0") + { + e.Cancel = true; // 取消编辑,单元格变灰 + } + else + { + string billDocumentId = treeList.FocusedNode.GetValue(DataModel.TopModuleModel.ParmaryKey)?.ToString() ?? ""; + DateTime date; + if (DataModel.columnDateMapping.TryGetValue(treeList.FocusedColumn, out date)) + { + string columnName = date.ToString("yyyy-MM-dd"); + // 检查该行的 billdocument_id 是否在字典中 + if (DataModel.nonEditableCells.ContainsKey(billDocumentId)) + { + HashSet showDays = DataModel.nonEditableCells[billDocumentId]; + + // 如果列名(日期)在 showday_list 里,则禁用编辑 + if (showDays.Contains(columnName)) + { + e.Cancel = true; // 取消编辑,单元格变灰 + } + } + } + } + + } + + /// + /// 保存按钮点击时 + /// + /// + /// + private void OnBtnSaveClick(object sender, EventArgs e) + { + if (TreeMultiHeader) + { + treebandGcTop.GridView.PostEditor(); + } + else + { + bandGcTop.BandedView.PostEditor(); + } + if (!string.IsNullOrEmpty(DataModel.TopModuleModel.MenuTable)) + { + SaveGridRecord(); + } + if (SaveDatePlanRecord()) + { + DataModel.TopSearchObj.ButtonObj.PerformClick(); + } + } + /// + /// 保存主表数据 + /// + /// + public bool SaveGridRecord() + { + string tableName = DataModel.TopModuleModel.MenuTable; + string Autogrowcolumn = BaseImpl.GetResult(string.Format("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='{0}' AND COLUMNPROPERTY(OBJECT_ID('{0}'),COLUMN_NAME,'IsIdentity')=1", tableName)) + ""; + DataTable DatabasePropertySheet = BaseImpl.GetDataTableResult(string.Format("select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from information_schema.columns where table_name = '{0}'", tableName));//数据库属性表 + string SaveErrorMessage = "失败列表:\r\n"; + if (string.IsNullOrEmpty(tableName)) + { + MessageUtil.Show(ResourceKeys.MenuTableNameIsNull); + return false; + } + List mList = new List(); + DataTable dataTable = TreeMultiHeader ? treebandGcTop.GetGridViewDataSource() : bandGcTop.BandedView.GridControl.DataSource as DataTable; + DataRow[] modifiedRows = dataTable + .Rows + .Cast() + .Where(x => x.RowState == DataRowState.Modified || x.RowState == DataRowState.Added) + .ToArray(); + if (modifiedRows == null || modifiedRows.Length == 0) + { + MessageUtil.Show(ResourceKeys.UnUpdateData); + return false; + } + else + { + DataColumnCollection columns = BaseImpl.GetTableColumns(tableName).Columns; + foreach (DataRow row in modifiedRows) + { + string updateSql = "update {0} set {1} where {2}='{3}';"; + string insertSql = "insert into {0}({1}) values({2});"; + string updateFields = string.Empty; + string insertFields = string.Empty; + string insertValues = string.Empty; + BaseSaveModel model = new BaseSaveModel() + { + MenuCode = DataModel.TopSysModel.ModuleCode, + TableName = tableName, + KeyField = DataModel.TopModuleModel.ParmaryKey, + NewVer = DataModel.TopModuleModel.NewVer + }; + foreach (DataColumn col in columns) + { + // 区分大小写匹配列 + DataRow hasContainRow = DataModel.TopGridColumns.Rows.Cast().FirstOrDefault(x => (x["fieldname"] + "").ToLower() == col.ColumnName.ToLower()); + if (hasContainRow != null && col.ColumnName != DataModel.TopModuleModel.ParmaryKey && !col.ColumnName.Equals("id") && Autogrowcolumn.ToLower() != col.ColumnName.ToLower()) + { + if (row.RowState == DataRowState.Modified && string.IsNullOrEmpty(DataModel.TopModuleModel.CustomColumnSQL)) + { + string newValue = row[col.ColumnName, DataRowVersion.Current] + ""; + string oldValue = row[col.ColumnName, DataRowVersion.Original] + ""; + //如果是修改状态,没有改变的值就不拼接,以免造成多人同时修改同一行不同列的值混乱情况 + if (oldValue != newValue) + { + if ((col.DataType == typeof(DateTime)) && (row[col.ColumnName] + "" == "")) + { + updateFields += string.Format("[{0}]=null,", col.ColumnName); + } + else + { + if (col.DataType == typeof(Decimal) && string.IsNullOrWhiteSpace((row[col.ColumnName] + "").Replace("'", "''"))) + { + updateFields += string.Format("[{0}]='{1}',", col.ColumnName, 0); + } + else + { + updateFields += string.Format("[{0}]=N'{1}',", col.ColumnName, (row[col.ColumnName] + "").Replace("'", "''")); + } + } + } + } + else if (row.RowState == DataRowState.Added || (row.RowState == DataRowState.Modified && !string.IsNullOrEmpty(DataModel.TopModuleModel.CustomColumnSQL))) + { + // 动态生成列,保存时默认全部为新增 + string fieldValue = (row[col.ColumnName] + "").Replace("'", "''"); + insertFields += "[" + col.ColumnName + "],"; + if (!string.IsNullOrWhiteSpace(fieldValue)) + { + insertValues += col.DataType == typeof(DateTime) ? "'" + Convert.ToDateTime(fieldValue).ToString("yyyy-MM-dd HH:mm:ss") + "'," : "N'" + fieldValue + "',"; + } + else + { + if (col.DataType == typeof(Decimal) || col.DataType == typeof(Int32)) + insertValues += "0,"; + else if (col.DataType == typeof(DateTime)) + insertValues += "NULL,"; + else + insertValues += "'',"; + } + } + SaveErrorMessage = SaveErrorMessage + DatabaseFormatJudgment.SaveOrModifyBalidation(DataModel.TopGridColumns, DatabasePropertySheet, row, col, (row[col.ColumnName] + "").Replace("'", "''")); + } + } + // 检查是否保存主键字段 + if (row.RowState == DataRowState.Added && !insertFields.Contains(DataModel.TopModuleModel.ParmaryKey) && !"ID".Equals(DataModel.TopModuleModel.ParmaryKey, StringComparison.OrdinalIgnoreCase)) + { + // 跳过自动增长列处理 + if (Autogrowcolumn.ToLower() != DataModel.TopModuleModel.ParmaryKey.ToLower()) + { + insertFields += DataModel.TopModuleModel.ParmaryKey + ","; + insertValues += "N'" + row[DataModel.TopModuleModel.ParmaryKey] + "',"; + } + } + updateFields = updateFields.TrimEnd(','); + insertFields = insertFields.TrimEnd(','); + insertValues = insertValues.TrimEnd(','); + if (!string.IsNullOrEmpty(updateFields)) + { + model.FieldValue = row[DataModel.TopModuleModel.ParmaryKey] + ""; + model.BaseSaveType = SaveType.Update; + model.BaseSql = string.Format(updateSql, tableName, updateFields, DataModel.TopModuleModel.ParmaryKey, row[DataModel.TopModuleModel.ParmaryKey]); + } + if (!string.IsNullOrEmpty(insertFields)) + { + model.BaseSaveType = SaveType.Add; + model.FieldValue = row[DataModel.TopModuleModel.ParmaryKey] + ""; + model.BaseSql = string.Format(insertSql, tableName, insertFields, insertValues); + } + if (!string.IsNullOrWhiteSpace(model.BaseSql)) mList.Add(model); + } + try + { + if (mList.Count == 0) + { + return true; + } + string retuenMsg = ""; + string apiRetMsg = ""; + // 批量保存数据 + if (BaseModuleImpl.SaveBaseGridData(mList, out retuenMsg, out apiRetMsg)) + { + return true; + } + else + { + StringBuilder builder = new StringBuilder(); + builder.Append("失败列表\r\n"); + foreach (BaseSaveModel item in mList) + { + if (!string.IsNullOrEmpty(item.FaultMsg)) + SaveErrorMessage += item.FaultMsg + "\r\n"; + } + LogHelper.Instance.WriteLog(builder.ToString()); + MessageUtil.Show(SaveErrorMessage); + return false; + } + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + return false; + } + } + } + /// + /// 保存日期数据 + /// + private bool SaveDatePlanRecord() + { + BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelComboxEdit).Cast().FirstOrDefault(); // 获取第一个符合条件的控件 + string typeDate = "0"; + if (dataTypeControl != null) + { + LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit; + typeDate = labelAutoTextEdit.EditValue; + } + // 获取主数据源,假设已绑定到 gridControl1 + DataTable mainDataSource = TreeMultiHeader ? treebandGcTop.GetGridViewDataSource() : bandGcTop.BandedView.GridControl.DataSourceTable(); + if (mainDataSource == null) + { + return true; + } + // 当前操作用户(例如从全局获取) + string currentUser = ERPInfo.Instance.UserName; + DataTable tvp = new DataTable(); + tvp.Columns.Add("billdocument_id", typeof(string)); + tvp.Columns.Add("showday", typeof(string)); + tvp.Columns.Add("amount", typeof(decimal)); + tvp.Columns.Add("operatorname", typeof(string)); + // 遍历主数据源所有行,仅处理已修改行 + foreach (DataRow row in mainDataSource.Rows) + { + if (row.RowState == DataRowState.Modified) + { + // 获取关联的 keyvalue(用于匹配 mps_dayplantab.billdocument_id) + string key = row["keyvalue"].ToString(); + // 遍历每个列,处理虚拟列(列名格式必须为 "yyyy-MM-dd") + foreach (DataColumn col in mainDataSource.Columns) + { + // 忽略固定字段 + if (col.ColumnName == "ID" || col.ColumnName == "keyvalue" || col.ColumnName == "Name") + continue; + // 仅处理列名符合完整日期格式的虚拟列 + if (!Regex.IsMatch(col.ColumnName, @"^\d{4}-\d{2}-\d{2}$")) + continue; + // 比较原始值和当前值 + object originalValue = row[col, DataRowVersion.Original]; + object currentValue = row[col, DataRowVersion.Current]; + if (!object.Equals(originalValue, currentValue)) + { + decimal newAmount = 0m; + if (row[col] != DBNull.Value && !string.IsNullOrWhiteSpace(row[col].ToString())) + { + decimal.TryParse(row[col].ToString(), out newAmount); + } + DataRow dr = tvp.NewRow(); + dr["billdocument_id"] = key; + dr["showday"] = col.ColumnName; // 列名如 "2025-03-06" + dr["amount"] = newAmount; + dr["operatorname"] = currentUser; + tvp.Rows.Add(dr); + } + } + } + } + if (tvp.Rows.Count == 0) + { + return true; + } + // 调用存储过程保存变更数据 + string msg; + int ret = SaveDayPlanChanges(tvp, typeDate, out msg); + if (ret == 1) + { + MessageUtil.Show("保存成功:" + msg); + return true; + } + else + { + MessageUtil.Show("保存失败:" + msg); + return false; + } + } + /// + /// 保存日计划变更数据(批量保存)。 + /// 调用存储过程 usp_MergeDayPlanChanges,将所有变更记录一次性提交到数据库。 + /// 通过 TVP 参数传递数据,同时捕获输出参数 @msg 和返回值。 + /// + /// 包含所有变更记录的 DataTable,必须与 dbo.DayPlanChangeType 定义一致 + /// 输出提示信息,存储过程执行后的返回消息 + /// 存储过程返回值,成功返回 1,失败返回 0 + public int SaveDayPlanChanges(DataTable tvp, string typeDate, out string message) + { + // 创建输出参数 @msg + SqlParameter pMsg = new SqlParameter("@msg", SqlDbType.VarChar, 2000) + { + Direction = ParameterDirection.Output + }; + + // 创建返回值参数 @return + SqlParameter returnValue = new SqlParameter("@return", SqlDbType.Int) + { + Direction = ParameterDirection.ReturnValue + }; + + // 创建 TVP 参数,名称必须与存储过程参数一致 + SqlParameter tvpParam = new SqlParameter("@DayPlanChanges", SqlDbType.Structured) + { + TypeName = "dbo.DayPlanChangeType", + Value = tvp + }; + + // 创建 typeDate 参数并传入存储过程 + SqlParameter typeDateParam = new SqlParameter("@TypeDate", SqlDbType.VarChar, 10) + { + Value = typeDate + }; + + // 构造参数数组 + SqlParameter[] parameters = new SqlParameter[] { tvpParam, typeDateParam, pMsg, returnValue }; + + // 执行存储过程,此处调用 ExecuteNonQuery 即可,不需要返回数据集 + // 请确保 BaseImpl.ExecProcedure 方法能够传递参数并执行存储过程 + BaseImpl.ExecProcedure("usp_MergeDayPlanChanges", parameters); + + // 获取输出参数 @msg 中的提示信息 + message = pMsg.Value.ToString(); + + // 获取存储过程的返回值 + int result = Convert.ToInt32(returnValue.Value); + return result; + } + + /// + /// 单元格点击刷新当前行数据 + /// + /// + /// + private void OnBandedViewRowCellClick(object sender, RowCellClickEventArgs e) + { + try + { + GridDetailModel model = DataModel.RightDetailModel; + DataRow rowItem = bandGcTop.BandedView.GetFocusedDataRow(); + if (rowItem != null) + { + BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelDateEdit).FirstOrDefault(); + BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelComboxEdit).Cast().FirstOrDefault(); // 获取第一个符合条件的控件 + string typeDate = "0"; + LabelDateEdit labelDateEdit = null; + if (baseUserControl != null) + { + labelDateEdit = baseUserControl as LabelDateEdit; + } + if (dataTypeControl != null) + { + LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit; + typeDate = labelAutoTextEdit.EditValue; + } + string searchSql = this.GetSearchSql(model, rowItem, false); + string isweekcond = DataModel.TopModuleModel.HasReport ? "" : $"and isWeek='{typeDate}'"; + searchSql = $"{ReplaceHelper.ReplaceWhereCond(searchSql)} and day >= '{labelDateEdit.TextEdit.DateTime.ToString("yyyy-MM-dd")}' {isweekcond}"; + + gcRight.GridControlObj.LastSearchSql = searchSql; + // 4) 让 Grid 用这张表,并把 adapter 存起来 + gcRight.GridControlObj.SetGridViewDataSource(BaseImpl.GetDataTableResult(searchSql)); + if (e != null) + { + if (labelDateEdit != null) + { + DateTime dateTime = labelDateEdit.TextEdit.DateTime; + DataRow focusedRow = bandGcTop.BandedView.GetFocusedDataRow(); + DataTable dataDayPlan = gcRight.GridControlObj.GridControl.DataSourceTable().Copy(); + if (DataModel.TopModuleModel.HasReport) UpdateRowWithDayPlan(focusedRow, dataDayPlan, dateTime); + } + } + this.SetDetailGridDataSource(rowItem); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + /// + /// TreeList聚焦节点改变刷新当前行数据(精确移植原点击事件逻辑) + /// + private void OnFocusedNodeChanged(object sender, FocusedNodeChangedEventArgs e) + { + try + { + GridDetailModel model = DataModel.RightDetailModel; + if (e.Node != null) + { + DataRow rowItem = (treebandGcTop.TreeListObj.GetDataRecordByNode(e.Node) as DataRowView)?.Row; + + if (rowItem != null) + { + BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls + .Cast() + .FirstOrDefault(n => n is LabelDateEdit); + + BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls + .Cast() + .FirstOrDefault(n => n is LabelComboxEdit) as BaseUserControl; + + string typeDate = "0"; + LabelDateEdit labelDateEdit = baseUserControl as LabelDateEdit; + + if (dataTypeControl != null && dataTypeControl is LabelComboxEdit labelAutoTextEdit) + { + typeDate = labelAutoTextEdit.EditValue; + } + + if (labelDateEdit == null) return; + + string searchSql = this.GetSearchSql(model, rowItem, false); + string isweekcond = DataModel.TopModuleModel.HasReport ? "" : $"and isWeek='{typeDate}'"; + searchSql = $"{ReplaceHelper.ReplaceWhereCond(searchSql)} and day >= '{labelDateEdit.TextEdit.DateTime:yyyy-MM-dd}' {isweekcond}"; + + gcRight.GridControlObj.SetGridViewDataSource(BaseImpl.GetDataTableResult(searchSql)); + + // 更新行数据逻辑 + DateTime dateTime = labelDateEdit.TextEdit.DateTime; + DataTable dataDayPlan = gcRight.GridControlObj.GridControl.DataSourceTable().Copy(); + if (DataModel.TopModuleModel.HasReport) UpdateRowWithDayPlan(rowItem, dataDayPlan, dateTime); + this.SetDetailGridDataSource(rowItem); + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + /// + /// 说明:下面多数据源刷新 + /// 创建人:王一帆 + /// 创建日期:2017-12-19 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + public void SetDetailGridDataSource(DataRow rowItem, XtraTabPage tabPage = null) + { + if (tabPage != null) + { + this.SetTabPageDataSource(tabPage, rowItem); + } + else + { + foreach (XtraTabPage page in this.tabBottom.TabControlObj.TabPages) + { + if (rowItem != null && page != null) + { + this.SetTabPageDataSource(page, rowItem); + } + } + } + } + + protected void SetTabPageDataSource(XtraTabPage tabPage, DataRow rowItem) + { + GridDetailModel model = this.tabBottom.GetGridDetailModel(tabPage); + if (model.Orderid == -2) return; + Object moduleObject = tabPage.Controls.Cast().FirstOrDefault(); + ModuleGridEx moduleGridEx = null; + if (moduleObject is ModuleGridEx) + { + moduleGridEx = moduleObject as ModuleGridEx; + } + if (rowItem != null && model != null) + { + if (!string.IsNullOrEmpty(model.UnionModule) && (string.IsNullOrEmpty(model.UnionValue) && string.IsNullOrEmpty(model.UnionCond))) return; + if (tabPage.Tag is FrmWebBrowser) + { + // 加载网页 + FrmWebBrowser webView = tabPage.Tag as FrmWebBrowser; + string url = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(model.DetailSql)); + url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url; + //webView.FrmLoad(url); + webView.LoadUrl(url); + webView.Dock = DockStyle.Fill; + webView.Tag = model; + } + else if (tabPage.Tag is FrmWebBrowser2) + { + // 加载网页 + FrmWebBrowser2 webView = tabPage.Tag as FrmWebBrowser2; + string url = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(model.DetailSql)); + url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url; + webView.LoadUrl(url); + webView.Dock = DockStyle.Fill; + webView.Tag = model; + } + else if (tabPage.Tag is FrmMiniBlink) + { + // 加载网页 + FrmMiniBlink webView = tabPage.Tag as FrmMiniBlink; + string url = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(model.DetailSql)); + url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url; + webView.LoadUrl(url); + webView.Dock = DockStyle.Fill; + webView.Tag = model; + } + else if (tabPage.Tag is TabMultipledetails) + { + TabMultipledetails tabMultipledetails = tabPage.Tag as TabMultipledetails; + tabMultipledetails.SetConditionValues(rowItem); + GridControlEx grdExMain = (tabMultipledetails.SplitMain.Panel1.Tag as GridControlEx); + GridDetailModel MainModel = grdExMain.Tag as GridDetailModel; + string searchMainSql = this.GetSearchSql(MainModel, rowItem); + DataTable firstTable = MainImpl.GetDataTableResult(searchMainSql); + grdExMain.LastSearchSql = searchMainSql; + grdExMain.SetGridViewDataSource(firstTable); + if (tabMultipledetails.SplitMain.Panel2.Tag is GridControlEx) + { + GridControlEx grdExAdditional = (tabMultipledetails.SplitMain.Panel2.Tag as GridControlEx); + GridDetailModel AdditionalModel = grdExAdditional.Tag as GridDetailModel; + string searchAddSql = this.GetSearchSql(AdditionalModel, rowItem); + if (!MainModel.IsUnioDetail) + { + grdExAdditional.LastSearchSql = searchAddSql; + grdExAdditional.SetGridViewDataSource(MainImpl.GetDataTableResult(searchAddSql)); + } + //右侧是左侧的明细,左侧没有数据时。右侧赋空值(因为无法触发左侧行改变事件) + if (MainModel.IsUnioDetail && firstTable.Rows.Count == 0) + { + grdExAdditional.LastSearchSql = ""; + grdExAdditional.SetGridViewDataSource(new DataTable()); + } + } + else if (tabMultipledetails.SplitMain.Panel2.Tag is ChartControlEx) + { + ChartControlEx grdExAdditional = (tabMultipledetails.SplitMain.Panel2.Tag as ChartControlEx); + GridDetailModel AdditionalModel = grdExAdditional.Tag as GridDetailModel; + string searchAddSql = this.GetSearchSql(AdditionalModel, rowItem); + DataTable table = MainImpl.GetDataTableResult(searchAddSql); + grdExAdditional.CreateChart(table); + } + + tabPage.Text = MainModel.DetailName + "(" + firstTable.Rows.Count + "条)"; + tabPage.Appearance.Header.ForeColor = firstTable.Rows.Count > 0 ? Color.Red : Color.FromArgb(0, 0, 0); + } + else + { + if (model.IsDrag) + { + return; + } + string searchSql = this.GetSearchSql(model, rowItem); + if (tabPage.Tag is GridControlEx) + { + (tabPage.Tag as GridControlEx).LastSearchSql = searchSql; + } + //DataTable dataTable = MainImpl.GetDataTableResult(searchSql);//明细数据源 + if (model.DynamicDetails && rowItem.Table.Columns.Contains("DisplayColumns")) // + { + this.tabBottom.SetGridDisplayColumns(tabPage, rowItem["DisplayColumns"] + ""); + } + this.tabBottom.SetGridDataSource(tabPage, MainImpl.GetDataTableResult(searchSql)); + if (tabPage.Tag is GridControlEx && (tabPage.Tag as GridControlEx).ParentControl != null) + (tabPage.Tag as GridControlEx).ParentControl.SetAllControlValue(rowItem); + //配置明细直接根据条件加载 + if (model.SystemModel != null && 1 == model.SystemModel.isFirstLoad) + { + (tabPage.Tag as GridControlEx).ParentControl.SearchGrid(); + tabPage.Text = model.DetailName + "(" + (tabPage.Tag as GridControlEx).ParentControl.GridRowCount + "条)"; + } + } + if (moduleGridEx != null) moduleGridEx.ParentButtonState(rowItem); + } + } + /// + /// 获取查询sql + /// + /// + /// + /// + /// + private string GetSearchSql(GridDetailModel model, DataRow rowItem, bool isLeft = false) + { + string fieldName = !string.IsNullOrEmpty(model.UnionParentField) && rowItem.Table.Columns.Contains(model.UnionParentField) ? model.UnionParentField : DataModel.TopModuleModel.ParmaryKey; + string sqlValue = model.Orderid == -1 ? DataModel.RightModuleModel.MenuSql : model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; + sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); + DataRow row = TreeMultiHeader ? treebandGcTop.GetViewFocusedDataRow() : bandGcTop.GetViewFocusedDataRow(); + if (row != null && isLeft) + { + //先替换左侧选中行,在替换主表 + sqlValue = ReplaceHelper.ReplaceRowParam(row, sqlValue); + } + if (ReplaceHelper.IsSelect(sqlValue) && !string.IsNullOrEmpty(model.UnionValue)) + { + string Conditions = string.Empty; + //是左侧选中行,并且没有替换字段,则使用主表选中行 + Conditions = isLeft ? rowItem.Table.Columns.Contains(fieldName) ? rowItem[fieldName] + "" : row[fieldName] + "" : rowItem[fieldName] + ""; + sqlValue = ReplaceHelper.ReplaceWhereCond(sqlValue) + string.Format(" and {0}='{1}'", model.UnionValue, Conditions); + } + if (!string.IsNullOrEmpty(model.UnionCond)) + { + string UnionCond = ReplaceHelper.ReplaceRowParam(rowItem, model.UnionCond); + sqlValue += UnionCond; + } + return sqlValue; + } + /// + /// 宽度改变事件处理,兼容BandedGridView和TreeList + /// + private void OnBandedViewColumnWidthChanged(object sender, EventArgs e) + { + if (bandGcBottom != null) + { + int allWidth = 0; + + // 如果sender为原有的BandedView类型 + if (sender == bandGcTop.BandedView) + { + foreach (GridBand gridBand in bandGcTop.BandedView.Bands) + { + if (gridBand.Columns.Count == 1 && gridBand.Columns[0].Name.Contains("DDay_")) + { + break; + } + else + { + allWidth += gridBand.Width; + } + } + } + // 如果sender为TreeList类型 + else if (sender is TreeList treeListSender) + { + foreach (TreeListBand band in treeListSender.Bands) + { + if (band.Columns.Count == 1 && band.Columns[0].Name.Contains("DDay_")) + { + break; + } + else + { + foreach (TreeListColumn treeListColumn in band.Columns) + { + if (treeListColumn.Visible) allWidth += treeListColumn.Width; + } + + } + } + } + else + { + return; // 非预期sender类型时直接退出 + } + + // 调整底部bandGcBottom的列宽(始终为BandedGridView类型) + List bottomColumnList = new List(); + foreach (GridBand gridBand in bandGcBottom.BandedView.Bands) + { + if (gridBand.Columns.Count == 1 && gridBand.Columns[0].Name.Contains("DDay_")) + { + break; + } + else + { + bottomColumnList.AddRange(gridBand.Columns.Cast()); + } + } + + // 按计算好的宽度均分调整 + if (bottomColumnList.Count > 0) + { + int perWidth = allWidth / bottomColumnList.Count; + foreach (BandedGridColumn bandedGridColumn in bottomColumnList) + { + bandedGridColumn.Width = perWidth; + } + } + } + } + + + + /// + /// 水平滚动条改变时 + /// + /// + /// + private void OnBandedViewLeftCoordChanged(object sender, EventArgs e) + { + if (!isAddBottom) return; + if (sender == bandGcTop.BandedView) + { + bandGcBottom.BandedView.LeftCoord = bandGcTop.BandedView.LeftCoord; + } + else if (sender is TreeList treeListSender) + { + // 使用TreeList的LeftCoord属性同步BandedView的LeftCoord + bandGcBottom.BandedView.LeftCoord = treeListSender.LeftCoord; + } + else if (sender == bandGcBottom.BandedView) + { + if (TreeMultiHeader) + { + treebandGcTop.TreeListObj.LeftCoord = bandGcBottom.BandedView.LeftCoord; + } + else + { + bandGcTop.BandedView.LeftCoord = bandGcBottom.BandedView.LeftCoord; + } + } + } + /// + /// 记录展开的节点 + /// + public void GetTreeExpanded() + { + DataModel.treeListNodes.Clear(); + foreach (TreeListNode n in this.treebandGcTop.TreeListObj.Nodes) + { + setRecursive(n); + } + } + /// + /// 递归进行遍历节点 + /// + /// + public void setRecursive(TreeListNode treeNode) + { + if (treeNode.Expanded) DataModel.treeListNodes.Add(treeNode); + // Visit each node recursively. + foreach (TreeListNode tn in treeNode.Nodes) + { + setRecursive(tn); + } + } + /// + /// 搜索条件绑定完成后 + /// + /// + /// + private void OnDataSourceBindCallBack(object sender, EventArgs e) + { + BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelDateEdit).FirstOrDefault(); + BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelComboxEdit).Cast().FirstOrDefault(); // 获取第一个符合条件的控件 + string typeDate = "0"; + if (dataTypeControl != null) + { + LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit; + typeDate = labelAutoTextEdit.EditValue; + } + + if (baseUserControl != null) + { + LabelDateEdit labelDateEdit = baseUserControl as LabelDateEdit; + DateTime dateTime = labelDateEdit.TextEdit.DateTime; + if (isAddBottom) UpdateDynamicColumns(bandGcBottom, dateTime, typeDate); + if (TreeMultiHeader) + { + UpdateDynamicColumns(treebandGcTop, dateTime, typeDate); + } + else + { + UpdateDynamicColumns(bandGcTop, dateTime, typeDate); + } + } + } + /// + /// 搜索前事件 + /// + /// + /// + private void OnSearchBeforeCallBack(object sender, SearchArgs e) + { + if (TreeMultiHeader) + { + DataModel.MainLeftCoord = treebandGcTop.TreeListObj.LeftCoord; + } + else + { + DataModel.MainLeftCoord = bandGcTop.BandedView.LeftCoord; + } + } + /// + /// 搜索后事件 + /// + /// + /// + private void OnSearchAfterCallBack(object sender, EventArgs e) + { + BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelDateEdit).FirstOrDefault(); + BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelComboxEdit).Cast().FirstOrDefault(); // 获取第一个符合条件的控件 + string typeDate = "0"; + if (dataTypeControl != null) + { + LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit; + typeDate = labelAutoTextEdit.EditValue; + } + if (baseUserControl != null) + { + LabelDateEdit labelDateEdit = baseUserControl as LabelDateEdit; + if (typeDate == "1") + { + DateTime endDate = labelDateEdit.TextEdit.DateTime.AddMonths(3).AddDays(-1); // 计算结束日期 + int weekIndex = 0; + DateTime weekStart = GetStartOfWeek(labelDateEdit.TextEdit.DateTime); // 获取本周的周一日期 + labelDateEdit.TextEdit.DateTime = weekStart; + } + DateTime dateTime = labelDateEdit.TextEdit.DateTime; + if (TreeMultiHeader) + { + UpdateDynamicColumns(treebandGcTop, dateTime, typeDate); + } + else + { + UpdateDynamicColumns(bandGcTop, dateTime, typeDate); + } + if (isAddBottom) UpdateDynamicColumns(bandGcBottom, dateTime, typeDate); + DataTable dataMain = null; + DataTable dataDetail = null; + int hander = bandGcTop.BandedView.FocusedRowHandle; + if (TreeMultiHeader) + { + dataMain = treebandGcTop.GetGridViewDataSource().Copy(); + dataDetail = treebandGcTop.GetGridViewDataSource().Copy(); + //treebandGcTop.TreeListObj.DataSource = null; + } + else + { + dataMain = bandGcTop.GridControl.DataSourceTable().Copy(); + dataDetail = bandGcTop.GridControl.DataSourceTable().Copy(); + bandGcTop.GridControl.DataSource = null; + } + + string sqlValue = DataModel.RightModuleModel.MenuSql; + string isweekcond = DataModel.TopModuleModel.HasReport ? "" : $"and isWeek='{typeDate}'"; + sqlValue = $"{ReplaceHelper.ReplaceWhereCond(sqlValue)} and day >= '{dateTime.ToString("yyyy-MM-dd")}' {isweekcond}"; + DataTable dataDayPlan = BaseImpl.GetDataTableResult(sqlValue); + if (isAddBottom) + { + DataTable bottomTab = BuildCTable(dataDetail, dataDayPlan, dateTime, 93); + bandGcBottom.BandedView.GridControl.DataSource = bottomTab; + } + MergeMainDataWithDayPlan(dataMain, dataDayPlan, dateTime, typeDate); + if (!TreeMultiHeader) + { + bandGcTop.BandedView.GridControl.DataSource = dataMain; + bandGcTop.BandedView.FocusedRowHandle = hander; + OnBandedViewRowCellClick(bandGcTop.BandedView, null); + bandGcTop.BandedView.LeftCoord = DataModel.MainLeftCoord; + } + else + { + treebandGcTop.SetGridViewDataSource(dataMain); + treebandGcTop.TreeListObj.LeftCoord = DataModel.MainLeftCoord; + } + } + string query = @" + SELECT + billdocument_id, + STUFF((SELECT ',' + CAST(showday AS VARCHAR(MAX)) + FROM mps_dayplantab AS sub WITH(NOLOCK) + WHERE sub.billdocument_id = main.billdocument_id + AND sub.update_tig = 1 + FOR XML PATH('')), 1, 1, '') AS showday_list + FROM mps_dayplantab AS main WITH(NOLOCK) + GROUP BY billdocument_id;"; + DataTable dt = BaseImpl.GetDataTableResult(query); + foreach (DataRow row in dt.Rows) + { + string billDocumentId = row["billdocument_id"] + ""; + string showDayList = row["showday_list"].ToString(); + + if (!string.IsNullOrEmpty(showDayList)) + { + HashSet daysSet = new HashSet(showDayList.Split(',')); + DataModel.nonEditableCells[billDocumentId] = daysSet; + } + } + } + /// + /// 获取数据源缓存 + /// + /// + /// + public void GetDataCaches(Dictionary cachesDic) + { + //获取通用数据 + Task sysModelTask = cachesDic.GetTask(this, "SysModel"); + Task dynamicModelTask = cachesDic.GetTask(this, "DynamicModel"); + Task> detailsTask = cachesDic.GetTask>(this, "Details"); + Task getDataCachesTask = cachesDic.AddTask(this, "DataCaches", new Task(() => + { + ModuleModel sysModel = sysModelTask.Result; + DynamicModel dynamicModel = dynamicModelTask.Result; + //创建数据 + if (sysModel != null && dynamicModel != null) + { + Task menuConfigTabTask = cachesDic.AddTask(this, "MenuConfigTab", new Task(() => + { + return BaseImpl.GetMenuConfigTab(dynamicModel.ModuleId); //获取菜单其他配置 + })); + if (dynamicModel is DynamicExcelModel)//isExcel + { + Task basePrimaryKeyTask = cachesDic.AddTask(this, "BasePrimaryKey", new Task(() => + { + return BaseImpl.GetBasePrimaryKey(dynamicModel.ModuleCode); + })); + Task gridColumnsTask = cachesDic.AddTask(this, "GridColumns", new Task(() => + { + return BaseModuleImpl.GetBaseGridColumns(dynamicModel.ModuleCode); + })); + } + else + { + //构建主表数据 + } + } + return true; + })); + } + /// + /// 添加虚拟日期列 + /// + private void AddDataColumns(BandedGridControlEx bandedGridControlEx) + { + if (bandedGridControlEx == bandGcTop) + { + bandedGridControlEx.BandedView.OptionsView.ShowFooter = false; + } + foreach (GridBand gridBand in bandedGridControlEx.BandedView.Bands) + { + gridBand.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left; + } + for (int i = 0; i < 93; i++) + { + GridBand gridBand = new GridBand(); + gridBand.Name = $"Day_{i}"; + gridBand.Caption = ""; + gridBand.OptionsBand.AllowMove = false; + gridBand.OptionsBand.AllowSize = false; + gridBand.AppearanceHeader.Options.UseFont = true; + gridBand.AppearanceHeader.Font = new Font("宋体", 9, FontStyle.Bold); + gridBand.AppearanceHeader.Options.UseTextOptions = true; + gridBand.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + bandedGridControlEx.BandedView.Bands.Add(gridBand); + BandedGridColumn gridColumn = new BandedGridColumn(); + gridColumn.AppearanceCell.Options.UseTextOptions = true; + gridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.AppearanceHeader.Options.UseTextOptions = true; + gridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.OptionsColumn.AllowMove = false; + gridColumn.OptionsColumn.AllowSize = false; + gridColumn.OptionsFilter.AllowFilter = false; + gridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False; + gridColumn.OptionsColumn.AllowSort = DefaultBoolean.False; + gridColumn.FieldName = $"DDay_{i}"; + gridColumn.Width = 70; + gridColumn.DisplayFormat.FormatType = FormatType.Numeric; + gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; + gridColumn.Visible = false; + if (bandedGridControlEx == bandGcTop) + { + gridColumn.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum; + gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; + } + gridBand.Columns.Add(gridColumn); + } + // 现在添加15个周列 + for (int i = 93; i < 108; i++) // 新增15个周列 + { + GridBand gridBand = new GridBand(); + gridBand.Name = $"Week_{i - 93}"; + gridBand.Caption = ""; + gridBand.OptionsBand.AllowMove = false; + gridBand.OptionsBand.AllowSize = false; + gridBand.AppearanceHeader.Options.UseFont = true; + gridBand.AppearanceHeader.Font = new Font("宋体", 9, FontStyle.Bold); + gridBand.AppearanceHeader.Options.UseTextOptions = true; + gridBand.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + bandedGridControlEx.BandedView.Bands.Add(gridBand); + BandedGridColumn gridColumn = new BandedGridColumn(); + gridColumn.AppearanceCell.Options.UseTextOptions = true; + gridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.AppearanceHeader.Options.UseTextOptions = true; + gridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.OptionsColumn.AllowMove = false; + gridColumn.OptionsColumn.AllowSize = false; + gridColumn.OptionsFilter.AllowFilter = false; + gridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False; + gridColumn.OptionsColumn.AllowSort = DefaultBoolean.False; + gridColumn.FieldName = $"WWeek_{i - 93}"; + gridColumn.Width = 105; + gridColumn.DisplayFormat.FormatType = FormatType.Numeric; + gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; + gridColumn.Visible = false; + if (bandedGridControlEx == bandGcTop) + { + gridColumn.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum; + gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; + } + gridBand.Columns.Add(gridColumn); + } + } + /// + /// 添加多表头树结构模式的虚拟日期列(基于TreeList) + /// + /// + /// 添加虚拟日期列(树的多表头模式) + /// + /// + /// 添加虚拟日期列(树的多表头模式) + /// + private void AddDataColumns(TreeBandedGridControlEx bandedGridControlEx) + { + // 核心优化代码:暂停数据源绑定和界面刷新 + bandedGridControlEx.TreeListObj.BeginUpdate(); + bandedGridControlEx.TreeListObj.LockReloadNodes(); // 阻止节点数据重载(关键优化) + try + { + if (bandedGridControlEx == treebandGcTop) + { + bandedGridControlEx.TreeListObj.OptionsView.ShowSummaryFooter = false; + } + + foreach (TreeListBand fixedBand in bandedGridControlEx.TreeListObj.Bands) + { + fixedBand.Fixed = DevExpress.XtraTreeList.Columns.FixedStyle.Left; + } + + // 添加93个日列 + for (int i = 0; i < 93; i++) + { + TreeListBand dayBand = new TreeListBand + { + Name = $"Day_{i}", + Caption = "", + OptionsBand = { AllowMove = false, AllowSize = false }, + AppearanceHeader = { + Options = { UseFont = true, UseTextOptions = true }, + Font = new Font("宋体", 9, FontStyle.Bold), + TextOptions = { HAlignment = HorzAlignment.Center } + } + }; + bandedGridControlEx.TreeListObj.Bands.Add(dayBand); + + TreeListColumn dayColumn = new TreeListColumn + { + FieldName = $"DDay_{i}", + Width = 70, + Visible = false, + OptionsColumn = { + AllowMove = false, + AllowSize = false, + AllowSort = false, + AllowEdit = false + }, + AppearanceCell = { TextOptions = { HAlignment = HorzAlignment.Center }, Options = { UseTextOptions = true } }, + AppearanceHeader = { TextOptions = { HAlignment = HorzAlignment.Center }, Options = { UseTextOptions = true } }, + Format = { FormatType = FormatType.Numeric, FormatString = "{0:#,##0.####}" } + }; + + if (bandedGridControlEx == treebandGcTop) + { + dayColumn.AllNodesSummary = true; + dayColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Sum; + dayColumn.SummaryFooterStrFormat = "{0:#,##0.####}"; + } + + dayBand.Columns.Add(dayColumn); + bandedGridControlEx.TreeListObj.Columns.Add(dayColumn); + } + + // 添加15个周列 + for (int i = 93; i < 108; i++) + { + TreeListBand weekBand = new TreeListBand + { + Name = $"Week_{i - 93}", + Caption = "", + OptionsBand = { AllowMove = false, AllowSize = false }, + AppearanceHeader = { + Options = { UseFont = true, UseTextOptions = true }, + Font = new Font("宋体", 9, FontStyle.Bold), + TextOptions = { HAlignment = HorzAlignment.Center } + } + }; + bandedGridControlEx.TreeListObj.Bands.Add(weekBand); + + TreeListColumn weekColumn = new TreeListColumn + { + FieldName = $"WWeek_{i - 93}", + Width = 105, + Visible = false, + OptionsColumn = { + AllowMove = false, + AllowSize = false, + AllowSort = false, + AllowEdit = false + }, + AppearanceCell = { TextOptions = { HAlignment = HorzAlignment.Center }, Options = { UseTextOptions = true } }, + AppearanceHeader = { TextOptions = { HAlignment = HorzAlignment.Center }, Options = { UseTextOptions = true } }, + Format = { FormatType = FormatType.Numeric, FormatString = "{0:#,##0.####}" } + }; + + if (bandedGridControlEx == treebandGcTop) + { + weekColumn.AllNodesSummary = true; + weekColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Sum; + weekColumn.SummaryFooterStrFormat = "{0:#,##0.####}"; + } + + weekBand.Columns.Add(weekColumn); + //bandedGridControlEx.TreeListObj.Columns.Add(weekColumn); + } + } + finally + { + bandedGridControlEx.TreeListObj.UnlockReloadNodes(); // 重新允许节点加载数据 + bandedGridControlEx.TreeListObj.EndUpdate(); // 一次性完成所有刷新 + } + } + + + /// + /// 创建TreeList统一的列 + /// + private TreeListColumn CreateTreeListColumn(string fieldName, int width) + { + var column = new TreeListColumn + { + Name = $"col_{fieldName}", + FieldName = fieldName, + Caption = fieldName, + Width = width, + Visible = true, + OptionsColumn = + { + AllowMove = false, + AllowSize = false, + AllowSort = false, + AllowEdit = false + }, + AppearanceHeader = + { + TextOptions = { HAlignment = HorzAlignment.Center }, + Font = new Font("宋体", 9, FontStyle.Bold) + }, + AppearanceCell = + { + TextOptions = { HAlignment = HorzAlignment.Center } + }, + Format = + { + FormatType = FormatType.Numeric, + FormatString = "{0:#,##0.####}" + } + }; + + return column; + } + + /// + /// 配置列的汇总项 + /// + private void SetupColumnSummary(TreeListColumn column) + { + column.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Sum; + column.SummaryFooterStrFormat = "{0:#,##0.####}"; + } + + + #region 类型切换日期展示方法 + /// + /// 构建带日期或周期 + /// + /// + /// + /// + private void UpdateDynamicColumns(BandedGridControlEx bandedGridControlEx, DateTime currentDate, string typeDate = "0") + { + bandedGridControlEx.BandedView.BeginUpdate(); + try + { + if (typeDate == "1") + { + UpdateWeeklyColumns(bandedGridControlEx, currentDate); + } + else + { + UpdateDailyColumns(bandedGridControlEx, currentDate); + } + } + finally + { + bandedGridControlEx.BandedView.EndUpdate(); + } + } + + /// + /// 更新TreeList控件的动态列 + /// + private void UpdateDynamicColumns(TreeBandedGridControlEx bandedGridControlEx, DateTime currentDate, string typeDate = "0") + { + try + { + if (typeDate == "1") + { + UpdateWeeklyColumns(bandedGridControlEx, currentDate); + } + else + { + UpdateDailyColumns(bandedGridControlEx, currentDate); + } + } + finally + { + + } + } + + /// + /// 按周结构生成列(跨月后从第 1 周重新计) + /// + private void UpdateWeeklyColumns(BandedGridControlEx grid, DateTime currentDate) + { + DateTime endDate = currentDate.AddMonths(3).AddDays(-1); // 3 个月窗口 + DateTime weekStart = GetStartOfWeek(currentDate); // 本周周一 + int weekIndex = 0; // Week_0 ~ Week_14 + + while (weekStart <= endDate && weekIndex < 15) + { + DateTime weekEnd = weekStart.AddDays(6); // 本周周日 + DateTime pivotDate = weekStart.AddDays(3); // —— 周四 —— 归属月份基准 + int monthKey = pivotDate.Month; // 本周归属的「月份」 + + /* ---------- 计算“几月第几周” ---------- */ + DateTime monthFirstDay = new DateTime(pivotDate.Year, pivotDate.Month, 1); // 当月1号 + DateTime firstWeekStart = GetStartOfWeek(monthFirstDay); // 先找周一 + + // 若周四不在同月,则循环向后推 1 周,直到周四落在目标月 + while (firstWeekStart.AddDays(3).Month != monthKey) + firstWeekStart = firstWeekStart.AddDays(7); + + int weekOfMonth = ((weekStart - firstWeekStart).Days / 7) + 1; // 1 起算 + + /* ---------- 设置 Week_i Band ---------- */ + string bandName = $"Week_{weekIndex}"; + GridBand weekBand = grid.BandedView.Bands + .Cast() + .FirstOrDefault(b => b.Name == bandName); + + if (weekBand != null && weekBand.Columns.Count > 0) + { + BandedGridColumn weekColumn = weekBand.Columns[0]; + + weekBand.Visible = true; + weekBand.Caption = $"{weekStart:MM.dd}/{weekEnd:MM.dd}"; // 父 Band:日期范围 + weekColumn.FieldName = weekStart.ToString("yyyy-MM-dd"); // 字段名:周一 + weekColumn.Caption = $"{pivotDate.Month}月第{weekOfMonth}周"; // 列标题:几月第几周 + weekColumn.Width = 90; + DataModel.columnDateMapping[weekColumn] = weekStart; + weekColumn.OptionsColumn.AllowEdit = weekEnd >= DateTime.Today; // 仅未来可编辑 + weekColumn.Visible = true; + } + + /* ---------- 移到下一周 ---------- */ + weekStart = weekEnd.AddDays(1); // 下周周一 + weekIndex++; + } + + /* ---------- 隐藏多余 Week_i Band(weekIndex ~ 14) ---------- */ + for (int i = weekIndex; i < 15; i++) + { + GridBand band = grid.BandedView.Bands + .Cast() + .FirstOrDefault(b => b.Name == $"Week_{i}"); + if (band != null) band.Visible = false; + } + + /* ---------- 隐藏所有 Day_* 列 ---------- */ + foreach (GridBand band in grid.BandedView.Bands.Cast()) + { + if (!band.Name.StartsWith("Day_")) continue; + + band.Visible = false; + foreach (BandedGridColumn col in band.Columns) + col.Visible = false; + } + } + + + + /// + /// 更新TreeList控件的周列 + /// + private void UpdateWeeklyColumns(TreeBandedGridControlEx grid, DateTime currentDate) + { + grid.TreeListObj.BeginInit(); + DateTime endDate = currentDate.AddMonths(3).AddDays(-1); + int weekIndex = 0; + DateTime weekStart = GetStartOfWeek(currentDate); + + while (weekStart <= endDate && weekIndex < 15) + { + DateTime weekEnd = weekStart.AddDays(6); + + string bandTitle = $"Week_{weekIndex}"; + TreeListBand weekBand = grid.TreeListObj.Bands.Cast() + .FirstOrDefault(b => b.Name == bandTitle); + + if (weekBand != null && weekBand.Columns.Count > 0) + { + TreeListColumn weekColumn = weekBand.Columns[0]; + weekBand.Visible = true; + + weekBand.Caption = $"{weekStart:MM-dd}至{weekEnd:MM-dd}"; + weekColumn.FieldName = weekStart.ToString("yyyy-MM-dd"); + // 使用修改后的方法设置 Caption + weekColumn.Caption = $"{weekEnd.Month}月第{GetWeekOfMonth(weekEnd)}周"; + weekColumn.Width = 105; + // 新优化方式(使用字典存储) + DataModel.columnDateMapping[weekColumn] = weekStart; + weekColumn.OptionsColumn.AllowEdit = weekEnd >= DateTime.Today; + weekColumn.Visible = true; + } + + weekStart = weekEnd.AddDays(1); + weekIndex++; + } + + foreach (int i in Enumerable.Range(weekIndex, 15 - weekIndex)) + { + TreeListBand band = grid.TreeListObj.Bands.Cast() + .FirstOrDefault(b => b.Name == $"Week_{i}"); + if (band != null) band.Visible = false; + } + + foreach (var band in grid.TreeListObj.Bands.Cast()) + { + if (band.Name.StartsWith("Day_")) + { + band.Visible = false; + foreach (TreeListColumn column in band.Columns) + { + column.Visible = false; + } + } + } + grid.TreeListObj.EndInit(); + } + + /// + /// 获取给定日期所在周的开始日期(周一)。 + /// + private DateTime GetStartOfWeek(DateTime date) + { + // 这里假设一周是从周一开始的 + int diff = (7 + (date.DayOfWeek - DayOfWeek.Monday)) % 7; + DateTime startOfWeek = date.AddDays(-diff); + return startOfWeek.Date; // 返回周一的日期 + } + + + /// + /// 计算某个日期在该月的第几周 + /// + /// 日期 + /// 该月的周数 + private int GetWeekOfMonth(DateTime date) + { + var cultureInfo = new CultureInfo("zh-CN"); + var calendar = cultureInfo.Calendar; + + // 月份的第一天 + DateTime firstDayOfMonth = new DateTime(date.Year, date.Month, 1); + // 月份第一天是一年中的第几周 + int firstWeekOfYear = calendar.GetWeekOfYear(firstDayOfMonth, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + // 当前日期是一年中的第几周 + int currentWeekOfYear = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + // 计算结果为当前周减去当月第一周,再加1(第一周为第1周) + return currentWeekOfYear - firstWeekOfYear + 1; + } + + + + + private void UpdateDailyColumns(BandedGridControlEx grid, DateTime currentDate) + { + // 原有的日处理逻辑(保持原代码不变) + DateTime endDate = currentDate.AddMonths(3).AddDays(-1); + grid.BandedView.BeginUpdate(); + + // 处理每天的列(现有逻辑) + for (int i = 0; i < 93; i++) + { + // 以构建列时的命名规则 "Day_{i}" 查找对应的 GridBand + string bandTitle = $"Day_{i}"; + GridBand gridBand = grid.BandedView.Bands.Cast().FirstOrDefault(x => x.Name == bandTitle); + if (gridBand == null) + { + continue; + } + + // 假定每个 GridBand 下只有一个子列 + BandedGridColumn gridColumn = gridBand.Columns.Count > 0 ? gridBand.Columns[0] : null; + if (gridColumn == null) + { + continue; + } + + // 当前列对应的日期 = 起始日期加 i 天 + DateTime dateForColumn = currentDate.AddDays(i); + if (dateForColumn <= endDate) + { + gridBand.Caption = dateForColumn.ToString("MM-dd"); + gridBand.Visible = true; + gridColumn.FieldName = dateForColumn.ToString("yyyy-MM-dd"); + gridColumn.Caption = GetChineseWeekDayNumber(dateForColumn); + gridColumn.Width = 70; + // 新优化方式(使用字典存储) + DataModel.columnDateMapping[gridColumn] = dateForColumn; + if (grid == bandGcTop) + { + if (dateForColumn.Date < DateTime.Now.Date) + { + gridColumn.OptionsColumn.AllowEdit = false; + } + else + { + gridColumn.OptionsColumn.AllowEdit = true; + } + } + gridColumn.Visible = true; + } + else + { + gridBand.Visible = false; + gridColumn.Visible = false; + } + } + //隐藏所有包含 week_ 的列 + foreach (var band in grid.BandedView.Bands.Cast()) + { + if (band.Name.StartsWith("Week_")) + { + band.Visible = false; + foreach (BandedGridColumn column in band.Columns) + { + column.Visible = false; + } + } + } + grid.BandedView.EndUpdate(); + } + /// + /// 更新TreeList控件的日列 + /// + private void UpdateDailyColumns(TreeBandedGridControlEx grid, DateTime currentDate) + { + DateTime endDate = currentDate.AddMonths(3).AddDays(-1); + + // 核心优化代码:暂停数据源绑定和界面刷新 + grid.TreeListObj.BeginInit(); + grid.TreeListObj.BeginUpdate(); + grid.TreeListObj.LockReloadNodes(); // 阻止节点数据重载(关键优化) + + try + { + for (int i = 0; i < 93; i++) + { + string bandTitle = $"Day_{i}"; + TreeListBand treeListBand = grid.TreeListObj.Bands.Cast().FirstOrDefault(x => x.Name == bandTitle); + if (treeListBand == null) + continue; + + TreeListColumn treeListColumn = treeListBand.Columns.Count > 0 ? treeListBand.Columns[0] : null; + if (treeListColumn == null) + continue; + + DateTime dateForColumn = currentDate.AddDays(i); + if (dateForColumn <= endDate) + { + treeListBand.Caption = dateForColumn.ToString("MM-dd"); + treeListBand.Visible = true; + + treeListColumn.FieldName = dateForColumn.ToString("yyyy-MM-dd"); // 保留原逻辑不变 + treeListColumn.Caption = GetChineseWeekDayNumber(dateForColumn); + treeListColumn.Width = 70; + // 关键优化:改为外部字典缓存 + DataModel.columnDateMapping[treeListColumn] = dateForColumn; + //treeListColumn.Tag = dateForColumn; + + if (grid == treebandGcTop) + { + treeListColumn.OptionsColumn.AllowEdit = dateForColumn.Date >= DateTime.Now.Date; + } + + treeListColumn.Visible = true; + } + else + { + treeListBand.Visible = false; + treeListColumn.Visible = false; + } + } + + foreach (var band in grid.TreeListObj.Bands.Cast()) + { + if (band.Name.StartsWith("Week_")) + { + band.Visible = false; + foreach (TreeListColumn column in band.Columns) + { + column.Visible = false; + } + } + } + } + finally + { + grid.TreeListObj.UnlockReloadNodes(); // 重新允许节点加载数据 + grid.TreeListObj.EndUpdate(); // 一次性完成所有刷新 + grid.TreeListObj.EndInit(); + } + } + + + + #endregion + /// + /// 构建带日期的数据源 + /// + /// + /// + /// + /// + private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate, string typeDate = "0") + { + string rightPrimaryKey = DataModel.RightModuleModel.ParmaryKey; + string topPrimaryKey = "keyvalue";// DataModel.TopModuleModel.ParmaryKey; + DateTime endDate = startDate.AddMonths(3).AddDays(-1); // 计算结束日期 + + // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** + Dictionary> dayPlanMap = new Dictionary>(); + foreach (DataRow row in dataDayPlan.Rows) + { + string billId = row[rightPrimaryKey].ToString(); + if (!dayPlanMap.ContainsKey(billId)) + { + dayPlanMap[billId] = new List(); + } + dayPlanMap[billId].Add(row); + } + + // **2. 预构建主数据的列** + for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1)) + { + string colName = dt.ToString("yyyy-MM-dd"); + if (!dataMain.Columns.Contains(colName)) + { + dataMain.Columns.Add(colName, typeof(decimal)); // 确保列存在 + } + } + + // **3. 预构建数据填充映射表** + Dictionary> dataMap = new Dictionary>(); + foreach (DataRow row in dataMain.Rows) + { + string key = row[topPrimaryKey].ToString(); + if (!dataMap.ContainsKey(key)) + { + dataMap[key] = new Dictionary(); + } + + // **查找 key 关联的时间数据** + if (dayPlanMap.ContainsKey(key)) + { + foreach (DataRow dayRow in dayPlanMap[key]) + { + if (dayRow["day"] != DBNull.Value) + { + DateTime dayValue = Convert.ToDateTime(dayRow["day"]); + string colName = dayValue.ToString("yyyy-MM-dd"); + + // 检查日期是否在范围内,并且列存在 + if (dayValue >= startDate && dayValue <= endDate && dataMain.Columns.Contains(colName)) + { + decimal.TryParse(dayRow["amount"] + "", out decimal amountValue); + + // 如果日期已存在,则累加金额;否则直接赋值 + if (dataMap[key].ContainsKey(colName)) + { + dataMap[key][colName] += amountValue; // 累加金额 + } + else + { + dataMap[key][colName] = amountValue; // 直接赋值 + } + } + } + } + } + } + + // **4. 如果有报告(HasReport 为 true)且 typeDate 为 "1",合并同一周的数据** + if (DataModel.TopModuleModel.HasReport && typeDate == "1") + { + int weekIndex = 0; + DateTime tempStartDate = startDate; + + while (tempStartDate <= endDate && weekIndex < 15) + { + DateTime weekEnd = tempStartDate.AddDays(6); // 计算本周的周日 + + // 为每个 key 存储合并的数据 + Dictionary weekSumMap = new Dictionary(); + + // 查找当前周的所有列(如 03-01, 03-02, ...) + string weekColumnPrefix = $"{tempStartDate:yyyy-MM-dd}"; + + // 对每一天的列进行累加,合并到这一周的第一天 + for (DateTime dt = tempStartDate; dt <= weekEnd && dt <= endDate; dt = dt.AddDays(1)) + { + string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式 + if (dataMain.Columns.Contains(colName)) + { + foreach (DataRow row in dataMain.Rows) + { + string key = row[topPrimaryKey].ToString(); + if (dataMap.ContainsKey(key) && dataMap[key].ContainsKey(colName)) + { + // 累加数据并更新 weekSumMap + if (!weekSumMap.ContainsKey(key)) + { + weekSumMap[key] = 0; + } + weekSumMap[key] += dataMap[key][colName]; // 累加当前列的数据 + } + } + } + } + + // 将合并的数据写入到周一(即第一天)的列 + string firstDayCol = tempStartDate.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式 + + // 为每个 key 更新其对应的合并数据 + foreach (DataRow row in dataMain.Rows) + { + string key = row[topPrimaryKey].ToString(); + if (weekSumMap.ContainsKey(key)) + { + row[firstDayCol] = weekSumMap[key]; // 设置周一的值为合并后的总和 + } + } + + // 隐藏其他非周一的列 + for (DateTime dt = tempStartDate.AddDays(1); dt <= weekEnd && dt <= endDate; dt = dt.AddDays(1)) + { + string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式 + if (dataMain.Columns.Contains(colName)) + { + dataMain.Columns[colName].ColumnMapping = MappingType.Hidden; // 将非周一列隐藏 + } + } + + // 更新到下一周 + tempStartDate = weekEnd.AddDays(1); // 下一周的周一 + weekIndex++; + } + } + + // **5. 一次性填充 DataTable(避免逐行赋值带来的性能问题)** + 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]; + List validDateColumns = new List(); + bandGcTop.rowDateValues[rowIndex] = validDateColumns; + string key = row[topPrimaryKey].ToString(); + if (dataMap.ContainsKey(key)) + { + foreach (var col in dataMap[key]) + { + DataColumn column = row.Table.Columns[col.Key]; + var cellValue = col.Value; + row[column] = cellValue; + // 检查列可解析为日期格式 + if (DateTime.TryParse(column.ToString(), out DateTime newDate)) + { + if (!validDateColumns.Contains(newDate)) + { + validDateColumns.Add(newDate); + } + } + } + } + // 赋值操作,确保为字符串格式 + row["PrecomputedMaxDate"] = validDateColumns.Count > 0 ? validDateColumns.Max().ToString("yyyy-MM-dd") : ""; + } + dataMain.ColumnChanged += OnDataMainColumnChanged; + dataMain.AcceptChanges(); + return dataMain; + } + + /// + /// 数据值改变时 + /// + /// + /// + 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)) + { + if (decimal.TryParse(value + "", out decimal dValue) && dValue > 0) + { + 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 相关的所有行)** + Dictionary> dayPlanMap = new Dictionary>(); + foreach (DataRow row in dataDayPlan.Rows) + { + string billId = row[rightPrimaryKey].ToString(); + if (!dayPlanMap.ContainsKey(billId)) + { + dayPlanMap[billId] = new List(); + } + dayPlanMap[billId].Add(row); + } + // **2. 预构建主数据的列** + for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1)) + { + string colName = dt.ToString("yyyy-MM-dd"); + if (!focusedRow.Table.Columns.Contains(colName)) + { + focusedRow.Table.Columns.Add(colName, typeof(decimal)); // 确保列存在 + } + } + // **3. 预构建数据填充映射表** + Dictionary> dataMap = new Dictionary>(); + string key = focusedRow[topPrimaryKey].ToString(); + if (!dataMap.ContainsKey(key)) + { + dataMap[key] = new Dictionary(); + } + // **查找 key 关联的时间数据** + if (dayPlanMap.ContainsKey(key)) + { + foreach (DataRow dayRow in dayPlanMap[key]) + { + if (dayRow["day"] != DBNull.Value) + { + DateTime dayValue = Convert.ToDateTime(dayRow["day"]); + string colName = dayValue.ToString("yyyy-MM-dd"); + + // 检查日期是否在范围内,并且列存在 + if (dayValue >= startDate && dayValue <= endDate && focusedRow.Table.Columns.Contains(colName)) + { + decimal.TryParse(dayRow["amount"] + "", out decimal amountValue); + // 如果日期已存在,则累加金额;否则直接赋值 + if (dataMap[key].ContainsKey(colName)) + { + dataMap[key][colName] += amountValue; // 累加金额 + } + else + { + dataMap[key][colName] = amountValue; // 直接赋值 + } + } + } + } + } + // **4. 一次性填充 DataTable(避免逐行赋值带来的性能问题)** + if (dataMap.ContainsKey(key)) + { + foreach (var col in dataMap[key]) + { + focusedRow[col.Key] = col.Value; + } + } + } + /// + /// 日期对照 + /// + /// + /// + private string GetChineseWeekDayNumber(DateTime date) + { + switch (date.DayOfWeek) + { + case DayOfWeek.Monday: return "一"; + case DayOfWeek.Tuesday: return "二"; + case DayOfWeek.Wednesday: return "三"; + case DayOfWeek.Thursday: return "四"; + case DayOfWeek.Friday: return "五"; + case DayOfWeek.Saturday: return "六"; + case DayOfWeek.Sunday: return "日"; + default: return ""; + } + } + /// + /// 初始化位置 + /// + private void InitSpiltLocation() + { + try + { + string splitLeftWidth = IniHelper.Read(string.Format("FrmProductSched_SplitLeft_{0}", DataModel.TopSysModel.ModuleCode)); + if (!string.IsNullOrEmpty(splitLeftWidth)) + { + splitLeftControl.SplitterPosition = Convert.ToInt32(splitLeftWidth); + } + string splitMainWidth = IniHelper.Read(string.Format("FrmProductSched_SplitMain_{0}", DataModel.TopSysModel.ModuleCode)); + if (!string.IsNullOrEmpty(splitMainWidth)) + { + splitMainControl.SplitterPosition = Convert.ToInt32(splitMainWidth); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + /// + /// 分隔条位置改变时 + /// + /// + /// + private void OnSplitContainerPositionChanged(object sender, EventArgs e) + { + try + { + if (DataModel.TopSysModel != null) + { + IniHelper.Write(string.Format("FrmProductSched_SplitLeft_{0}", DataModel.TopSysModel.ModuleCode), splitLeftControl.SplitterPosition + ""); + IniHelper.Write(string.Format("FrmProductSched_SplitMain_{0}", DataModel.TopSysModel.ModuleCode), splitMainControl.SplitterPosition + ""); + } + bandGcTop.gridControl.Refresh(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + /// + /// 合计显示居中设置 + /// + /// + /// + private void OnCustomDrawFooterCell(object sender, FooterCellCustomDrawEventArgs e) + { + e.Appearance.TextOptions.HAlignment = HorzAlignment.Center; + } + /// + /// TreeList合计行单元格居中显示 + /// + private void OnTreeListCustomDrawFooterCell(object sender, DevExpress.XtraTreeList.CustomDrawFooterCellEventArgs e) + { + e.Appearance.TextOptions.HAlignment = HorzAlignment.Center; + } + + /// + /// 表头颜色设置 + /// + /// + /// + private void OnCustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e) + { + // 判断列的Tag是否为 DateTime + if (e.Column != null) + { + if (e.Column.Caption.StartsWith("第")) + { + return; // 跳过周列 + } + DateTime dateTime; + if (DataModel.columnDateMapping.TryGetValue(e.Column, out dateTime)) + { + + // 判断日期是否为周末(星期六或星期日) + if (dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday) + { + // 设置表头文字颜色为红色 + e.Appearance.ForeColor = Color.Red; + } + } + } + } + /// + /// TreeList表头颜色自定义绘制(精准适配原BandedGridView逻辑) + /// + private void OnTreeListCustomDrawColumnHeader(object sender, DevExpress.XtraTreeList.CustomDrawColumnHeaderEventArgs e) + { + + // 判断列的Tag是否为 DateTime + if (e.Column != null) + { + if (e.Column.Caption.StartsWith("第")) + { + return; // 跳过周列 + } + DateTime dateTime; + if (DataModel.columnDateMapping.TryGetValue(e.Column, out dateTime)) + { + + // 判断日期是否为周末(星期六或星期日) + if (dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday) + { + // 设置表头文字颜色为红色 + e.Appearance.ForeColor = Color.Red; + } + } + } + } + /// + /// 按键点击事件 + /// + /// + /// + private void OnBandedViewKeyDown(object sender, KeyEventArgs e) + { + BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast().Where(n => n is LabelComboxEdit).Cast().FirstOrDefault(); // 获取第一个符合条件的控件 + string typeDate = "0"; + if (dataTypeControl != null) + { + LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit; + typeDate = labelAutoTextEdit.EditValue; + } + BandedGridView bandedGridView = (BandedGridView)sender; + if (e.KeyCode == Keys.F7) + { + GridColumn column = bandedGridView.FocusedColumn; + GridColumnModel model = column.Tag as GridColumnModel; + if (column != null && column.OptionsColumn.AllowEdit && bandedGridView.RowCount > 0 && bandedGridView.OptionsBehavior.Editable) + { + // 允许操作 + GridCell[] SelectCells = bandedGridView.GetSelectedCells(); + if (SelectCells.Length > 1) + { + object obj = bandedGridView.GetRowCellValue(SelectCells[0].RowHandle, SelectCells[0].Column); + if (MessageUtil.Show("是否替换所选单元格值?", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + WaitForm.ShowForm("数据填充中"); + if (obj != null) + { + foreach (GridCell gridCell in SelectCells) + { + // 判断列的Tag是否为 DateTime + if (gridCell.Column != null) + { + DateTime dateTime; + if (DataModel.columnDateMapping.TryGetValue(gridCell.Column, out dateTime)) + { + if (typeDate.Equals("1")) + { + dateTime = dateTime.AddDays(7); + } + string bj_tig = bandedGridView.GetRowCellValue(gridCell.RowHandle, "bj_tig")?.ToString() ?? ""; + if (!DataModel.TopModuleModel.HasReport && bj_tig != "0" && dateTime.Date >= DateTime.Now.Date) + { + bandedGridView.SetRowCellValue(gridCell.RowHandle, gridCell.Column, obj); + } + } + } + } + bandedGridView.PostEditor(); + e.Handled = true; + } + WaitForm.HideForm(); + } + } + } + } + } + /// + /// TreeList按键事件处理,精准移植原BandedGridView的F7快速填充逻辑 + /// + private void OnTreeListKeyDown(object sender, KeyEventArgs e) + { + TreeList treeList = sender as TreeList; + if (treeList == null || !treeList.OptionsBehavior.Editable) return; + + if (e.KeyCode == Keys.F7) + { + // 使用你框架中定义的精准方法来获取选中的单元格集合 + List selectedCells = treeList.GetSelectedCells(); + + if (selectedCells != null && selectedCells.Count > 0) + { + // 以第一个选中单元格作为赋值基准值 + TreeListCell firstCell = selectedCells[0]; + object valueToSet = firstCell.Node.GetValue(firstCell.Column); + + if (valueToSet != null && MessageUtil.Show("是否替换所选单元格值?", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + WaitForm.ShowForm("数据填充中"); + foreach (TreeListCell cell in selectedCells) + { + if (cell.Column.OptionsColumn.AllowEdit) + { + if (DataModel.columnDateMapping.TryGetValue(cell.Column, out DateTime dateTime)) + { + // 日期必须大于等于今天才允许赋值 + string bj_tig = cell.Node.GetValue("bj_tig")?.ToString() ?? ""; + if (!DataModel.TopModuleModel.HasReport && bj_tig != "0" && dateTime.Date >= DateTime.Now.Date) + { + treeList.SetFocusedNode(treebandGcTop.TreeListObj.Nodes[0]); + cell.Node.SetValue(cell.Column, valueToSet); + } + } + } + } + e.Handled = true; + WaitForm.HideForm(); + } + } + } + } + /// + /// 构建下方数据 + /// + /// + /// + /// + /// + /// + public DataTable BuildCTable(DataTable dtA, DataTable dtPlan, DateTime startDate, int daysCount) + { + try + { + // 1. 按“产地”分组 + // key: 产地; value: Tuple(总产能, 系数, keyvalue集合) + var groupDict = dtA.AsEnumerable() + .GroupBy(r => r.Field("产地")) + .ToDictionary( + g => g.Key, + g => new + { + TotalCapacity = g.First().Field("总产能"), + Coefficient = g.First().Field("系数"), + KeyValues = g.Select(r => r.Field("keyvalue")).Distinct().ToList() + } + ); + + // 2. 构建 C 表结构:固定字段“产地”、“产能”,以及动态日期列(格式 "yyyy-MM-dd") + DataTable dtC = new DataTable(); + dtC.Columns.Add("产地", typeof(string)); + dtC.Columns.Add("总产能", typeof(decimal)); + List dateColumns = new List(); + for (int i = 0; i < daysCount; i++) + { + DateTime d = startDate.AddDays(i); + string colName = d.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); + dtC.Columns.Add(colName, typeof(decimal)); + dateColumns.Add(colName); + } + + // 3. 预处理 dtPlan:转换 day 字段为 "yyyy-MM-dd" 字符串,方便后续匹配 + var planRows = dtPlan.AsEnumerable() + .Select(r => new + { + BillId = r.Field("billdocument_id"), + ShowDay = r.Field("day").ToString("yyyy-MM-dd", CultureInfo.InvariantCulture), + Amount = r.Field("amount") + }) + .ToList(); + + // 4. 遍历每个分组,构造 C 表行数据 + foreach (var kvp in groupDict) + { + string origin = kvp.Key; + decimal totalCapacity = kvp.Value.TotalCapacity; + decimal coefficient = kvp.Value.Coefficient; + List keyValues = kvp.Value.KeyValues; + + DataRow newRow = dtC.NewRow(); + newRow["产地"] = origin; + newRow["总产能"] = totalCapacity; + + // 对每个动态日期列,从 dtPlan 中查找 billdocument_id 在 keyValues 内, + // 且 ShowDay 等于当前列名的记录,将 amount 累加后再乘以系数 + foreach (string dateCol in dateColumns) + { + decimal sumAmount = planRows + .Where(pr => keyValues.Contains(pr.BillId) && pr.ShowDay == dateCol) + .Sum(pr => pr.Amount); + // 乘以系数得到实际值 + newRow[dateCol] = sumAmount * coefficient; + } + dtC.Rows.Add(newRow); + } + return dtC; + } + catch (Exception) + { + return default; + } + } + /// + /// 纠正输入异常 + /// + /// + /// + private void OnInvalidValueException(object sender, InvalidValueExceptionEventArgs e) + { + if (e.Value.Equals("")) + { + e.ExceptionMode = ExceptionMode.Ignore; + } + } + + + /// + /// 说明:右键菜单执行后刷新数据,刷新规则按照上一次查询条件刷新 + /// 创建人:龚宇超 + /// 创建日期:2017-11-02 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected void OnGridViewRightCallBack(object sender, EventArgs e) + { + try + { + if (TreeMultiHeader) + { + DataTable dt = this.treebandGcTop.GetGridViewDataSource(); + if (dt == null || dt.Rows.Count == 0) return; + DataRow SelectTheLine = this.treebandGcTop.GetViewFocusedDataRow(); + this.DataModel.TopSearchObj.RememberRow = (this.DataModel.TopModuleModel.AccordingNameSelected == 0); + this.DataModel.TopSearchObj.ButtonObj.PerformClick(); + if (this.DataModel.TopModuleModel.AccordingNameSelected != 0)//根据主键刷新目标选中行 + { + DataRow items = dt.Rows.Cast().FirstOrDefault(x => x[this.DataModel.TopModuleModel.ParmaryKey].Equals(SelectTheLine[this.DataModel.TopModuleModel.ParmaryKey])); + dt = this.treebandGcTop.GridView.GetGridViewFilteredAndSortedDataToDataTable(); + BindingSource bindingSource = new BindingSource(); + bindingSource.DataSource = dt; + int numberOfRows = bindingSource.Find(this.DataModel.TopModuleModel.ParmaryKey, SelectTheLine[this.DataModel.TopModuleModel.ParmaryKey].ToString()); + this.treebandGcTop.GridView.ClearSelection(); + this.treebandGcTop.GridView.FocusedRowHandle = numberOfRows; + this.treebandGcTop.GridView.SelectRow(numberOfRows); + } + //this.OnSearchAfterCallBack(null,null); + } + else + { + int oldRowHandle = bandGcTop.GridView.FocusedRowHandle; + DataTable dt = this.bandGcTop.GridView.GetGridViewFilteredAndSortedDataToDataTable(); + if (dt == null || dt.Rows.Count == 0) return; + DataRow SelectTheLine = dt.Rows[oldRowHandle]; + this.DataModel.TopSearchObj.RememberRow = (this.DataModel.TopModuleModel.AccordingNameSelected == 0); + this.DataModel.TopSearchObj.ButtonObj.PerformClick(); + bandGcTop.GridView.SelectRowHandler(oldRowHandle); + if (this.DataModel.TopModuleModel.AccordingNameSelected != 0)//根据主键刷新目标选中行 + { + DataRow items = dt.Rows.Cast().FirstOrDefault(x => x[this.DataModel.TopModuleModel.ParmaryKey].Equals(SelectTheLine[this.DataModel.TopModuleModel.ParmaryKey])); + dt = this.bandGcTop.GridView.GetGridViewFilteredAndSortedDataToDataTable(); + BindingSource bindingSource = new BindingSource(); + bindingSource.DataSource = dt; + int numberOfRows = bindingSource.Find(this.DataModel.TopModuleModel.ParmaryKey, SelectTheLine[this.DataModel.TopModuleModel.ParmaryKey].ToString()); + this.bandGcTop.GridView.ClearSelection(); + this.bandGcTop.GridView.FocusedRowHandle = numberOfRows; + this.bandGcTop.GridView.SelectRow(numberOfRows); + } + //this.OnSearchAfterCallBack(null, null); + //int rightOldRowHandle = 0; + //rightOldRowHandle = gcRight.GridView.FocusedRowHandle;//上一次选中行 + //刷新右侧 + this.OnBandedViewRowCellClick(null, null); + // gcRight.GridView.SelectRowHandler(oldRowHandle); + } + + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + + } + + + public void setDataSource(DataTable dataTable) + { + this.OnSearchBeforeCallBack(null, null); + + if (DataModel.TopModuleModel.TreeAutoMultiHeader == 1) + { + treebandGcTop.SetGridViewDataSource(dataTable); + } + else + { + bandGcTop.SetGridViewDataSource(dataTable); + } + + this.OnSearchAfterCallBack(null,null); + } + + } + + public class ProductDataModel + { + //treeList树展开的节点块 + public List treeListNodes = new List(); + // 在你的类内部定义此字典(一次定义,长期复用) + public Dictionary columnDateMapping = new Dictionary(); + pub \ No newline at end of file diff --git a/插件库/Lskj.Control/FrmProductSched.resx b/插件库/Lskj.Control/FrmProductSched.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.Control/FrmProductSched.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.Control/GridControlEx.cs b/插件库/Lskj.Control/GridControlEx.cs index f61c7fc..44d7246 100644 --- a/插件库/Lskj.Control/GridControlEx.cs +++ b/插件库/Lskj.Control/GridControlEx.cs @@ -394,6 +394,19 @@ namespace Lskj.Control /// 创建动态分组列控件回调 /// public event EventHandler OnBuildGroupedColumnCallBack; + /// + /// 记录上一次分组状态,避免重复排序 + /// + private int _lastGroupCount = 0; + /// + /// 分组后根据汇总排序是否完成 + /// + private bool Completed = true; + /// + /// 进度条类型的列名称 + /// + private List ProgressBarColumn = new List(); + public GridControlEx() { @@ -444,8 +457,16 @@ namespace Lskj.Control this.gridView.CustomUnboundColumnData += OnGridViewCustomUnboundColumnData; this.gridView.DoubleClick += OnShowImageDoubleClick; ; #endregion + if (SystemInfo.Instance.GroupSpecialMode) this.gridView.EndGrouping += GridView_EndGrouping; + + } + + + + + /// /// 保存前反写多表头数据源 /// @@ -1002,7 +1023,6 @@ namespace Lskj.Control protected virtual void SetColumnFormat(GridColumn gridColumn, GridColumnModel model) { if (gridColumn == null || model == null) return; - // 格式化数字 if (!string.IsNullOrEmpty(model.DataFormat)) { @@ -1761,9 +1781,49 @@ namespace Lskj.Control try { + + this.AdapterObj = adapter; DataSet dataSet = new DataSet(); - adapter.Fill(dataSet, "SetGridViewDataSource"); + + // 重连配置 + int maxRetryCount = 2; // 次数 + int retryDelay = 1000; // 等待时间 + for (int i = 0; i < maxRetryCount; i++) + { + try + { + adapter.Fill(dataSet, "SetGridViewDataSource"); + break;//连接成功 + } + catch (SqlException ex) + { + // 判断是否是连接相关错误 + if (IsConnectionError(ex.Number) || + ex.Message.Contains("物理连接不可用") || + ex.Message.Contains("传输级错误")) + { + if (i < maxRetryCount - 1) + { + SqlConnection.ClearAllPools(); + System.Threading.Thread.Sleep(retryDelay); + continue; // 重试 + } + else + { + // 最后一次重试失败,抛出错误 + throw new Exception($"经过 {maxRetryCount} 次重试后仍无法连接到数据库: {ex.Message}", ex); + } + } + else + { + // 其他SQL错误直接抛出 + throw; + } + } + } + + if (this.ColumnList == null || this.ColumnList.Count == 0) { @@ -1815,6 +1875,8 @@ namespace Lskj.Control this.ClearImage(); this.GridControl.DataSource = dt; + + this.AdjustIndicatorWidthSmart(); //modifyThePosition.Clear(); // 动态列处理 @@ -1829,6 +1891,23 @@ namespace Lskj.Control } return 0; } + + /// + /// 判断是否是连接相关的错误代码 + /// + protected virtual bool IsConnectionError(int errorNumber) + { + // 常见的连接相关错误代码 + int[] connectionErrorNumbers = { + 10053, 10054, 10060, 10061, // 网络相关错误 + 4060, 18456, // 登录相关错误 + 2, 53 // 服务器不存在或无法访问 + }; + + return Array.IndexOf(connectionErrorNumbers, errorNumber) >= 0; + } + + /// /// 说明:计算列关联字段 /// 创建人:龚宇超 @@ -2000,7 +2079,16 @@ namespace Lskj.Control { result = (double.Parse(result.Replace("%", "")) * 0.01).ToString(); } - rowItem[gridModel.FieldName] = result; + + if (string.IsNullOrEmpty(result)) + { + rowItem[gridModel.FieldName] = DBNull.Value; + } + else + { + rowItem[gridModel.FieldName] = result; + } + // 判断计算列有无关联值 GridColumnModel UnionModel = calcModels.FirstOrDefault(x => x.FieldName == gridModel.FieldName); if (!string.IsNullOrEmpty(UnionModel.UnionFields)) @@ -3251,6 +3339,45 @@ namespace Lskj.Control } } + + + /// + /// 查找指定列(定位到弹窗选中列) + /// + /// + /// + protected virtual void LookUpColumn(object sender, EventArgs e) + { + + Dictionary columnInformation = new Dictionary(); + foreach (GridColumn column in this.gridView.Columns) + { + if (column.Visible) + { + columnInformation.Add(column.FieldName, column.Caption); + } + } + FrmPositioningColumn frmPositioningColumn = new FrmPositioningColumn(columnInformation); + if (frmPositioningColumn.ShowDialog() == DialogResult.OK) + { + string columnNameToFind = frmPositioningColumn.FindName; + GridColumn column = this.gridView.Columns.ColumnByFieldName(columnNameToFind); + if (column != null) + { + this.gridView.FocusedColumn = column; // 让指定列获得焦点 + if (this.gridView.FocusedRowHandle >= 0) + { + this.gridView.MakeRowVisible(this.gridView.FocusedRowHandle); + //this.gridView.ClearSelection(); + //this.gridView.SelectCell(this.gridView.FocusedRowHandle, column); + } + this.gridView.MakeColumnVisible(column); + this.gridView.Invalidate(); // 重绘视图 + } + } + } + + /// /// 说明:根据显示值获取隐藏Value /// 创建人:龚宇超 @@ -3265,7 +3392,7 @@ namespace Lskj.Control protected virtual object GetValueByCaption(GridColumnModel model, RepositoryItem columnEdit, object text, out bool result) { DataTable table = new DataTable(); - + bool moduleReturnCheck = false;//模块选择框复选 if (string.IsNullOrEmpty(text + "")) { result = false; @@ -3290,11 +3417,13 @@ namespace Lskj.Control else if (columnEdit is RepositoryItemCheckedComboBoxEdit) { RepositoryItemCheckedComboBoxEdit rccbe = columnEdit as RepositoryItemCheckedComboBoxEdit; + FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; + if (!modelLookUp.SingleChoiceMode) moduleReturnCheck = true; table = rccbe.DataSource as DataTable; } if (table != null && table.Rows.Count > 0 && table.Columns.Count > 0) { - if ((model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam)) + if ((model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam || moduleReturnCheck)) { string[] values = (text + "").Trim(',').Split(','); string textNew = string.Empty; @@ -3316,6 +3445,70 @@ namespace Lskj.Control result = false; return text; } + + + + /// + /// 模块返回框验证(外部粘贴时验证值是否正确) + /// + /// + /// + /// + /// + /// + protected virtual object ModuleReturnVerify(GridColumnModel model, RepositoryItem columnEdit, object text, out bool result) + { + DataTable table = new DataTable(); + bool moduleReturnCheck = false;//多选模式 + if (string.IsNullOrEmpty(text + "")) + { + result = false; + return text; + } + if (columnEdit is RepositoryItemCheckedComboBoxEdit) + { + RepositoryItemCheckedComboBoxEdit rccbe = columnEdit as RepositoryItemCheckedComboBoxEdit; + if (rccbe.Buttons[1].Tag is FrmModelLookUp) + { + FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; + if (!modelLookUp.SingleChoiceMode) moduleReturnCheck = true; + table = rccbe.DataSource as DataTable; + } + if (rccbe.Buttons[1].Tag is FrmModelLookUp2) + { + FrmModelLookUp2 modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp2; + if (!modelLookUp.SingleChoiceMode) moduleReturnCheck = true; + table = rccbe.DataSource as DataTable; + } + + + } + if (table != null && table.Rows.Count > 0 && table.Columns.Count > 0) + { + if (moduleReturnCheck) + { + string[] values = (text + "").Trim(',').Split(','); + string textNew = string.Empty; + foreach (string value in values) + { + DataRow rowItemNew = table.Select("1=1").FirstOrDefault(x => (value + "").Equals(x[model.TextMember] + "")); + if (rowItemNew != null) + { + textNew += rowItemNew[model.ValueMember] + ","; + } + } + result = !string.IsNullOrEmpty(textNew) ? textNew == text + "" : false; + return !string.IsNullOrEmpty(textNew) ? textNew : text; + } + DataRow rowItem = table.Select("1=1").FirstOrDefault(x => (text + "").Equals(x[model.TextMember] + "")); + result = rowItem != null ? rowItem[model.ValueMember] + "" == text + "" : false; + return rowItem != null ? rowItem[model.ValueMember] + "" : text; + } + result = false; + return text; + } + + /// /// 去除多选框中的空格 /// @@ -3492,9 +3685,13 @@ namespace Lskj.Control RepositoryItemProgressBar progressEdit = new RepositoryItemProgressBar(); progressEdit.ShowTitle = true; + this.ProgressBarColumn.Add(gridColumn.FieldName); gridControl.RepositoryItems.Add(progressEdit); gridColumn.ColumnEdit = progressEdit; } + + + /// /// 说明:创建CheckBoxEdit /// 创建人:龚宇超 @@ -3925,12 +4122,15 @@ namespace Lskj.Control } + /// + /// 把输入值添加到数据源中 + /// + /// + /// private void gridLookUpEdit1_EditValueChangingAdd(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e) { try { - - GridLookUpEdit edit = sender as GridLookUpEdit; RepositoryItemGridLookUpEdit searchEdit = edit.Properties; DataTable dt = (searchEdit.DataSource as DataTable); @@ -4507,9 +4707,14 @@ namespace Lskj.Control btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabSelectReturnIdNew ? model.ValueMember : model.TextMember; - //DataTable dataTable = MainImpl.GetDataTableResult(modelLookUp.SingleChoiceMode ? modelLookUp.SysModel.MenuSql : model.SqlSource); - ////ModuleEnclosure.Add(model.FieldName, dataTable); - //btnEdit.DataSource = dataTable; + + if (model.ModuleFrameDisplayText) + { + DataTable dataTable = MainImpl.GetDataTableResult(modelLookUp.SysModel.MenuSql); + btnEdit.DataSource = dataTable; + } + + btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); @@ -5348,6 +5553,18 @@ namespace Lskj.Control GridColumn col = gridView.VisibleColumns[_colNumber]; GridColumnModel model = col.Tag as GridColumnModel; + if (!string.IsNullOrWhiteSpace(model.DisableCond)) + { + DataRow FocusedRow = newRow == null? this.gridView.GetFocusedDataRow(): newRow; + string UpdateCond = model.DisableCond; + if (this.ParentControl != null) UpdateCond = this.ParentControl.ReplaceParentControlValue(model.DisableCond); + UpdateCond = ReplaceHelper.ReplaceRowParam(FocusedRow, UpdateCond); + if (!ReplaceHelper.EvalCond(UpdateCond)) + { + _colNumber += 1; + continue; + } + } if (model != null && !model.ProhibitPaste && (model.CanCopy || ((gridView.OptionsBehavior.Editable) && (gridView.VisibleColumns[_colNumber].OptionsColumn.AllowEdit)))) { // 返回ID类型特殊处理 @@ -5366,22 +5583,31 @@ namespace Lskj.Control continue; } } - if (model.FieldType == 116) + if (model.FieldType == 116 || model.FieldType == 117) { RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; - if (modelLookUp.SingleChoiceMode) + value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); + //// 避免下拉框值替换失败提示错误 + if (model != null && !IsTextEqualValue && cellValue == value + "") { - value = GetValueByCaption(model, col.ColumnEdit, cellValue, out IsTextEqualValue); - //// 避免下拉框值替换失败提示错误 - if (model != null && !IsTextEqualValue && cellValue == value + "") - { - _colNumber += 1; - continue; - } + _colNumber += 1; + continue; } } + if (model.FieldType == 160 || model.FieldType == 161) + { + RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; + FrmModelLookUp2 modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp2; + value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); + //// 避免下拉框值替换失败提示错误 + if (model != null && !IsTextEqualValue && cellValue == value + "") + { + _colNumber += 1; + continue; + } + } DateTime dateValue = new DateTime(); @@ -5562,6 +5788,19 @@ namespace Lskj.Control GridColumn col = gridView.VisibleColumns[_colNumber]; GridColumnModel model = col.Tag as GridColumnModel; + if (!string.IsNullOrWhiteSpace(model.DisableCond)) + { + DataRow FocusedRow = this.gridView.GetFocusedDataRow(); + string UpdateCond = model.DisableCond; + if (this.ParentControl != null) UpdateCond = this.ParentControl.ReplaceParentControlValue(model.DisableCond); + UpdateCond = ReplaceHelper.ReplaceRowParam(FocusedRow, UpdateCond); + if (!ReplaceHelper.EvalCond(UpdateCond)) + { + _colNumber += 1; + continue; + } + } + if (model != null && !model.ProhibitPaste && (model.CanCopy || ((gridView.OptionsBehavior.Editable) && (gridView.VisibleColumns[_colNumber].OptionsColumn.AllowEdit)))) //if ((gridView.OptionsBehavior.Editable) && (gridView.VisibleColumns[_colNumber].OptionsColumn.AllowEdit)) { // 返回ID类型特殊处理 @@ -5579,6 +5818,35 @@ namespace Lskj.Control continue; } } + + if (model.FieldType == 116 || model.FieldType == 117) + { + RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; + FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; + + value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); + //// 避免下拉框值替换失败提示错误 + if (model != null && !IsTextEqualValue && cellValue == value + "") + { + _colNumber += 1; + continue; + } + + } + if (model.FieldType == 160 || model.FieldType == 161) + { + RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; + FrmModelLookUp2 modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp2; + value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); + //// 避免下拉框值替换失败提示错误 + if (model != null && !IsTextEqualValue && cellValue == value + "") + { + _colNumber += 1; + continue; + } + + } + DateTime dateValue = new DateTime(); // 避免下拉框值替换失败提示错误 @@ -5823,17 +6091,18 @@ namespace Lskj.Control // } //} - if (gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect) { int[] selectRows = gridView.GetSelectedRows(); foreach (int selectRow in selectRows) {//#9feb6a if (e.RowHandle == selectRow) - e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); - if (!string.IsNullOrWhiteSpace(SystemInfo.Instance.SelectRowForeColor)) { - e.Appearance.ForeColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowForeColor); + e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); + if (!string.IsNullOrWhiteSpace(SystemInfo.Instance.SelectRowForeColor)) + { + e.Appearance.ForeColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowForeColor); + } } } } @@ -5928,6 +6197,7 @@ namespace Lskj.Control if (model == null) return; DataRow rowHandleRow = this.GridView.GetDataRow(e.RowHandle); + //值改变时,如果是验证是否重复的列报错就清除 if (RepeatedVerificationNames.Count > 0) { @@ -6233,6 +6503,7 @@ namespace Lskj.Control DXMenuItem itemPrintColumn = new DXMenuItem("打印表格数据", PrintItemClick); DXMenuItem itemSortColumn = new DXMenuItem("清除全部列排序", ClearSortItemClick); DXMenuItem itemMultifunction = new DXMenuItem("多功能设置分组", Multifunction); + DXMenuItem itemLookUpColumn = new DXMenuItem("查找列", LookUpColumn); DXMenuItem itemColumnSift = new DXMenuItem("一键设置列筛选条件", InstColumnSift); DXMenuItem itemChartColumn = new DXMenuItem("一键图表展示", ChartShowClick); DXMenuItem itemBsChartColumn = new DXMenuItem("一键Bs图表展示", BsChartShowClick); @@ -6244,7 +6515,7 @@ namespace Lskj.Control itemSaveColumn.BeginGroup = itemFixLeft.BeginGroup = true; itemUnFixAll.Tag = itemFixLeft.Tag = itemFixLeftAll.Tag = itemUnFix.Tag = itemColumnSift.Tag = e.HitInfo.Column; itemSaveColumn.Tag = itemResetColumn.Tag = itemExportColumn.Tag = itemPrintColumn.Tag = itemSortColumn.Tag = itemChartColumn.Tag = itemBsChartColumn.Tag = itemBsChartShowClick.Tag = itemSetExportColumn.Tag = e.HitInfo.Column; - columnMenu.Items.AddRange(new DXMenuItem[] { itemFixLeft, itemFixLeftAll, itemUnFix, itemUnFixAll }); + columnMenu.Items.AddRange(new DXMenuItem[] { itemFixLeft, itemFixLeftAll, itemUnFix, itemUnFixAll, itemLookUpColumn }); if (!string.IsNullOrEmpty(CustomColumKey)) columnMenu.Items.AddRange(new DXMenuItem[] { itemSaveColumn, itemResetColumn, itemSetExportColumn }); if (ExportPermission) columnMenu.Items.Add(itemExportColumn); columnMenu.Items.AddRange(new DXMenuItem[] { itemPrintColumn, itemMultifunction, itemSortColumn, itemColumnSift, itemChartColumn, itemBsChartColumn, itemBsChartShowClick }); @@ -6257,6 +6528,9 @@ namespace Lskj.Control } } + + + /// /// 说明:带参数自动搜索框 /// 创建人:龚宇超 @@ -8880,4 +9154,52 @@ namespace Lskj.Control { // 只处理列名可解析成日期的列 if (!DateTime.TryParse(col.FieldName, out _)) - \ No newline at end of file + continue; + + // 取 “Sum” 合计 + var sumItem = col.Summary + .OfType() + .FirstOrDefault(s => s.SummaryType == SummaryItemType.Sum); + + bool needRed = false; + + if (sumItem?.SummaryValue != null && + decimal.TryParse(sumItem.SummaryValue.ToString(), out var colSum) && + jhrowitem.Table.Columns.Contains(col.FieldName) && + decimal.TryParse(jhrowitem[col.FieldName].ToString(), out var planVal)) + { + needRed = (colSum != planVal); + } + + // 只改表头文字颜色 + col.AppearanceHeader.ForeColor = needRed ? Color.Red : Color.Black; + col.AppearanceHeader.Options.UseForeColor = true; + } + // 立刻刷新表头 + gridView.Invalidate(); + } + + + + + + /// + /// 分组后根据汇总排序 + /// + /// + /// + private void GridView_EndGrouping(object sender, EventArgs e) + { + int currentGroupCount = gridView.GroupedColumns.Count; + + // 仅在分组状态变化(新增分组)时执行 + if (SystemInfo.Instance.GroupSpecialMode && +currentGroupCount != _lastGroupCount && currentGroupCount > 0 && Completed) + { + Completed = false; + try + { + // 清除现有排序规则 + gridView.GroupSummarySortInfo.Clear(); + // 遍历多目标汇总列,按优先级添加排序 + foreach (GridColumn gridColumn in gridView.Columns) + \ No newline at end of file diff --git a/插件库/Lskj.Control/LabelAutoGridLook.cs b/插件库/Lskj.Control/LabelAutoGridLook.cs index f81c8e2..74f9847 100644 --- a/插件库/Lskj.Control/LabelAutoGridLook.cs +++ b/插件库/Lskj.Control/LabelAutoGridLook.cs @@ -52,6 +52,10 @@ namespace Lskj.Control private bool _working = false; private List _queryQueue = new List(); /// + /// 是否点击弹出框中的行 + /// + private bool PopupBoxSelection = false; + /// /// 显示值字段 /// public string TextField @@ -236,7 +240,8 @@ namespace Lskj.Control if (this.Model != null && (this.Model.FieldType == ControlType.LabAutoGridValue || this.Model.FieldType == ControlType.LabAutoGridValueParam)) { // 存在名称并且没有value值则 - if (control != null && !string.IsNullOrEmpty(control.EditText) && (string.IsNullOrEmpty(_value) || !control.EditText.Equals(this._textVlaue))) + //PopupBoxSelection为ture时代表在弹出框中选中行,就不根据当前输入值判断了(可能输入一半查询到后就直接选中,或者输入123,选中1234,但是control.EditText值还是123导致出错) + if (control != null && !string.IsNullOrEmpty(control.EditText) && (string.IsNullOrEmpty(_value) || !control.EditText.Equals(this._textVlaue))&& !PopupBoxSelection) { if (this.DataSource != null && this.DataSource is DataTable) { @@ -761,6 +766,8 @@ namespace Lskj.Control } return maxWidth; } + + /// /// 实际值发生改变触发 /// @@ -770,6 +777,7 @@ namespace Lskj.Control { try { + this.PopupBoxSelection = true; GridView gridView = sender as GridView; DataRow rowItem = gridView.GetFocusedDataRow(); if (rowItem != null && rowItem.Table.Columns.Contains(ValueMember)) @@ -782,6 +790,10 @@ namespace Lskj.Control string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } + finally + { + this.PopupBoxSelection = false; + } } @@ -797,40 +809,4 @@ namespace Lskj.Control { this.EditValue = rowItem[ValueMember] + ""; } - } - catch (Exception ex) - { - string Message = ErrorMessage.PromptErrorMessage(ex); - MessageUtil.Show(Message, ex.Message); - } - } - } - - - - /// - /// 说明:释放时清理数据源 - /// 创建人:龚宇超 - /// 创建日期:2018-03-16 - /// 修改人: - /// 修改日期: - /// 修改备注: - /// 版本:1.0 - private void OnLabelAutoGridLook_Disposed(object sender, EventArgs e) - { - if (this.DataSourceTable != null) - { - this.DataSourceTable.Clear(); - this.DataSourceTable.Dispose(); - } - if (this.DataSource != null) - { - this.DataSource = null; - } - GC.Collect(); - } - - - - } -} \ No newline at end of file + \ No newline at end of file diff --git a/插件库/Lskj.Control/LabelMultiAutoTextEdit4.cs b/插件库/Lskj.Control/LabelMultiAutoTextEdit4.cs index c47aa8d..a56de62 100644 --- a/插件库/Lskj.Control/LabelMultiAutoTextEdit4.cs +++ b/插件库/Lskj.Control/LabelMultiAutoTextEdit4.cs @@ -27,7 +27,7 @@ namespace Lskj.Control /// /// The _look up form /// - private FrmModelLookUp2 _lookUpForm = null; + public FrmModelLookUp2 _lookUpForm = null; /// /// 绑定ValueMember /// @@ -82,6 +82,15 @@ namespace Lskj.Control ///模块选择返回框,配置列加载模式(默认根据sql动态加载列) /// public bool ConfigureColumnMode { get; set; } + /// + /// 数据源 + /// + public DataTable DataSource; + /// + /// 显示text值(保存id,显示text值) + /// + public bool ModuleFrameDisplayText; + private string editValue; @@ -167,6 +176,31 @@ namespace Lskj.Control set { this.EditValue = value; + if (ModuleFrameDisplayText) + { + if (!string.IsNullOrEmpty(value) && this.DataSource != null) + { + string[] values = value.Trim(',').Split(','); + string text = string.Empty; + foreach (string item in values) + { + DataRow rowItem = this.DataSource.Rows.Cast().FirstOrDefault(x => x[ValueMember] + "" == item); + if (rowItem != null) + { + text += rowItem[TextField] + ","; + } + } + this.txtEdit.Text = text.TrimEnd(','); + } + else + { + this.txtEdit.Text = ""; + } + } + else + { + this.TextEdit.Text = value.TrimEnd(','); + } } } @@ -181,18 +215,9 @@ namespace Lskj.Control /// 修改备注: /// 版本:1.0 /// - public string EditValue - { - get - { - return this.TextEdit.Text; - } - set - { - this.TextEdit.Text = value.TrimEnd(','); - this.editValue = value.TrimEnd(','); - } - } + public string EditValue; + + /// /// 说明:设置控件提示文本 /// 创建人:龚宇超 @@ -351,5 +376,6 @@ namespace Lskj.Control if (result == DialogResult.OK) { string value = Model.FieldType == ControlType.LabSelectReturnIdNew ? _lookUpForm.EditValue : _lookUpForm.EditText; - this.EditValue = value; - \ No newline at end of file + this.EditText = value; + //this.EditValue = value; + \ No newline at end of file diff --git a/插件库/Lskj.Control/Model/ControlModel.cs b/插件库/Lskj.Control/Model/ControlModel.cs index c01534f..43b6c8e 100644 --- a/插件库/Lskj.Control/Model/ControlModel.cs +++ b/插件库/Lskj.Control/Model/ControlModel.cs @@ -321,4 +321,12 @@ namespace Lskj.Control.Model /// public bool ScanAfterEmpty { get; set; } /// - ///是否为 导入返 \ No newline at end of file + ///是否为 导入返回值控件(每次导入前刷新默认值并带入) + /// + public bool ImportReturnValue { get; set; } + /// + ///是否为 导入控件(每次导入前把当前控件值带入) + /// + public bool ImportCurrentValue { get; set; } + /// + ///是否为 \ No newline at end of file diff --git a/插件库/Lskj.Control/Model/GridDetailModel.cs b/插件库/Lskj.Control/Model/GridDetailModel.cs index 3ce34b5..4df75df 100644 --- a/插件库/Lskj.Control/Model/GridDetailModel.cs +++ b/插件库/Lskj.Control/Model/GridDetailModel.cs @@ -108,6 +108,11 @@ namespace Lskj.Control.Model /// true if this instance is web view; otherwise, false. public bool IsDetailView { get { return this._detailType == 4; } } /// + /// 明细页签(带虚拟日期) + /// + /// true if this instance is web view; otherwise, false. + public bool IsSched { get { return this._detailType == 7; } } + /// /// sql配置明细是否可以保存 /// public bool DetailIsSave; @@ -273,7 +278,10 @@ namespace Lskj.Control.Model ///mrp条件页签(根据页签选中行去设置别的页签中对应的条件) /// public bool MrpConditionTab; - + /// + /// 刷新明细的序号(排产模块) + /// + public string PlanLetfControl; /// /// 主模块编号 @@ -332,4 +340,5 @@ namespace Lskj.Control.Model this.Enablecond = item.Table.Columns.Contains("Enablecond") ? (item["Enablecond"] + "") : string.Empty; this.DBClickEvent = item.Table.Columns.Contains("DBClickEvent") ? "1".Equals(item["DBClickEvent"] + "") : false; this.ProhibitRefresh = item.Table.Columns.Contains("ProhibitRefresh") ? "1".Equals(item["ProhibitRefresh"] + "") : false; - this.DragExecuteSql = item.Ta \ No newline at end of file + this.DragExecuteSql = item.Table.Columns.Contains("DragExecuteSql") ? item["DragExecuteSql"] + "" : ""; + this.QueryAgain = item.Table.Col \ No newline at end of file diff --git a/插件库/Lskj.Control/Model/GridDragGrid.cs b/插件库/Lskj.Control/Model/GridDragGrid.cs index 4e2536d..3829b60 100644 --- a/插件库/Lskj.Control/Model/GridDragGrid.cs +++ b/插件库/Lskj.Control/Model/GridDragGrid.cs @@ -19,6 +19,10 @@ using DevExpress.Utils; using System.Data; using DevExpress.XtraGrid; using Lskj.Util; +using DevExpress.XtraTreeList.Nodes; +using DevExpress.XtraTreeList; +using DevExpress.XtraTreeList.Columns; +using DevExpress.Data; namespace Lskj.Control.Model { @@ -450,27 +454,83 @@ namespace Lskj.Control.Model } #endregion - /// - /// 拖拽时判断条件 - /// - /// - protected bool JudgingConditions() + + #region 树表格第一列添加复选框 + public static void TreeListAddCheckBox(TreeList treeList) { - if (!string.IsNullOrWhiteSpace(DragConditions)) + treeList.OptionsView.ShowCheckBoxes = true; + treeList.OptionsSelection.MultiSelect = true; + treeList.OptionsSelection.MultiSelectMode = TreeListMultiSelectMode.RowSelect; + treeList.OptionsSelection.InvertSelection = true; + treeList.OptionsSelection.UseIndicatorForSelection = true; + treeList.OptionsSelection.EnableAppearanceFocusedCell = false; + // 绑定节点勾选状态变更事件 + treeList.AfterCheckNode += OnTreeListAfterCheckNode; + + // 遍历所有列,设置需要自定义汇总的列 + foreach (TreeListColumn column in treeList.Columns) { - string DragCond = ReplaceHelper.ReplaceRowParam(this._targetGridView.GetDataRow(this._targetGridView.FocusedRowHandle), DragConditions); - DataRow[] rows = GetGridSelectRows(DragHander.Count > 1 && this._sourceGridView.GetSelectedRows().Length == DragHander.Count ? DragHander.ToArray() : this._sourceGridView.GetSelectedRows()); - foreach (DataRow row in rows) + GridColumnModel columnModel = (GridColumnModel)column.Tag; + if (treeList.Columns.IndexOf(column) > 0 && columnModel != null && columnModel.CanSum) { - if (!ReplaceHelper.ReplaceRowParamCond(row, DragCond)) - { - return false; - } + column.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Custom; + column.RowFooterSummary = DevExpress.XtraTreeList.SummaryItemType.Custom; + //SummaryItem groupSummaryItem = treeList.GroupSummary.FirstOrDefault(n => n.FieldName == column.FieldName); + //if (groupSummaryItem != null) + //{ + // groupSummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Custom; + //} } } - return true; } + // 节点勾选状态变更事件处理方法 + private static void OnTreeListAfterCheckNode(object sender, NodeEventArgs e) + { + TreeList treeList = sender as TreeList; + if (treeList == null) return; - } -} + // 更新子节点状态 + UpdateChildNodes(e.Node, e.Node.Checked); + + // 更新父节点状态 + UpdateParentNode(e.Node); + } + + // 递归更新子节点的选中状态 + private static void UpdateChildNodes(TreeListNode node, bool check) + { + foreach (TreeListNode childNode in node.Nodes) + { + childNode.Checked = check; + UpdateChildNodes(childNode, check); + } + } + + // 更新父节点的选中状态 + private static void UpdateParentNode(TreeListNode node) + { + TreeListNode parentNode = node.ParentNode; + if (parentNode == null) return; + + bool allChecked = true; + bool allUnchecked = true; + + // 检查所有兄弟节点的状态 + foreach (TreeListNode siblingNode in parentNode.Nodes) + { + if (siblingNode.Checked) + allUnchecked = false; + else + allChecked = false; + + if (!allChecked && !allUnchecked) + break; + } + + // 根据兄弟节点状态设置父节点状态 + parentNode.Checked = allChecked; + parentNode.CheckState = allChecked ? CheckState.Checked : + (allUnchecked ? CheckState.Unchecked : CheckState.Indeterminate); + + // 递 \ No newline at end of file diff --git a/插件库/Lskj.Control/Model/GridExtend.cs b/插件库/Lskj.Control/Model/GridExtend.cs index 13d5a05..3de1fa3 100644 --- a/插件库/Lskj.Control/Model/GridExtend.cs +++ b/插件库/Lskj.Control/Model/GridExtend.cs @@ -1282,8 +1282,8 @@ namespace Lskj.Control.Model { try { - string sqlstr = "select fieldName,userName from {0} where {1}='{2}' and isExport='1' and OperatorName='{3}'"; - sqlstr = string.Format(sqlstr, ResourceKeys.SettingExportTableName, "formkey", CustomColumKey, ERPInfo.Instance.UserName); + string sqlstr = "select fieldName,userName from {0} where {1}='{2}' and isExport='1' and OperatorId='{3}'"; + sqlstr = string.Format(sqlstr, ResourceKeys.SettingExportTableName, "formkey", CustomColumKey, ERPInfo.Instance.UserId); isExportTab = SqlHelper.ExecuteDataTable(sqlstr); } catch (Exception) @@ -1508,8 +1508,8 @@ namespace Lskj.Control.Model { try { - string sqlstr = "select fieldName,userName from {0} where {1}='{2}' and isExport='1' and OperatorName='{3}'"; - sqlstr = string.Format(sqlstr, ResourceKeys.SettingExportTableName, "formkey", CustomColumKey, ERPInfo.Instance.UserName); + string sqlstr = "select fieldName,userName from {0} where {1}='{2}' and isExport='1' and OperatorId='{3}'"; + sqlstr = string.Format(sqlstr, ResourceKeys.SettingExportTableName, "formkey", CustomColumKey, ERPInfo.Instance.UserId); isExportTab = SqlHelper.ExecuteDataTable(sqlstr); } catch (Exception) diff --git a/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs b/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs index cfb2f54..739c174 100644 --- a/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs +++ b/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs @@ -513,8 +513,24 @@ namespace Lskj.Control.Model // 特殊处理程序 else if (dllName.Contains(".exe") && !model.WipeExes.Contains(dllName.ToString()) && (dllName.ToLower() != "lstest.exe")) { + //删除选中行的json信息 + if(!string.IsNullOrWhiteSpace(maintabFocusedRowJson))paramList.Remove(maintabFocusedRowJson); + // 创建进程启动信息对象 + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.FileName = File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName; // 指定要启动的 EXE 路径 + // 将参数数组拼接为命令行字符串(注意空格处理) + // 若参数包含空格,需要用双引号包裹,避免被解析为多个参数 + startInfo.Arguments = string.Join(" ", paramList.Select(arg => + arg.Contains(" ") ? $"\"{arg}\"" : arg + )); + // 可选:设置进程启动选项 + startInfo.UseShellExecute = false; // 不使用系统外壳程序(建议为 false,便于重定向输入输出) + startInfo.CreateNoWindow = false; // 是否在新窗口中启动(false 为显示窗口) + // 启动进程 + Process process = Process.Start(startInfo); + // 执行exe程序 - WinHelper.WinExec(File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName, 1); + //WinHelper.WinExec(File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName, 1); } else if (dllName.StartsWith("www.") || diff --git a/插件库/Lskj.Control/Model/MyControl.cs b/插件库/Lskj.Control/Model/MyControl.cs index d13c266..b8f6c71 100644 --- a/插件库/Lskj.Control/Model/MyControl.cs +++ b/插件库/Lskj.Control/Model/MyControl.cs @@ -148,7 +148,10 @@ namespace Lskj.Control.Model /// 如果主表刷新后还要选中之前的明细,就要存主表主键值(目前没用传进来) /// public Dictionary> DetailSelection = new Dictionary>(); - + /// + /// 是否为审核界面主表 + /// + public bool isAuditMain = false; /// @@ -496,6 +499,10 @@ namespace Lskj.Control.Model { baseControl.ModifyDefaultColors(ColorTranslator.FromHtml(model.ControlTitleColor)); } + if (this.isAuditMain && !string.IsNullOrWhiteSpace(model.AuditControlTitleColor)) + { + baseControl.ModifyAuditDefaultColors(ColorTranslator.FromHtml(model.AuditControlTitleColor)); + } baseControl.Required = model.IsEmpty; baseControl.ReadOnly = model.ReadOnly; @@ -1443,7 +1450,8 @@ namespace Lskj.Control.Model model.SourceSql += "and 1<>1"; } DataTable table = new DataTable(); - if (!ControlType.IsNotLoadData(model.FieldType) && model.FieldType != ControlType.LabTreeType) + + if ((!ControlType.IsNotLoadData(model.FieldType)|| model.ModuleFrameDisplayText && (model.FieldType == 160|| model.FieldType == 161)) && model.FieldType != ControlType.LabTreeType) { if (mControlSourceDic.ContainsKey(model)) { @@ -1554,6 +1562,11 @@ namespace Lskj.Control.Model LabelMultiAutoTextEdit2 moduleReturnsId = ctr as LabelMultiAutoTextEdit2; moduleReturnsId.SetDataSource(table); break; + case ControlType.LabSelectReturnIdNew: + case ControlType.LabSelectReturnTextNew: + LabelMultiAutoTextEdit4 moduleReturnsIdnew = ctr as LabelMultiAutoTextEdit4; + moduleReturnsIdnew.DataSource=table; + break; case ControlType.DynamicallyGeneratedSql: LabelMultiAutoTextEdit3 moduleSqlGenerated = ctr as LabelMultiAutoTextEdit3; //moduleSqlGenerated.SetDataSource(table); @@ -4008,6 +4021,8 @@ namespace Lskj.Control.Model model.PrivilegeView = item.Table.Columns.Contains("PrivilegeView") ? item["PrivilegeView"] + "" : ""; model.PrivilegeOper = item.Table.Columns.Contains("PrivilegeOper") ? item["PrivilegeOper"] + "" : ""; model.AdditionalAssociations = item.Table.Columns.Contains("AdditionalAssociations") && !string.IsNullOrWhiteSpace(item["AdditionalAssociations"] + "") ? "1".Equals(item["AdditionalAssociations"] + "") : false; + model.AuditControlTitleColor = item.Table.Columns.Contains("AuditControlTitleColor") ? item["AuditControlTitleColor"] + "" : ""; + model.ModuleFrameDisplayText = item.Table.Columns.Contains("ModuleFrameDisplayText") ? "1".Equals(item["ModuleFrameDisplayText"] + "") : false; //为了和工具里和bs里统一 if (model.FieldType == 42) { @@ -4539,6 +4554,14 @@ namespace Lskj.Control.Model moduleReturnsIdNew.ConfigureColumnMode = model.ConfigureColumnMode; moduleReturnsIdNew.InitialFrame(); + model.SourceSql = ""; + //设置了ModuleFrameDisplayText(显示text值),就把配置的模块sql传给model.SourceSql + if (model.ModuleFrameDisplayText) + { + moduleReturnsIdNew.ModuleFrameDisplayText = true; + model.SourceSql = moduleReturnsIdNew._lookUpForm.SysModel.MenuSql; + } + // DataTable dataSource = new DataTable(); //moduleReturnsIdNew.SetDataSource(dataSource); moduleReturnsIdNew.TextEdit.KeyDown += new KeyEventHandler(OnTextEditKeyDown); @@ -6036,4 +6059,30 @@ namespace Lskj.Control.Model LabelDateEdit dateEdit = controlObj as LabelDateEdit; value = dateEdit.TextEdit.EditValue == null ? dateEdit.EditText : dateEdit.TextEdit.DateTime.ToString("yyyy-MM-dd"); } - else if \ No newline at end of file + else if (controlObj is LabelCheckEdit) + { + LabelCheckEdit checkEdit = controlObj as LabelCheckEdit; + value = checkEdit.EditText; + } + else if (controlObj is LabelComboxEdit) + { + LabelComboxEdit autoEdit = controlObj as LabelComboxEdit; + value = autoEdit.EditValue; + } + else if (controlObj is LabelTextEdit) + { + LabelTextEdit textIntEdit = controlObj as LabelTextEdit; + if (textIntEdit != null) value = string.IsNullOrEmpty(textIntEdit.EditText) ? "0" : textIntEdit.EditText; + } + + defaultValue = defaultValue.Replace(item, value); + } + + } + } + return defaultValue; + } + + + } +} \ No newline at end of file diff --git a/插件库/Lskj.Control/ModuleGridDetailEx.cs b/插件库/Lskj.Control/ModuleGridDetailEx.cs index 20c7f1b..0e11624 100644 --- a/插件库/Lskj.Control/ModuleGridDetailEx.cs +++ b/插件库/Lskj.Control/ModuleGridDetailEx.cs @@ -500,10 +500,11 @@ namespace Lskj.Control } else { + this.TabObj.TabPages.Clear(); DataRow rowItem = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow(); + if (rowItem == null) return; string mainModuleCode = (rowItem[SysModel.MainModuleCodeField] + "").ToLower(); //mainModuleCode = String.Empty; - this.TabObj.TabPages.Clear(); //if (string.IsNullOrWhiteSpace(mainModuleCode)) return; if (!string.IsNullOrWhiteSpace(mainModuleCode) && this.tcButtom.DetailTabPagesDic.ContainsKey(mainModuleCode)) { @@ -820,29 +821,6 @@ namespace Lskj.Control { moduleGridEx.ParentButtonState(rowItem); moduleGridEx.SelectTheSpecifiedRow(); - //主表,页签中的表格都设置了复选框,并且为第一个页签 - //if (this.ModuleGridObj.GridControlObj.GridView.OptionsSelection.MultiSelect == true && moduleGridEx.GridControlObj.GridView.OptionsSelection.MultiSelect == true && this.TabObj.TabPages[0] == tabPage) - //{ - // if (this.SearchObj.DetailSelection.ContainsKey(model.DetailName)) - // { - // Dictionary dictionary = this.SearchObj.DetailSelection[model.DetailName]; - // if (dictionary.ContainsKey(rowItem)) - // { - // DataTable dataTable = moduleGridEx.GridControlObj.GridControl.DataSource as DataTable; - // string value = dictionary[rowItem]; - // for (int rowHandle = 0; rowHandle < moduleGridEx.GridControlObj.GridView.RowCount; rowHandle++) - // { - // string cellValue = moduleGridEx.GridControlObj.GridView.GetRowCellValue(rowHandle, moduleGridEx.ParmaryKey) + ""; - // if (value.Split(',').Contains(cellValue)) - // { - // moduleGridEx.GridControlObj.GridView.SelectRow(rowHandle); // 勾选 - // } - // } - - // } - // } - //} - } } @@ -1352,4 +1330,40 @@ namespace Lskj.Control } } - \ No newline at end of file + } + + /// + /// 判断是否有未保存的数据,并保存 + /// + /// + public bool VerificationInterface() + { + if (SystemInfo.Instance.EfficientVerification) + { + //页签验证 + if (!this.TcButtom.CheckIfSaved()) + { + return false; + } + //主表验证 + if (this.ModuleGridObj.GridControlObj.IsDataNotSaved()) + { + DialogResult dialog = MessageUtil.Show("主表有数据未保存,是否保存", MessageBoxButtons.YesNo); + if (dialog == DialogResult.Yes) + { + bool SaveResults = this.ModuleGridObj.SaveWhenSwitching(); + if (!SaveResults) return false; + } + } + + } + return true; + } + + + + + + + } +} \ No newline at end of file diff --git a/插件库/Lskj.Control/ModuleGridEx.cs b/插件库/Lskj.Control/ModuleGridEx.cs index 73f6a51..167d95d 100644 --- a/插件库/Lskj.Control/ModuleGridEx.cs +++ b/插件库/Lskj.Control/ModuleGridEx.cs @@ -498,6 +498,7 @@ namespace Lskj.Control //this.SearchObj.preSearchVerification += new PreSearchVerification(OnPreSearchVerification);// 查询条件执行前 this.SearchObj.OnSearchBeforeCallBack += new SearchEventHandler(OnSearchBeforeCallBack);// 查询条件执行前 this.SearchObj.OnSearchAfterCallBack += new EventHandler(OnSearchAfterCallBack);// 查询条件执行后 + this.SearchObj.TreeExactQuery = this.TreeExactQuery; // 明细表格默认不查询 this.SearchObj.OnDataSourceBindCallBack += new EventHandler(OnMainSearchDataSourceBindCallBack);// 数据源绑定完成触发 @@ -891,6 +892,12 @@ namespace Lskj.Control //父节点编号 (this.gcMain as TreeBandedGridControlEx).TreeListObj.ParentFieldName = SysModel.TreeParentFieldName; } + + if (this.SysModel.GridObjIsCheck == 1)//主表加载复选框 + { + GridDragGrid.TreeListAddCheckBox((this.gcMain as TreeBandedGridControlEx).TreeListObj); + } + this.panelControl1.Controls.Add(this.gcMain); } else if (this.Model.GridEnumObj == GridEnum.BandedGridView || SysModel.AutoMultiHeader == 1) @@ -924,6 +931,14 @@ namespace Lskj.Control //父节点编号 (this.gcMain as TreeGridControlEx).TreeListObj.ParentFieldName = SysModel.TreeParentFieldName; } + + if (this.SysModel.GridObjIsCheck == 1)//主表加载复选框 + { + GridDragGrid.TreeListAddCheckBox((this.gcMain as TreeGridControlEx).TreeListObj); + } + + + this.panelControl1.Controls.Add(this.gcMain); } @@ -3451,13 +3466,17 @@ namespace Lskj.Control if (isContains) { - this.btnAdd.Enabled = this.SysModel.AddEnable && this.ValidateCond(this.SysModel.AddCond, rowItem, "P_SystemDllTab", "addCond"); // 判断添加权限 - this.btnDel.Enabled = this.SysModel.DeleteEnable && this.ValidateCond(this.SysModel.DeleteCond, rowItem, "P_SystemDllTab", "deleteCond"); // 判断删除权限 - this.btnSave.Enabled = this.SysModel.ModifyEnable && this.ValidateCond(this.SysModel.ModifyCond, rowItem, "P_SystemDllTab", "modifyCond"); // 判断修改权限 - this.btnImport.Enabled = this.SysModel.ImportEnable && this.ValidateCond(this.SysModel.ImportCond, rowItem, "P_SystemDllTab", "importCond"); // 判断导入权限 - this.btnExport.Enabled = this.SysModel.ExportEnable && this.ValidateCond(this.SysModel.ExportCond, rowItem, "P_SystemDllTab", "exportCond") && this.SysModel.ExportPermission; // 判断导出权限 + DataRow currentRow = this.gcMain.GridView.GetFocusedDataRow(); + //把父表选中行和当前行都替换后在判断,避免传入行为null时,默认为true的情况 + this.btnAdd.Enabled = this.SysModel.AddEnable && this.ValidateCond(ReplaceHelper.ReplaceRowParam(currentRow, ReplaceHelper.ReplaceRowParam(rowItem, this.SysModel.AddCond)), null, "P_SystemDllTab", "addCond"); // 判断添加权限 + this.btnDel.Enabled = this.SysModel.DeleteEnable && this.ValidateCond(ReplaceHelper.ReplaceRowParam(currentRow, ReplaceHelper.ReplaceRowParam(rowItem, this.SysModel.DeleteCond)), null, "P_SystemDllTab", "deleteCond"); // 判断删除权限 + this.btnSave.Enabled = this.SysModel.ModifyEnable && this.ValidateCond(ReplaceHelper.ReplaceRowParam(currentRow, ReplaceHelper.ReplaceRowParam(rowItem, this.SysModel.ModifyCond)), null, "P_SystemDllTab", "modifyCond"); // 判断修改权限 + this.btnImport.Enabled = this.SysModel.ImportEnable && this.ValidateCond(ReplaceHelper.ReplaceRowParam(currentRow, ReplaceHelper.ReplaceRowParam(rowItem, this.SysModel.ImportCond)), null, "P_SystemDllTab", "importCond"); // 判断导入权限 + this.btnExport.Enabled = this.SysModel.ExportEnable && this.ValidateCond(ReplaceHelper.ReplaceRowParam(currentRow, ReplaceHelper.ReplaceRowParam(rowItem, this.SysModel.ExportCond)), null, "P_SystemDllTab", "exportCond") && this.SysModel.ExportPermission; // 判断导出权限 } } + + } catch (Exception) { @@ -3569,6 +3588,8 @@ namespace Lskj.Control this.gcMain.IgnoreTab = this.SysModel.IgnoreTab; } + + //判断是否隐藏数据导入按钮 string[] authorizedPersonnel = SysModel.ImportPermissions.Split(',');//有导入权限的人员 this.btnImport.Enabled = false; @@ -5060,6 +5081,7 @@ namespace Lskj.Control } } + } catch (Exception ex) { @@ -5068,6 +5090,9 @@ namespace Lskj.Control } } + + + /// /// 说明:粘贴表格后更新树结构关联字段 /// 创建人:龚宇超 @@ -5173,7 +5198,17 @@ namespace Lskj.Control { List buttons = new List();//没有隐藏的按钮集合 //刷新按钮 - buttons.Add(this.btnRefresh); + //刷新按钮 + if (SystemInfo.Instance.FoundationHideTableRefresh) + { + this.btnRefresh.Visible = false; + pl_top_right.Width = pl_top_right.Width - this.btnRefresh.Width; + } + else + { + buttons.Add(this.btnRefresh); + } + //帮助文档按钮 if (SystemInfo.Instance.HideHelpDocument) { @@ -5572,10 +5607,41 @@ namespace Lskj.Control MessageUtil.Show(Message, ex.Message); } } + + public int GetFirstThreeLinesHeight(RichEditControl richEdit) { if (string.IsNullOrEmpty(richEdit.Text)) return 0; // 获取字体和最大宽度 Document document = richEdit.Document; - \ No newline at end of file + Font font = richEdit.Font; + int maxWidth = richEdit.ClientSize.Width - richEdit.Padding.Horizontal; + + // 获取前3行文本 + string[] lines = richEdit.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + int lineCount = Math.Min(4, lines.Length); + string firstThreeLines = string.Join(Environment.NewLine, lines.Take(lineCount)); + + // 创建StringFormat + StringFormat format = new StringFormat(StringFormat.GenericTypographic); + format.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; + + // 测量文本高度 + using (Graphics g = richEdit.CreateGraphics()) + { + SizeF textSize = g.MeasureString( + firstThreeLines, + font, + maxWidth, + format + ); + return (int)Math.Ceiling(textSize.Height); + } + } + + + + + } +} diff --git a/插件库/Lskj.Control/ModulePanelEx.cs b/插件库/Lskj.Control/ModulePanelEx.cs index 0a2d333..004de38 100644 --- a/插件库/Lskj.Control/ModulePanelEx.cs +++ b/插件库/Lskj.Control/ModulePanelEx.cs @@ -2552,6 +2552,11 @@ namespace Lskj.Control else { string url = string.Format("pages/PhotoView.html?left=1&username={0}&password={1}&id={2}&isview={3}&dllcoid=", ERPInfo.Instance.UserName, ERPInfo.Instance.Password, idValue, this.btnUpdate.Enabled ? "0" : "1"); + if (!string.IsNullOrWhiteSpace(this.ParentKey)&& this.SysModel.AttachmentSelectNode) + { + url= string.Format("pages/PhotoView.html?left=1&username={0}&password={1}&id={2}&isview={3}&specno={4}&dllcoid=", ERPInfo.Instance.UserName, ERPInfo.Instance.Password, idValue, this.btnUpdate.Enabled ? "0" : "1", this.ParentKey); + } + // 固定传入参数(窗口标题、操作员ID、操作员名称、权限、模版编号) string[] defaultArgs = string.Format(ModuleArgs.DefaultArgs, this.Model.FormText, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, this.Model.Privilege, this.Model.ModuleCode).Split('~'); string[] menuArgs = SystemInfo.Instance.BsAttachFlag.Equals("1") ? new string[] { "", "", url } : new string[] { string.Format(ModuleArgs.PubPhotoViewArgs, this.PrimaryValue), "0", this.SysModel.MenuDirId + "", "" }; diff --git a/插件库/Lskj.Control/TabControlEx.cs b/插件库/Lskj.Control/TabControlEx.cs index e41a8ef..196722c 100644 --- a/插件库/Lskj.Control/TabControlEx.cs +++ b/插件库/Lskj.Control/TabControlEx.cs @@ -144,6 +144,10 @@ namespace Lskj.Control /// 页签控件集合 /// public Dictionary PageControlsDic = new Dictionary(); + /// + /// 页签名(判断是否有重复的左右结构) + /// + public string DetaiName = string.Empty; public TabControlEx() { InitializeComponent(); @@ -408,11 +412,16 @@ namespace Lskj.Control Dictionary dataCaches = Model?.DataCaches; + this.DetaiName = string.Empty; + foreach (GridDetailModel model in gridDetail) { // 子明细交给父明细右侧页签生成 if (model.Rightdockid > 0) continue; + if (this.DetaiName.Equals(model.DetailName) && isGridmerge) continue; + + bool hasRight = rightGroups.TryGetValue(model.Orderid, out var rightChildren); XtraTabPage page = new XtraTabPage @@ -487,7 +496,7 @@ namespace Lskj.Control this.xtc_container.TabPages.Add(page); var dtp = new DetailTabPageModel { - TabPageIndex = this._gridDetail.IndexOf(model), + TabPageIndex = this.xtc_container.TabPages.IndexOf(page),//this._gridDetail.IndexOf(model), 如果是有左右结构,会跳过1个序号(右侧模块不会存序号),导致报错 DetailTabPage = page, DetailModel = model }; @@ -535,6 +544,9 @@ namespace Lskj.Control Dictionary dataCaches, bool isGridmerge = true) { + + GridDetailModel[] isMeage = _gridDetail.Cast().Where(x => x.DetailName.Equals(model.DetailName)).ToArray(); + // ① 取缓存的已生成控件 object control = PageControlsDic.ContainsKey(model) ? PageControlsDic[model] : null; bool hasControl = control != null; @@ -621,6 +633,33 @@ namespace Lskj.Control } } + /* ───── AddPanel ───────────────────────────────────── */ + if (model.IsSched) + { + DynamicFrmProductSchedModel mainModel = new DynamicFrmProductSchedModel(new string[] + { + model.DetailName, + ERPInfo.Instance.UserId, + ERPInfo.Instance.UserName, + this.Model.Privilege, + model.UnionModule, + "0" + }); + DataRow systemdllTab = MainImpl.GetSystemdllTab(model.UnionModule); + model.SystemModel = new ModuleModel(systemdllTab); + if (this.Model != null) + { + model.SystemModel.ParmaryKey = BaseImpl.GetBasePrimaryKey(this.Model.ModuleCode); + } + FrmProductSched frmProductSched = new FrmProductSched(); + frmProductSched.Dock = DockStyle.Fill; + frmProductSched.Tag = model; + frmProductSched.InitializeControl(mainModel); + frmProductSched.DataModel.TopSearchObj.ButtonObj.Visible = false; + return frmProductSched; + } + + /* ───── 4. AddPanel ───────────────────────────────────── */ if (model.IsAddPanel && isGridmerge) { @@ -776,7 +815,21 @@ namespace Lskj.Control parent.Controls.Add(plBottom); return parent; } - + else if (isMeage.Count() > 1 && isGridmerge) + { + this.DetaiName = model.DetailName; + TabMultipledetails tabMultipledetails = hasControl && control is TabMultipledetails ? (TabMultipledetails)control : new TabMultipledetails(); + tabMultipledetails.Model = this.Model; + tabMultipledetails.ParentGridEx = this.ParentGridEx; + tabMultipledetails.ParentControlEx = this.ParentControlEx; + tabMultipledetails.IsDragDetail = this.IsDragDetail; + tabMultipledetails.Model = this.Model; + tabMultipledetails.DrgaParentPrimaryKey = this.DrgaParentPrimaryKey; + tabMultipledetails.InitTabPages(isMeage); + tabMultipledetails.Dock = DockStyle.Fill; + tabMultipledetails.Tag = model; + return tabMultipledetails; + } /* ───── 7. 普通 ModuleGridEx 明细 ──────────────────────── */ { ModuleGridEx gridEx = hasControl && control is ModuleGridEx @@ -1900,6 +1953,8 @@ namespace Lskj.Control return (tabPage.Tag as FrmMiniBlink).Tag as GridDetailModel; if (tabPage.Tag is TabMultipledetails) return (tabPage.Tag as TabMultipledetails).Tag as GridDetailModel; + if (tabPage.Tag is FrmProductSched) + return (tabPage.Tag as FrmProductSched).Tag as GridDetailModel; return null; } /// diff --git a/插件库/Lskj.Control/TabMultipledetails.cs b/插件库/Lskj.Control/TabMultipledetails.cs index eda792c..7cccf98 100644 --- a/插件库/Lskj.Control/TabMultipledetails.cs +++ b/插件库/Lskj.Control/TabMultipledetails.cs @@ -170,6 +170,14 @@ namespace Lskj.Control dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnDragGridCompleted); } + //左侧表设置后,添加事件。行改变时刷新右侧表 + if (model.IsUnioDetail) + { + gridEx.GridView.FocusedRowObjectChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged); + gridEx.GridView.RowCellClick += new RowCellClickEventHandler(OnRowCellClick); + UnioDetail = true; + } + if (i == 0) { gridEx1.GridControlObj = gridEx; @@ -188,6 +196,7 @@ namespace Lskj.Control } else { + gridEx2.GridControlObj = gridEx;// 加载配置查询条件 if (Model != null && Model.IsDetailSearch) { @@ -761,29 +770,4 @@ namespace Lskj.Control //重新根据主表数据查询 private void SearchObj_OnSearchAfterCallBack(object sender, EventArgs e) { - DataRow rowItem = this.ParentGridEx.GetViewFocusedDataRow(); - int i = 0; - foreach (GridDetailModel model in this._gridDetail) - { - if (model.QueryAgain) - { - if (i == 0) - { - string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; - sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); - gridEx1.SearchObj.SearchGrid(sqlValue, true, false); - } - else if (1 == 1) - { - string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; - sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); - gridEx2.SearchObj.SearchGrid(sqlValue, true, false); - } - } - i++; - } - - } - - } -} + DataRow rowItem = th \ No newline at end of file diff --git a/插件库/Lskj.Control/TreeBandedGridControlEx.cs b/插件库/Lskj.Control/TreeBandedGridControlEx.cs index f0bd60f..0d08d67 100644 --- a/插件库/Lskj.Control/TreeBandedGridControlEx.cs +++ b/插件库/Lskj.Control/TreeBandedGridControlEx.cs @@ -93,6 +93,7 @@ namespace Lskj.Control { this.SetGridRowHeightAndFont(); } + this.gcMain.PopupMenuShowing += new PopupMenuShowingEventHandler(OnPopupMenuShowing); //InitializeTreeMethod(); //this.gcMain.OptionsBehavior.EnableFiltering = true; //this.gcMain.OptionsFind.AlwaysVisible = true; @@ -336,7 +337,7 @@ namespace Lskj.Control { if (table == null) return; this.CustomColumKey = customColumKey; - this.gcMain.PopupMenuShowing += new PopupMenuShowingEventHandler(OnPopupMenuShowing); + //设置列头自动高度 this.gcMain.OptionsView.ColumnHeaderAutoHeight = DefaultBoolean.True; @@ -1302,14 +1303,17 @@ namespace Lskj.Control DXMenuItem itemPrintColumn = new DXMenuItem("打印表格数据", PrintItemClick); DXMenuItem itemSortColumn = new DXMenuItem("清除全部列排序", ClearSortItemClick); + DXMenuItem itemBsChartShowClick = new DXMenuItem("一键所有列属性设置", InstAllColumn); + itemSaveColumn.BeginGroup = itemFixLeft.BeginGroup = true; + itemBsChartShowClick.Visible = ERPInfo.Instance.UserName == "管理员" && Model != null; itemFixLeft.Tag = itemFixLeftAll.Tag = itemUnFix.Tag = hitInfo.Column; - itemSaveColumn.Tag = itemResetColumn.Tag = itemExportColumn.Tag = itemPrintColumn.Tag = itemSortColumn.Tag = hitInfo.Column; + itemSaveColumn.Tag = itemResetColumn.Tag = itemExportColumn.Tag = itemPrintColumn.Tag = itemSortColumn.Tag = itemBsChartShowClick.Tag = hitInfo.Column; columnMenu.Items.AddRange(new DXMenuItem[] { itemFixLeft, itemFixLeftAll, itemUnFix }); if (!string.IsNullOrEmpty(CustomColumKey)) columnMenu.Items.AddRange(new DXMenuItem[] { itemSaveColumn, itemResetColumn }); - columnMenu.Items.AddRange(new DXMenuItem[] { itemExportColumn, itemPrintColumn, itemSortColumn }); + columnMenu.Items.AddRange(new DXMenuItem[] { itemExportColumn, itemPrintColumn, itemSortColumn, itemBsChartShowClick }); } } catch (Exception ex) @@ -1636,6 +1640,58 @@ namespace Lskj.Control } } + + /// + /// 说明:导出表格数据 + /// 创建人:龚宇超 + /// 创建日期:2018-02-01 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected override void ExportItemClick(object sender, EventArgs e) + { + try + { + this.TreeListObj.ToExcelTreeList(this.Model.FormText); + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); + MessageUtil.Show(Message, ex.Message); + } + + } + + /// + /// 说明:清除全部列排序 + /// 创建人:龚宇超 + /// 创建日期:2018-02-01 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected override void ClearSortItemClick(object sender, EventArgs e) + { + try + { + this.TreeListObj.ClearSorting(); + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); + MessageUtil.Show(Message, ex.Message); + } + + } + + /// /// 说明:设置列格式化 /// 创建人:龚宇超 @@ -2004,7 +2060,46 @@ namespace Lskj.Control TreeListNode lastNode = this.TreeListObj.FocusedNode; this.AdapterObj = adapter; DataSet dataSet = new DataSet(); - adapter.Fill(dataSet, "SetGridViewDataSource"); + //adapter.Fill(dataSet, "SetGridViewDataSource"); + // 重连配置 + int maxRetryCount = 2; // 次数 + int retryDelay = 1000; // 等待时间 + for (int i = 0; i < maxRetryCount; i++) + { + try + { + adapter.Fill(dataSet, "SetGridViewDataSource"); + break;//连接成功 + } + catch (SqlException ex) + { + // 判断是否是连接相关错误 + if (IsConnectionError(ex.Number) || + ex.Message.Contains("物理连接不可用") || + ex.Message.Contains("传输级错误")) + { + if (i < maxRetryCount - 1) + { + SqlConnection.ClearAllPools(); + System.Threading.Thread.Sleep(retryDelay); + continue; // 重试 + } + else + { + // 最后一次重试失败,抛出错误 + throw new Exception($"经过 {maxRetryCount} 次重试后仍无法连接到数据库: {ex.Message}", ex); + } + } + else + { + // 其他SQL错误直接抛出 + throw; + } + } + } + + + SqlCommandBuilder cb = new SqlCommandBuilder(this.AdapterObj); GetTreeExpanded(); diff --git a/插件库/Lskj.Control/TreeGridControlEx.cs b/插件库/Lskj.Control/TreeGridControlEx.cs index e526e72..90b0eff 100644 --- a/插件库/Lskj.Control/TreeGridControlEx.cs +++ b/插件库/Lskj.Control/TreeGridControlEx.cs @@ -105,6 +105,8 @@ namespace Lskj.Control this.gcMain.CustomDrawNodeButton += OnCustomDrawNodeButton;//绘制按钮 } } + + this.gcMain.PopupMenuShowing += new PopupMenuShowingEventHandler(OnPopupMenuShowing); //InitializeTreeMethod(); //this.gcMain.OptionsBehavior.EnableFiltering = true; //this.gcMain.OptionsFind.AlwaysVisible = true; @@ -390,8 +392,7 @@ namespace Lskj.Control if (table == null) return; Dictionary dataCaches = Model != null ? Model.DataCaches : null; this.CustomColumKey = customColumKey; - this.gcMain.PopupMenuShowing += new PopupMenuShowingEventHandler(OnPopupMenuShowing); - + for (int i = 0; i < table.Rows.Count; i++) { DataRow item = table.Rows[i]; @@ -1246,14 +1247,17 @@ namespace Lskj.Control DXMenuItem itemPrintColumn = new DXMenuItem("打印表格数据", PrintItemClick); DXMenuItem itemSortColumn = new DXMenuItem("清除全部列排序", ClearSortItemClick); + DXMenuItem itemBsChartShowClick = new DXMenuItem("一键所有列属性设置", InstAllColumn); + itemSaveColumn.BeginGroup = itemFixLeft.BeginGroup = true; + itemBsChartShowClick.Visible = ERPInfo.Instance.UserName == "管理员" && Model != null; itemFixLeft.Tag = itemFixLeftAll.Tag = itemUnFix.Tag = hitInfo.Column; - itemSaveColumn.Tag = itemResetColumn.Tag = itemExportColumn.Tag = itemPrintColumn.Tag = itemSortColumn.Tag = hitInfo.Column; + itemSaveColumn.Tag = itemResetColumn.Tag = itemExportColumn.Tag = itemPrintColumn.Tag = itemSortColumn.Tag= itemBsChartShowClick.Tag = hitInfo.Column; columnMenu.Items.AddRange(new DXMenuItem[] { itemFixLeft, itemFixLeftAll, itemUnFix }); if (!string.IsNullOrEmpty(CustomColumKey)) columnMenu.Items.AddRange(new DXMenuItem[] { itemSaveColumn, itemResetColumn }); - columnMenu.Items.AddRange(new DXMenuItem[] { itemExportColumn, itemPrintColumn, itemSortColumn }); + columnMenu.Items.AddRange(new DXMenuItem[] { itemExportColumn, itemPrintColumn, itemSortColumn,itemBsChartShowClick }); } } catch (Exception ex) @@ -1376,6 +1380,32 @@ namespace Lskj.Control } + /// + /// 说明:清除全部列排序 + /// 创建人:龚宇超 + /// 创建日期:2018-02-01 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected override void ClearSortItemClick(object sender, EventArgs e) + { + try + { + this.TreeListObj.ClearSorting(); + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); + MessageUtil.Show(Message, ex.Message); + } + + } + + /// /// 说明:设置编辑列 /// 创建人:龚宇超 @@ -2236,6 +2266,21 @@ namespace Lskj.Control DataRowView dataRowView = this.gcMain.GetDataRecordByNode(treeNode) as DataRowView; dataRows[i] = dataRowView != null ? dataRowView.Row : null; } + + //设置了复选框这个获取所有选中的节点行 + if (this.gcMain.OptionsView.ShowCheckBoxes == true&& this.gcMain.OptionsSelection.MultiSelect == true && this.gcMain.OptionsSelection.MultiSelectMode == TreeListMultiSelectMode.RowSelect) + { + List TreeListNodeList = this.TreeListObj.GetAllCheckedNodes(); + dataRows = new DataRow[TreeListNodeList.Count]; + for (int i = 0; i < TreeListNodeList.Count; i++) + { + TreeListNode treeNode = TreeListNodeList[i]; + DataRowView dataRowView = this.gcMain.GetDataRecordByNode(treeNode) as DataRowView; + dataRows[i] = dataRowView != null ? dataRowView.Row : null; + } + + } + return dataRows; } /// @@ -2288,7 +2333,44 @@ namespace Lskj.Control if (selectRowHandler) lastNodeIndex = this.TreeListObj.GetVisibleIndexByNode(this.TreeListObj.FocusedNode); this.AdapterObj = adapter; DataSet dataSet = new DataSet(); - adapter.Fill(dataSet, "SetGridViewDataSource"); + //adapter.Fill(dataSet, "SetGridViewDataSource"); + + // 重连配置 + int maxRetryCount = 2; // 次数 + int retryDelay = 1000; // 等待时间 + for (int i = 0; i < maxRetryCount; i++) + { + try + { + adapter.Fill(dataSet, "SetGridViewDataSource"); + break;//连接成功 + } + catch (SqlException ex) + { + // 判断是否是连接相关错误 + if (IsConnectionError(ex.Number) || + ex.Message.Contains("物理连接不可用") || + ex.Message.Contains("传输级错误")) + { + if (i < maxRetryCount - 1) + { + SqlConnection.ClearAllPools(); + System.Threading.Thread.Sleep(retryDelay); + continue; // 重试 + } + else + { + // 最后一次重试失败,抛出错误 + throw new Exception($"经过 {maxRetryCount} 次重试后仍无法连接到数据库: {ex.Message}", ex); + } + } + else + { + // 其他SQL错误直接抛出 + throw; + } + } + } SqlCommandBuilder cb = new SqlCommandBuilder(this.AdapterObj);