using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using Lskj.Control.Model; using Lskj.Model; using Lskj.Business.Impl; using Lskj.Data; using DevExpress.XtraGrid.Columns; using Lskj.Business; using Lskj.Util; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraEditors; namespace Lskj.Control { public partial class TabMultipledetails : UserControl { public TabMultipledetails() { InitializeComponent(); } #region 公共变量 /// /// 是否加载明细刷新 /// /// true if [_ un refresh]; otherwise, false. private bool _UnRefresh { get { return Model is DynamicModuleDetailModel || Model is DynamicModuleModel || Model is DynamicProductionModel; } } /// /// 分割线 /// public DevExpress.XtraEditors.SplitContainerControl SplitMain { get { return this.splitMainControl; } } /// /// 表一 /// public ModuleGridEx gridEx1 = new ModuleGridEx(); /// /// 表二 /// public ModuleGridEx gridEx2 = new ModuleGridEx(); /// /// tab标签 /// private GridDetailModel[] _gridDetail; /// /// The system model /// public DynamicModel Model; /// /// 父表格 /// public GridControlEx ParentGridEx; /// /// 父容器 /// public MyControl ParentControlEx; /// /// 拖拽模式 /// public bool IsDragDetail; /// /// 拖拽执行sql /// public string existDragSql; /// /// 拖拽目标主键字段 /// public string DrgaParentPrimaryKey; /// /// 左侧表刷新右侧表 /// public bool UnioDetail=false; #endregion #region /// /// 初始化完成 /// private bool _isInitFinish; #endregion /// /// 说明:绑定选项卡 /// 创建人:龚宇超 /// 创建日期:2018-01-09 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void InitTabPages(GridDetailModel[] gridDetail) { try { this._isInitFinish = false; this._gridDetail = gridDetail; int i = 0; int MainTable = 0;//主表序号,1和2对应主表为第一个还是第二个 bool ProcessExists = (Lskj.Data.Caches.CacheSYSConfig.Instance().JudgeProcessExists() && SystemInfo.Instance.isExecload); foreach (GridDetailModel model in this._gridDetail) { if (!model.IsAddPanel && !model.IsDetailView && !model.IsWebView && !model.IsWebView2 && !model.IsWebView3) { if (model.IsChart) { ChartControlEx chartEx = new ChartControlEx(); chartEx.Dock = DockStyle.Fill; chartEx.transverseHistogram = model.transverseHistogram; //chartEx.SetCharts(BaseModuleImpl.GetChartParams(model.FormKey)); //chartEx.SetChartRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, OnGridViewRightCallBack); if (ProcessExists) { chartEx.SetCharts(Lskj.Data.Caches.CacheSYSConfig.Instance().GetCustomQueryFields()); chartEx.SetChartRightMenus(Lskj.Data.Caches.CacheSYSConfig.Instance().GetBaseGridRightMenus(), this.Model, null); } else { chartEx.SetCharts(BaseModuleImpl.GetChartParams(model.FormKey)); chartEx.SetChartRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, null); } chartEx.Tag = model; if (i == 0) { splitMainControl.Panel1.Controls.Add(chartEx); splitMainControl.Panel1.Tag = chartEx; } else { splitMainControl.Panel2.Controls.Add(chartEx); splitMainControl.Panel2.Tag = chartEx; } } else if (model.IsReadOnly) { GridControlEx gridEx = model.AutoMultiHeader == 1 ? new BandedGridControlEx() : new GridControlEx(); gridEx.Dock = DockStyle.Fill; gridEx.Tag = model; gridEx.Model = this.Model; gridEx.SetReadOnlyColumns(model.GridColumns, model.GridCustomColumnKey); //gridEx.SetGridRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, OnGridViewRightCallBack); //gridEx.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(model.FormKey)); if (ProcessExists) { gridEx.SetGridRightMenus(Lskj.Data.Caches.CacheSYSConfig.Instance().GetBaseGridRightMenus(), this.Model, null); gridEx.SetGridRowColors(Lskj.Data.Caches.CacheSYSConfig.Instance().GetCustomColumnByDatabase()); } else { gridEx.SetGridRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, null); gridEx.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(model.FormKey)); } if (model.IsCheck == 1)//加载复选框 { GridDragGrid.GridAddCheckBox(gridEx.GridView); } if (IsDragDetail && this.ParentGridEx != null && model.IsDrag) { // 拖拽模式,绑定拖拽对象 GridDragGrid dragGrid = new GridDragGrid(gridEx.GridView, this.ParentGridEx.GridView); 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; // 加载配置查询条件 if (Model != null && Model.IsDetailSearch) { gridEx1.SearchObj.InitSearchControl(BaseModuleImpl.GetCustomQueryFields(model.FormKey), gridEx1.SearchPanel); } splitMainControl.Panel1.Controls.Add(gridEx); splitMainControl.Panel1.Tag = gridEx; if (!string.IsNullOrWhiteSpace(model.DragExecuteSql)) { existDragSql = model.DragExecuteSql; MainTable = 1; } } else { gridEx2.GridControlObj = gridEx;// 加载配置查询条件 if (Model != null && Model.IsDetailSearch) { gridEx2.SearchObj.InitSearchControl(BaseModuleImpl.GetCustomQueryFields(model.FormKey), gridEx2.SearchPanel); } splitMainControl.Panel2.Controls.Add(gridEx); splitMainControl.Panel2.Tag = gridEx; if (!string.IsNullOrWhiteSpace(model.DragExecuteSql)) { existDragSql = model.DragExecuteSql; MainTable = 2; } } } else { DynamicModel dyncModel = new DynamicModuleModel(new string[] { model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, "1", model.UnionModule, "0" }); if (ProcessExists) { model.SystemModel = new ModuleModel(Lskj.Data.Caches.CacheSYSConfig.Instance().GetSystemdllTab()); if (Model != null) model.SystemModel.ParmaryKey = Lskj.Data.Caches.CacheSYSConfig.Instance().GetBasePrimaryKey(); } else { model.SystemModel = new ModuleModel(MainImpl.GetSystemdllTab(model.UnionModule)); if (Model != null) model.SystemModel.ParmaryKey = BaseImpl.GetBasePrimaryKey(Model.ModuleCode); } ModuleGridEx gridEx = new ModuleGridEx(); gridEx.RightGridCallBack += OnGridAfterRightCallBack; if (model.BottomRefreshMain) gridEx.OnSaveGridCallBack += OnRefreshMainTable; gridEx.Name = "gridEx"; gridEx.IsDetail = true; gridEx.Dock = DockStyle.Fill; gridEx.OperShortMode = Model.IsDetailSearch; // 不显示简短模式 gridEx.VisibleSearchPanel = Model.IsDetailSearch; gridEx.VisibleOperPanel = !model.IsReadOnly; gridEx.InitializeControl(model.SystemModel, dyncModel); gridEx.GridControlObj.Tag = model; gridEx.ParentControlEx = this.ParentControlEx; gridEx.ParentGridEx = this.ParentGridEx; gridEx.ParentKeyField = string.IsNullOrEmpty(model.UnionParentField) ? model.SystemModel.ParmaryKey : model.UnionParentField; gridEx.DetailKeyField = model.UnionValue; gridEx.GridControlObj.ParentControl = gridEx.SearchObj; //左侧表设置后,添加事件。行改变时刷新右侧表 if (model.IsUnioDetail) { gridEx.GridControlObj.GridView.FocusedRowObjectChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged); gridEx.GridControlObj.GridView.RowCellClick += new RowCellClickEventHandler(OnRowCellClick); UnioDetail = true; } if (model.IsCheck == 1) { GridDragGrid.GridAddCheckBox(gridEx.GridControlObj.GridView); } if (model.QueryAgain) { gridEx.SearchObj.OnSearchAfterCallBack += SearchObj_OnSearchAfterCallBack; } if (IsDragDetail && this.ParentGridEx != null && model.IsDrag) { // 拖拽模式,绑定拖拽对象 GridDragGrid dragGrid = new GridDragGrid(gridEx.GridControlObj.GridView, this.ParentGridEx.GridView); dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnDragGridCompleted); } if (model.AutoRefresh && !_UnRefresh) gridEx.SearchObj.SearchGrid(); if (i == 0) { gridEx1 = gridEx; splitMainControl.Panel1.Controls.Add(gridEx); splitMainControl.Panel1.Tag = gridEx.GridControlObj; if (!string.IsNullOrWhiteSpace(model.DragExecuteSql)) { existDragSql = model.DragExecuteSql; MainTable = 1; } } else { if (UnioDetail) { gridEx.ParentControlEx = this.gridEx1.SearchObj; gridEx.ParentGridEx = this.gridEx1.GridControlObj; } gridEx2 = gridEx; splitMainControl.Panel2.Controls.Add(gridEx); splitMainControl.Panel2.Tag = gridEx.GridControlObj; if (!string.IsNullOrWhiteSpace(model.DragExecuteSql)) { existDragSql = model.DragExecuteSql; MainTable = 2; } } } } i++; } //判断是否有推拽sql if (MainTable != 0) { if ((splitMainControl.Panel1.Tag is GridControlEx) && (splitMainControl.Panel2.Tag is GridControlEx)) { GridControlEx grdExMain = (splitMainControl.Panel1.Tag as GridControlEx); GridControlEx grdExAdditional = (splitMainControl.Panel2.Tag as GridControlEx); if (MainTable == 1) { // 拖拽模式,绑定拖拽对象 GridDragGrid dragGrid = new GridDragGrid(grdExMain.GridView, grdExAdditional.GridView); dragGrid.OnDragComplete += DragGrid_OnDragComplete; } else if (MainTable == 2) { // 拖拽模式,绑定拖拽对象 GridDragGrid dragGrid = new GridDragGrid(grdExAdditional.GridView, grdExMain.GridView); dragGrid.OnDragComplete += DragGrid_OnDragComplete; } } } } catch (Exception) { throw; } finally { _isInitFinish = true; InitializeSplitterPosition(); } } //两个表间推拽时执行存储过程 private void DragGrid_OnDragComplete(object sender, GridDragGridArgs e) { try { foreach (DataRow item in e.GridViewSelectRows) { string sql = ReplaceHelper.ReplaceRowParam(item, existDragSql); BaseImpl.ExecSqlValue(sql); } } catch (Exception ex) { } finally { if (this.ParentControlEx != null) this.ParentControlEx.SearchGrid(); //gridEx1.SearchObj.SearchLastGrid(); //gridEx2.SearchObj.SearchLastGrid(); 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); } } else { if (i == 0) { gridEx1.SearchObj.SearchGrid(); } else if (1 == 1) { gridEx2.SearchObj.SearchGrid(); } } i++; } } } #region 行点击改变事件 /// /// 说明:数据行发生改变加载明细 /// 创建人:龚宇超 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewFocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { try { WaitForm.ShowForm(); GridControlEx mainGridObj = splitMainControl.Panel1.Tag as GridControlEx; DataRow rowItem = mainGridObj.GetViewFocusedDataRow(); if (rowItem != null) { if (splitMainControl.Panel2.Tag is GridControlEx) { GridControlEx DetailGridObj = splitMainControl.Panel2.Tag as GridControlEx; GridDetailModel gridMainModel = mainGridObj.Tag as GridDetailModel; GridDetailModel gridDetailModel = DetailGridObj.Tag as GridDetailModel; string primaryKey = BaseImpl.GetBasePrimaryKey(gridMainModel.UnionModule); string searchSql = this.GetSearchSql(gridDetailModel, rowItem, primaryKey); DetailGridObj.LastSearchSql = searchSql; DetailGridObj.SetGridViewDataSource(MainImpl.GetDataTableResult(searchSql)); } else if (splitMainControl.Panel2.Tag is ChartControlEx) { ChartControlEx DetailGridObj = splitMainControl.Panel2.Tag as ChartControlEx; GridDetailModel gridMainModel = mainGridObj.Tag as GridDetailModel; GridDetailModel gridDetailModel = DetailGridObj.Tag as GridDetailModel; string primaryKey = BaseImpl.GetBasePrimaryKey(gridMainModel.UnionModule); string searchSql = this.GetSearchSql(gridDetailModel, rowItem, primaryKey); DetailGridObj.CreateChart(MainImpl.GetDataTableResult(searchSql)); } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } /// /// 说明:获取查询条件 /// 创建人:龚宇超 /// 创建日期:2017-11-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The row item. /// System.String. protected string GetSearchSql(GridDetailModel model, DataRow rowItem, string ParmaryKey = "") { string fieldName = !string.IsNullOrEmpty(model.UnionParentField) && rowItem.Table.Columns.Contains(model.UnionParentField) ? model.UnionParentField : ParmaryKey; string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); if (ReplaceHelper.IsSelect(sqlValue) && !string.IsNullOrEmpty(model.UnionValue)) { sqlValue = ReplaceHelper.ReplaceWhereCond(sqlValue) + string.Format(" and {0}='{1}'", model.UnionValue, rowItem[fieldName] + ""); } if (!string.IsNullOrEmpty(model.UnionCond)) { string UnionCond = ReplaceHelper.ReplaceRowParam(rowItem, model.UnionCond); sqlValue += UnionCond; } return sqlValue; } /// /// 说明:多明细框下左边刷新右边的明细 /// 创建人:王一帆 /// 创建日期:2022-12-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnRowCellClick(object sender, RowCellClickEventArgs e) { try { WaitForm.ShowForm(); GridControlEx mainGridObj = splitMainControl.Panel1.Tag as GridControlEx; DataRow rowItem = mainGridObj.GetViewFocusedDataRow(); if (rowItem != null) { if (splitMainControl.Panel2.Tag is GridControlEx) { GridControlEx DetailGridObj = splitMainControl.Panel2.Tag as GridControlEx; GridDetailModel gridMainModel = mainGridObj.Tag as GridDetailModel; GridDetailModel gridDetailModel = DetailGridObj.Tag as GridDetailModel; string primaryKey = BaseImpl.GetBasePrimaryKey(gridMainModel.UnionModule); string searchSql = this.GetSearchSql(gridDetailModel, rowItem, primaryKey); DetailGridObj.LastSearchSql = searchSql; DetailGridObj.SetGridViewDataSource(MainImpl.GetDataTableResult(searchSql)); } else if (splitMainControl.Panel2.Tag is ChartControlEx) { ChartControlEx DetailGridObj = splitMainControl.Panel2.Tag as ChartControlEx; GridDetailModel gridMainModel = mainGridObj.Tag as GridDetailModel; GridDetailModel gridDetailModel = DetailGridObj.Tag as GridDetailModel; string primaryKey = BaseImpl.GetBasePrimaryKey(gridMainModel.UnionModule); string searchSql = this.GetSearchSql(gridDetailModel, rowItem, primaryKey); DetailGridObj.CreateChart(MainImpl.GetDataTableResult(searchSql)); } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } #endregion /// /// 说明:表格拖拽完成 /// 创建人:龚宇超 /// 创建日期:2017-11-14 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The e. protected void OnDragGridCompleted(object sender, GridDragGridArgs e) { if (e.GridViewSelectRows == null || e.GridViewSelectRows.Length == 0 || this.ParentGridEx == null) return; try { if (MessageUtil.Show(ResourceKeys.DragSelectRow, MessageBoxButtons.YesNo) == DialogResult.Yes) { GridColumnCollection gridColumns = this.ParentGridEx.GridView.Columns; DataTable table = this.ParentGridEx.gridControl.DataSource as DataTable; foreach (DataRow rowItem in e.GridViewSelectRows) { DataRow newRow = table.NewRow(); foreach (GridColumn col in gridColumns) { if ("id".Equals(col.FieldName) || col.FieldName.Equals(this.DrgaParentPrimaryKey)) continue; if (rowItem.Table.Columns.Contains(col.FieldName)) { // 列中是否包含对应字段,包含则使用值 newRow[col.FieldName] = rowItem[col.FieldName]; } else { // 未包含字段,则使用控件默认值. GridColumnModel model = col.Tag as GridColumnModel; string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); if (!string.IsNullOrEmpty(model.DefaultValue)) { newRow[col.FieldName] = fieldValue; } } } table.Rows.Add(newRow); } this.ParentGridEx.GridView.ClearSelection(); this.ParentGridEx.GridView.SelectRowHandler(table.Rows.Count - 1); this.ParentGridEx.GridView.UpdateCurrentRow(); this.ParentGridEx.GridView.ShowEditor(); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); LogHelper.Instance.WriteError(ex); //MessageUtil.Show(ResourceKeys.OperFault); } } /// /// 说明:初始化分割条位置 /// 创建人:龚宇超 /// 创建日期:2017-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitializeSplitterPosition() { try { string splitterPosition = IniHelper.Read(string.Format("base_TabMultipledetailsMain_{0}", this.Model.ModuleCode)); if (!string.IsNullOrEmpty(splitterPosition)) { this.splitMainControl.SplitterPosition = Convert.ToInt32(splitterPosition); } else { this.splitMainControl.SplitterPosition = Screen.PrimaryScreen.WorkingArea.Width / 2; } } catch (Exception e) { LogHelper.Instance.WriteError(e); } } /// /// 说明:并行分割条位置变化事件 /// 创建人:王一帆 /// 创建日期:2020-08-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// void OnSplitterPositionChanged(object sender, EventArgs e) { try { if (_isInitFinish) { IniHelper.Write(string.Format("base_TabMultipledetailsMain_{0}", this.Model.ModuleCode), this.splitMainControl.SplitterPosition + ""); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 下方表格执行右键后刷新 /// /// /// private void OnGridAfterRightCallBack(object sender, EventArgs e) { if (splitMainControl.Panel1.Tag != null && splitMainControl.Panel1.Tag is GridControlEx) { GridControlEx grdExMain = (splitMainControl.Panel1.Tag as GridControlEx); GridDetailModel MainModel = grdExMain.Tag as GridDetailModel; if (MainModel.BottomRefreshMain) { //刷新主表,主表刷新后会默认刷新下方左右表 int oldRowHandle = gridEx1.GridControlObj.GridView.FocusedRowHandle;//上一次选中行 this.ParentControlEx.SearchLastGrid(); if (gridEx1.SearchObj.RememberRow) { gridEx1.GridControlObj.GridView.SelectRowHandler(oldRowHandle); } } else if (MainModel.BottomDetailsRefresh) { gridEx1.SearchObj.SearchLastGrid(); } } if (splitMainControl.Panel2.Tag != null && splitMainControl.Panel2.Tag is GridControlEx) { GridControlEx grdExAdditional = (splitMainControl.Panel2.Tag as GridControlEx); GridDetailModel AdditionalModel = grdExAdditional.Tag as GridDetailModel; if (AdditionalModel.BottomRefreshMain) { //刷新主表,主表刷新后会默认刷新下方左右表 int oldRowHandle = gridEx2.GridControlObj.GridView.FocusedRowHandle;//上一次选中行 this.ParentControlEx.SearchLastGrid(); if (gridEx2.SearchObj.RememberRow) { gridEx2.GridControlObj.GridView.SelectRowHandler(oldRowHandle); } } else if (AdditionalModel.BottomDetailsRefresh) { gridEx2.SearchObj.SearchLastGrid(); } } } /// /// 下方表格保存或者执行右键后刷新 /// /// /// private void OnRefreshMainTable(object sender, EventArgs e) { try { //刷新主表,主表刷新后会默认刷新下方左右表 int oldRowHandle = gridEx1.GridControlObj.GridView.FocusedRowHandle;//上一次选中行 int oldRowHandle2 = gridEx2.GridControlObj.GridView.FocusedRowHandle;//上一次选中行 this.ParentControlEx.SearchLastGrid(); if (gridEx1.SearchObj.RememberRow) { gridEx1.GridControlObj.GridView.SelectRowHandler(oldRowHandle); } if (gridEx2.SearchObj.RememberRow) { gridEx2.GridControlObj.GridView.SelectRowHandler(oldRowHandle2); } } catch (Exception ex) { } } //设置条件值 public void SetConditionValues(DataRow dr) { try { if (this.gridEx1.SearchObj != null) { foreach (ControlModel item in this.gridEx1.SearchObj.ControlModels) { if (dr.Table.Columns.Contains(item.FieldName)) { this.gridEx1.SearchObj.SetControlValue(item, dr[item.FieldName] + ""); } } } if (this.gridEx2.SearchObj != null) { foreach (ControlModel item in this.gridEx2.SearchObj.ControlModels) { if (dr.Table.Columns.Contains(item.FieldName)) { this.gridEx2.SearchObj.SetControlValue(item, dr[item.FieldName] + ""); } } } } catch (Exception ex) { } } //重新根据主表数据查询 private void SearchObj_OnSearchAfterCallBack(object sender, EventArgs e) { DataRow rowItem = th