/****************************** * 说明:顶部为表格、底部为多标签内容模版(适用于基础档案上下模版、报表上下模版、单据审批模版) * 创建人:龚宇超 * 创建日期:2017-11-21 * 修改人: * 修改日期: * 修改备注: * 版本:1.0.0.0 ******************************/ 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 DevExpress.XtraTab; using Lskj.Model; using Lskj.Data; using Lskj.Control.Model; using DevExpress.XtraEditors; using Lskj.Business.Impl; using Lskj.Util; using DevExpress.XtraGrid.Views.Grid; using Lskj.Business; using DevExpress.Utils; using System.Diagnostics; using Lskj.Core; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Collections; using DevExpress.XtraGrid.Columns; namespace Lskj.Control { /// /// 顶部为表格、底部为多标签内容模版 /// public partial class ModuleGridDetailEx : UserControl { private bool mModuleResourcesReleased; private bool mDetailPageCachesPrepared; /// /// 系统模块实体对象 /// /// The system model. public ModuleModel SysModel { get; private set; } /// /// 调用动态链接库默认传递参数对象 /// public DynamicModel Model { get; private set; } /// /// Gets or sets a value indicating whether [visible detail panel]. /// /// true if [visible detail panel]; otherwise, false. public bool VisibleDetailPanel { get { return this.scc_container.PanelVisibility == SplitPanelVisibility.Both; } set { this.scc_container.PanelVisibility = value ? SplitPanelVisibility.Both : SplitPanelVisibility.Panel1; } } /// /// 是否为拖拽明细模式 /// public bool IsDragDetail; /// /// 底部多标签表格数据 /// public List GridDetailList; /// /// 主表明细字典集合 /// public Dictionary> datamodel = new Dictionary>(); /// /// 左边查询条件 /// public MyControl _leftGridSearchObj; /// /// 查询条件 /// /// The search object. public MyControl SearchObj { get { return this.mg_control.SearchObj; } } /// /// 顶部表格控件 /// public ModuleGridEx ModuleGridObj { get { return this.mg_control; } } /// /// 底部多标签控件 /// public XtraTabControl TabObj { get { return this.tcButtom.TabControlObj; } } /// /// 多标签,标签内容包含表格和图表 /// public TabControlEx TcButtom { get { return this.tcButtom; } } /// /// 底部容器 /// /// The container object. public PanelControl BottomPanel { get { return this.pl_bottom; } } /// /// 是否只刷新当前选中明细 /// /// The container object. public bool RefreshDetail = false; /// /// 右键执行后是否刷新全部明细 /// /// The container object. public bool callRefreshDetail = false; /// /// 是否已经执行行改变事件并刷新明细数据 /// public bool isFocusedRowChanged = true; /// /// 高效验证后,取消切换选中行 /// public bool CancelSwitchingRow = false; /// /// 上一次选中行 /// public int LastFocusedRowHandle; /// /// 主表格行点击事件回调 /// public event EventHandler OnGridViewRowClickCallBack; /// /// 是否为主表汇总模式 /// public bool IsDynamicDetailType = false; /// /// 数量后缀 /// public string QuantitySuffix = Business.Impl.LanguageTranslation.Translatable ? Business.Impl.LanguageTranslation.GetTranslatedText("条") + ")" : "条)"; public ModuleGridDetailEx() { InitializeComponent(); } internal void ReleaseResourcesForDispose() { if (mModuleResourcesReleased) { return; } mModuleResourcesReleased = true; MyControl searchObj = SearchObj; if (searchObj != null) { searchObj.OnSearchAfterCallBack -= SearchObj_ClearDetails_DoubleMode; searchObj.OnLastQueryTriggered -= SearchObj_ClearDetails_DoubleMode; searchObj.OnSearchAfterCallBack -= SearchObj_ClearDetails; searchObj.OnLastQueryTriggered -= SearchObj_ClearDetails; } if (ModuleGridObj != null) { ModuleGridObj.AfterRefreshingCallBack -= ModuleGridObj_AfterRefreshingCallBack; try { GridControlEx grid = ModuleGridObj.GridControlObj; if (grid != null && grid.GridView != null) { grid.GridView.DoubleClick -= GridView_DoubleClick; grid.GridView.DoubleClick -= OnGridViewDoubleClick; grid.GridView.Click -= OnGridViewDoubleClick; grid.GridView.MouseDown -= GridView_MouseDown; grid.GridView.FocusedRowObjectChanged -= OnGridViewFocusedRowObjectChanged; } } catch { // A partially disposed DevExpress view must not stop cleanup. } ModuleGridObj.ReleaseResourcesForDispose(); } try { if (Model != null && Model.DataCaches != null) { Model.DataCaches.Remove(this); } } catch { // Cache cleanup must not interrupt control disposal. } OnGridViewRowClickCallBack = null; if (GridDetailList != null) { GridDetailList.Clear(); } datamodel.Clear(); _leftGridSearchObj = null; Model = null; SysModel = null; } /// /// 说明:初始化控件 /// 创建人:龚宇超 /// 创建日期:2017-11-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The menu row. public void InitializeControl(ModuleModel sysModel, DynamicModel dyncModel) { try { if (sysModel != null && dyncModel != null) { this.SysModel = sysModel;//系统模块实体对象 this.Model = dyncModel;//调用动态链接库默认传递参数对象 Console.WriteLine(DateTime.Now); Dictionary dataCaches = Model != null ? Model.DataCaches : null; dataCaches.GetValue(this, "DataCaches", out bool _);//等待缓存数据加载完成 if (SysModel.isLeftRightMode) this.scc_container.Horizontal = true; // 初始化顶部GridView this.ModuleGridObj._leftGridSearchObj = _leftGridSearchObj;// 顶部表格控件 this.ModuleGridObj.TabObj = TabObj; this.ModuleGridObj.InitializeControl(sysModel, dyncModel); this.ModuleGridObj.AfterRefreshingCallBack += ModuleGridObj_AfterRefreshingCallBack; //this.ModuleGridObj.verifyDetailsTab += ModuleGridObj_verifyDetailsTab;//未启用 RefreshDetail = this.SysModel.RefreshDetail == "0"; callRefreshDetail = this.SysModel.callRefreshDetail; Console.WriteLine(DateTime.Now); this.IsDynamicDetailType = !string.IsNullOrEmpty(SysModel.MainModuleCodeField) && this.ModuleGridObj.GridControlObj.GridView.Columns.ColumnByFieldName(SysModel.MainModuleCodeField) != null; if (IsDynamicDetailType) { InitializeDynamicPages(); } else { PrepareDetailPageCaches(dataCaches); // 初始化底部多标签 this.InitializePages(); } Console.WriteLine(DateTime.Now); //tcButtom.TabControlObj.ShowTabHeader = tcButtom.TabControlObj.TabPages.Count == 1 ? DefaultBoolean.False : DefaultBoolean.Default; } else { MessageUtil.Show(ResourceKeys.MenuCodeIsNotNull); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); //throw; } } /// /// 获取数据源缓存 /// /// /// /// public void GetDataCaches(Dictionary cachesDic) { //获取通用数据 Task sysModelTask = cachesDic.GetTask(this, "SysModel"); Task dynamicModelTask = cachesDic.GetTask(this, "DynamicModel"); ModuleGridObj._leftGridSearchObj = _leftGridSearchObj; Task getDataCachesTask = cachesDic.AddTask(this, "DataCaches", new Task(() => { ModuleModel sysModel = sysModelTask.Result; DynamicModel dynamicModel = dynamicModelTask.Result; if (sysModel != null && dynamicModel != null) { cachesDic.AddTask(ModuleGridObj, "DynamicModel", dynamicModelTask); cachesDic.AddTask(ModuleGridObj, "SysModel", sysModelTask); this.ModuleGridObj.GetDataCaches(cachesDic); // 下方模块都使用当前主表的主键,共享主表已经创建的查询任务,避免每个明细重复查询。 Task parentPrimaryKeyTask = cachesDic.GetTask(ModuleGridObj, "BasePrimaryKey"); if (parentPrimaryKeyTask != null) { cachesDic.AddTask(tcButtom, "ParentPrimaryKey", parentPrimaryKeyTask); } } return true; })); } private void PrepareDetailPageCaches( Dictionary cachesDic) { if (mDetailPageCachesPrepared || cachesDic == null) { return; } Task dynamicModelTask = cachesDic.GetTask(this, "DynamicModel"); Task> detailsTask = cachesDic.GetTask>(this, "Details"); // 未启用预加载缓存时,InitializePages 会按原有同步方式创建明细页签。 if (dynamicModelTask == null || detailsTask == null) { return; } mDetailPageCachesPrepared = true; cachesDic.AddTask(tcButtom, "DynamicModel", dynamicModelTask); cachesDic.AddTask(tcButtom, "Details", detailsTask); this.tcButtom.GetDataCaches(cachesDic); } /// /// 说明:初始化底部多标签数据 /// 创建人:龚宇超 /// 创建日期:2017-11-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void InitializePages() { if (this.GridDetailList == null || this.GridDetailList.Count == 0) { this.scc_container.PanelVisibility = SplitPanelVisibility.Panel1; } else { this.InitlizeSpiltLocation(); this.InitilizeGridViewEvent(); //下方明细中ModuleGridEx执行右键后是否刷新明细 if (this.SysModel.RefreshDetails) { tcButtom.OnDetailRightCallback += OnGridViewRightCallBack; } this.tcButtom.Model = this.Model; this.tcButtom.DrgaParentPrimaryKey = this.SysModel.ParmaryKey; this.tcButtom.IsDragDetail = this.IsDragDetail; this.tcButtom.ParentControlEx = this.SearchObj; this.tcButtom.ParentGridEx = this.ModuleGridObj.GridControlObj; this.tcButtom.InitTabPages(this.GridDetailList); this.tcButtom.OnRightCallback += new EventHandler(OnGridViewRightCallBack); //明细只有一个选项卡时是否隐藏 if (SystemInfo.Instance.HidingIndividualDetails) { this.TabObj.ShowTabHeader = this.TabObj.TabPages.Count == 1 ? DefaultBoolean.False : DefaultBoolean.Default; } } } /// /// 动态明细模式下,初始化底部多标签数据 /// protected void InitializeDynamicPages() { this.InitlizeSpiltLocation(); this.InitilizeGridViewEvent(); //下方明细中ModuleGridEx执行右键后是否刷新明细 if (this.SysModel.RefreshDetails) { tcButtom.OnDetailRightCallback += OnGridViewRightCallBack; } this.tcButtom.Model = this.Model; this.tcButtom.DrgaParentPrimaryKey = this.SysModel.ParmaryKey; this.tcButtom.IsDragDetail = this.IsDragDetail; this.tcButtom.ParentGridEx = this.ModuleGridObj.GridControlObj; //this.tcButtom.InitTabPages(this.GridDetailList); this.tcButtom.OnRightCallback += new EventHandler(OnGridViewRightCallBack); //明细只有一个选项卡时是否隐藏 if (SystemInfo.Instance.HidingIndividualDetails) { this.TabObj.ShowTabHeader = this.TabObj.TabPages.Count == 1 ? DefaultBoolean.False : DefaultBoolean.Default; } } /// /// 说明:设置分割条位置 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void InitlizeSpiltLocation() { try { string htight = IniHelper.Read(string.Format("base_height_{0}", this.Model.ModuleCode)); if (!string.IsNullOrEmpty(htight)) { //if (this.InvokeRequired) //{ // this.BeginInvoke(new Action(() => // { // this.scc_container.SplitterPosition = Convert.ToInt32(htight); // })); //} //else //{ // this.scc_container.SplitterPosition = Convert.ToInt32(htight); //} this.scc_container.SplitterPosition = Convert.ToInt32(htight); } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:绑定事件 /// 创建人:龚宇超 /// 创建日期:2017-11-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void InitilizeGridViewEvent() { if (this.IsDragDetail) { // 拖拽模式 } else { //树结构默认为节点改变事件 if (this.ModuleGridObj.GridControlObj is TreeGridControlEx) { (this.ModuleGridObj.GridControlObj as TreeGridControlEx).TreeListObj.FocusedNodeChanged += OnFocusedNodeChanged; } if (this.ModuleGridObj.GridControlObj is TreeBandedGridControlEx) { (this.ModuleGridObj.GridControlObj as TreeBandedGridControlEx).TreeListObj.FocusedNodeChanged += OnFocusedNodeChanged; } if (this.ModuleGridObj.GridControlObj.CustomGroupBandEx != null) { this.ModuleGridObj.GridControlObj.CustomGroupBandEx.GridView.DoubleClick += new EventHandler(OnGridViewDoubleClick); } if (this.ModuleGridObj.GridControlObj.CustomGroupTreeBandEx != null) { this.ModuleGridObj.GridControlObj.CustomGroupTreeBandEx.TreeListObj.FocusedNodeChanged += OnFocusedNodeChanged; } // 非拖拽模式 if (Model.IsBaseModule) { if (this.SysModel.DoubleClickDetail) { //双击刷新的话,和行改变事件冲突。 this.ModuleGridObj.GridControlObj.GridView.DoubleClick += new EventHandler(GridView_DoubleClick); this.SearchObj.OnSearchAfterCallBack += SearchObj_ClearDetails_DoubleMode; this.SearchObj.OnLastQueryTriggered += SearchObj_ClearDetails_DoubleMode; } else { if (this.SysModel.bandRowClickEvent == 1) { //this.ModuleGridObj.GridControlObj.GridView.RowCellClick += new RowCellClickEventHandler(GridView_RowCellClick); this.ModuleGridObj.GridControlObj.GridView.MouseDown += new MouseEventHandler(GridView_MouseDown); } else { this.ModuleGridObj.GridControlObj.GridView.FocusedRowObjectChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged); //this.ModuleGridObj.GridControlObj.GridView.RowCellClick += new RowCellClickEventHandler(GridView_RowCellClick); this.ModuleGridObj.GridControlObj.GridView.MouseDown += new MouseEventHandler(GridView_MouseDown); this.SearchObj.OnSearchAfterCallBack += SearchObj_ClearDetails; this.SearchObj.OnLastQueryTriggered += SearchObj_ClearDetails; //this.ModuleGridObj.GridControlObj.GridView.FocusedRowChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventHandler(OnGridViewFocusedRowChanged); } } } else { if (SystemInfo.Instance.ReportMainTabClickRefresh) { if (this.SysModel.DoubleClickDetail) { //全局变量和模块属性冲突的话,以模块设置的为准 this.ModuleGridObj.GridControlObj.GridView.DoubleClick += new EventHandler(OnGridViewDoubleClick); } else { this.ModuleGridObj.GridControlObj.GridView.Click += new EventHandler(OnGridViewDoubleClick); } } else { this.ModuleGridObj.GridControlObj.GridView.DoubleClick += new EventHandler(OnGridViewDoubleClick); } } } } /// /// 说明:获取底部多标签数据 /// 创建人:龚宇超 /// 创建日期:2017-12-19 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void SetDetailGridDataSource(XtraTabPage tabPage = null) { if (tabPage != null) { this.SetTabPageDataSource(tabPage); } else { DataRow rowItem = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow(); if (this.ModuleGridObj.GridControlObj.CustomGroupSelectedRow != null) { rowItem = this.ModuleGridObj.GridControlObj.CustomGroupSelectedRow; } if (RefreshDetail) { XtraTabPage RefreshPage = this.TabObj.SelectedTabPage; if (rowItem != null && RefreshPage != null) { this.SetTabPageDataSource(RefreshPage); } else { SetTabPageDataSource(RefreshPage, true); } } else { foreach (XtraTabPage page in this.TabObj.TabPages) { if (rowItem != null && page != null) { this.SetTabPageDataSource(page); } else { SetTabPageDataSource(page, true); } } } } if (this.OnGridViewRowClickCallBack != null) this.OnGridViewRowClickCallBack(this.ModuleGridObj.GridControlObj, null); } /// /// 动态明细模式下,获取底部多标签数据 /// /// public void DynamicSetDetailGridDataSource(XtraTabPage tabPage = null) { if (tabPage != null) { this.SetTabPageDataSource(tabPage); } else { this.TabObj.TabPages.Clear(); DataRow rowItem = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow(); if (rowItem == null) return; string mainModuleCode = (rowItem[SysModel.MainModuleCodeField] + "").ToLower(); //mainModuleCode = String.Empty; //if (string.IsNullOrWhiteSpace(mainModuleCode)) return; if (!string.IsNullOrWhiteSpace(mainModuleCode) && this.tcButtom.DetailTabPagesDic.ContainsKey(mainModuleCode)) { List details = new List(); details = this.tcButtom.DetailTabPagesDic[mainModuleCode].OrderBy(n => n.TabPageIndex).ToList(); foreach (DetailTabPageModel item in details) { this.TabObj.TabPages.Add(item.DetailTabPage); } } else { List gridDetailModels = new List(); DataTable detailTab = BaseModuleImpl.GetBaseDetailPages(mainModuleCode); foreach (DataRow item in detailTab.Rows) { DataTable gridColumns = ReportImpl.GetReportDetailColumns(mainModuleCode, item["id"] + ""); gridDetailModels.Add(new GridDetailModel(item, gridColumns, GridCustomColumnStruct.BaseDetailGridView)); } this.tcButtom.InitTabPages(gridDetailModels); } bool isLoadAttach = rowItem.Table.Columns.Contains("P_PlmIsBX") && "1" == rowItem["P_PlmIsBX"] + ""; if (!string.IsNullOrWhiteSpace(this.SysModel.AttachDetail) && isLoadAttach) { List attachDetailModels = new List(); DataTable AttachdelTab = BaseModuleImpl.GetBaseDetailPages(this.SysModel.AttachDetail); foreach (DataRow item in AttachdelTab.Rows) { DataTable gridColumns = ReportImpl.GetReportDetailColumns(mainModuleCode, item["id"] + ""); attachDetailModels.Add(new GridDetailModel(item, gridColumns, GridCustomColumnStruct.BaseDetailGridView)); } this.tcButtom.InitTabPages(attachDetailModels, true, true); } if (RefreshDetail) { XtraTabPage RefreshPage = this.TabObj.SelectedTabPage; if (rowItem != null && RefreshPage != null) { this.SetTabPageDataSource(RefreshPage); } else { SetTabPageDataSource(RefreshPage, true); } } else { foreach (XtraTabPage page in this.TabObj.TabPages) { if (rowItem != null && page != null) { this.SetTabPageDataSource(page); } else { SetTabPageDataSource(page, true); } } } } if (this.OnGridViewRowClickCallBack != null) this.OnGridViewRowClickCallBack(this.ModuleGridObj.GridControlObj, null); if (this.TabObj == null || this.TabObj.TabPages.Count == 0) { this.scc_container.PanelVisibility = SplitPanelVisibility.Panel1; } else if (this.TabObj != null && this.TabObj.TabPages.Count > 0 && this.ModuleGridObj.GridControlObj.DataRowCount() > 0) { this.scc_container.PanelVisibility = SplitPanelVisibility.Both; } } /// /// 说明:拖拽模式获取底部多标签数据 /// 创建人:龚宇超 /// 创建日期:2017-12-19 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void SetDetailGridDataSource(string where, bool isTree, TreeViewEx treeViewEx, GridControlEx gridControlEx) { foreach (XtraTabPage tabPage in this.TabObj.TabPages) { GridDetailModel model = this.tcButtom.GetGridDetailModel(tabPage); string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; if (isTree) { // 左侧为树,查询数据则追加条件 if (tabPage.Tag is GridControlEx) { sqlValue = ReplaceHelper.IsProcedure(sqlValue) ? ReplaceHelper.ReplaceTreeViewParentKeyCond(sqlValue, treeViewEx.GetSelectNodeValue()) : sqlValue + where; (tabPage.Tag as GridControlEx).LastSearchSql = sqlValue; } this.tcButtom.SetGridDataSource(tabPage, MainImpl.GetDataTableResult(sqlValue)); } else { if (gridControlEx is TreeGridControlEx) return; // 左侧为表格,查询数据则替换选中行数据 DataRow rowItem = gridControlEx.GridView.GetFocusedDataRow(); string searchSql = this.GetSearchSql(model, rowItem, true); if (tabPage.Tag is GridControlEx) { (tabPage.Tag as GridControlEx).LastSearchSql = searchSql; } this.tcButtom.SetGridDataSource(tabPage, MainImpl.GetDataTableResult(searchSql)); } } } /// /// 说明:设置表格数据 /// 创建人:龚宇超 /// 创建日期:2018-01-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The tab page. /// The grid control. protected void SetTabPageDataSource(XtraTabPage tabPage, bool isNull = false) { GridDetailModel model = this.tcButtom.GetGridDetailModel(tabPage); if (isNull) { DataRow leftrow = _leftGridSearchObj != null ? _leftGridSearchObj.MainGridEx.GetViewFocusedDataRow() : null; if (model != null && model.IsUnionleft && leftrow != null)//为空状态下若明细关联左侧则去替换数据源 { string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; if (ReplaceHelper.IsSelect(sqlValue) && !string.IsNullOrEmpty(model.UnionValue)) { string Conditions = string.Empty; //是左侧选中行,并且没有替换字段,则使用主表选中行 sqlValue = ReplaceHelper.ReplaceWhereCond(sqlValue) + string.Format(" and {0}='{1}'", model.UnionValue, Conditions); } if (!string.IsNullOrEmpty(model.UnionCond)) { string UnionCond = ReplaceHelper.ReplaceRowParam(leftrow, model.UnionCond); sqlValue += UnionCond; } sqlValue = ReplaceHelper.ReplaceRowParam(leftrow, sqlValue); this.tcButtom.SetGridDataSource(tabPage, MainImpl.GetDataTableResult(sqlValue)); return; } this.tcButtom.SetGridDataSource(tabPage, new DataTable()); return; } DataRow rowItem = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow(); if (this.ModuleGridObj.GridControlObj.CustomGroupSelectedRow != null) { rowItem = this.ModuleGridObj.GridControlObj.CustomGroupSelectedRow; } if (!string.IsNullOrEmpty(SysModel.PageVisbleCond)) { string condSql = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(SysModel.PageVisbleCond)); // 形如 "1,2,3" 的返回值 string numberList = MainImpl.GetResult(condSql) + ""; // ---------- 判断当前 orderid 是否在列表中 ---------- string orderIdStr = model.Orderid.ToString(); // 统一转成字符串 string[] idArr = numberList.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (!string.IsNullOrEmpty(numberList) && !idArr.Contains(orderIdStr)) { tabPage.PageVisible = false; return; // 不包含当前 orderid,直接退出 } else { tabPage.PageVisible = true; } } if (model!=null&& !string.IsNullOrWhiteSpace(model.VisibleCond)) { tabPage.PageVisible = !ValidateCond(model.VisibleCond, rowItem); if (!tabPage.PageVisible) return; } if (IsDynamicDetailType) { //string mainModuleCode = model.ParentModuleCode; //ModuleModel mainModuleModel = new ModuleModel(MainImpl.GetSystemdllTab(model.ParentModuleCode)); //mainModuleModel.ParmaryKey = BaseImpl.GetBasePrimaryKey(model.ParentModuleCode); //string sqlValue = mainModuleModel.MenuSql; //sqlValue = ReplaceHelper.ReplaceUserInfo(sqlValue); //sqlValue = ReplaceHelper.ReplaceWhereCond(sqlValue); //string selectMainRowSql = string.Format(sqlValue + " and {0}='{1}'", mainModuleModel.ParmaryKey, rowItem[model.SystemModel.ParmaryKey] + ""); //rowItem = MainImpl.GetDataRowResult(selectMainRowSql); } Object moduleObject = tabPage.Controls.Cast().FirstOrDefault(); ModuleGridEx moduleGridEx = null; if (moduleObject is ModuleGridEx) { moduleGridEx = moduleObject as ModuleGridEx; if (this.SysModel.RefreshTheInterface)// { moduleGridEx.OnSaveGridCallBack -= OnSaveGridCallBack; moduleGridEx.OnSaveGridCallBack += OnSaveGridCallBack; } } if (rowItem != null && model != null) { if (!string.IsNullOrEmpty(model.UnionModule) && (string.IsNullOrEmpty(model.UnionValue) && string.IsNullOrEmpty(model.UnionCond))&& !model.IgnoreAssociatedFields) 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 + QuantitySuffix; tabPage.Appearance.Header.ForeColor = firstTable.Rows.Count > 0 ? Color.Red : Color.FromArgb(0, 0, 0); } else { if (model.IsDrag) { return; } if (model.IsChart&& !string.IsNullOrWhiteSpace(model.ChartText)) { ChartControlEx controlEx = tabPage.Tag as ChartControlEx; controlEx.SetTitle(ReplaceHelper.ReplaceRowParam(rowItem, model.ChartText), model.ChartTextColor); } string searchSql = this.GetSearchSql(model, rowItem); //if (moduleGridEx != null&& moduleGridEx.SearchObj!=null) //{ // searchSql= moduleGridEx.SearchObj.SetSearchSqlValue(searchSql); //} GridView view = this.ModuleGridObj.GridControlObj.GridView; //DataTable dataTable = MainImpl.GetDataTableResult(searchSql);//明细数据源 if (model.DynamicDetails && rowItem.Table.Columns.Contains("DisplayColumns")) { this.tcButtom.SetGridDisplayColumns(tabPage, rowItem["DisplayColumns"] + ""); } //2026-4-24赵坤 先根据选中行改变条件,后续明细sql拼接上条件(之前修改条件后不会拼接到sql中) if (tabPage.Tag is GridControlEx && (tabPage.Tag as GridControlEx).ParentControl != null) { (tabPage.Tag as GridControlEx).ParentControl.SetAllControlValue(rowItem); if(model.DetailSearch) searchSql = (tabPage.Tag as GridControlEx).ParentControl.SetSearchSqlValue(searchSql); } //记录上一次执行的sql if (tabPage.Tag is GridControlEx) { (tabPage.Tag as GridControlEx).LastSearchSql = searchSql; } this.tcButtom.SetGridDataSource(tabPage, MainImpl.GetDataTableResult(searchSql), view); //配置明细直接根据条件加载 if (model.SystemModel != null && 1 == model.SystemModel.isFirstLoad) { (tabPage.Tag as GridControlEx).ParentControl.SearchGrid(); tabPage.Text = model.DetailName + "(" + (tabPage.Tag as GridControlEx).ParentControl.GridRowCount + QuantitySuffix; } } if (moduleGridEx != null) { moduleGridEx.ParentButtonState(rowItem); moduleGridEx.SelectTheSpecifiedRow(); } } } /// /// 明细数据变化后刷新主表数据 /// /// /// private void OnSaveGridCallBack(object sender, EventArgs e) { int oldRowHandle = 0; XtraTabPage RefreshPage = this.TabObj.SelectedTabPage; Object moduleObject = RefreshPage.Controls.Cast().FirstOrDefault(); ModuleGridEx moduleGridEx = null; if (moduleObject is ModuleGridEx) { moduleGridEx = moduleObject as ModuleGridEx; oldRowHandle = moduleGridEx.GridControlObj.GridView.FocusedRowHandle;//上一次选中行 } ModuleGridObj.SearchObj.SearchLastGrid(); if (moduleGridEx.SearchObj.RememberRow) { moduleGridEx.GridControlObj.GridView.SelectRowHandler(oldRowHandle); } } void GridControl_EditorKeyDown(object sender, KeyEventArgs e) { } /// /// 说明:获取查询条件 /// 创建人:龚宇超 /// 创建日期:2017-11-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The row item. /// System.String. protected string GetSearchSql(GridDetailModel model, DataRow rowItem, bool isLeft = false) { string fieldName = !string.IsNullOrEmpty(model.UnionParentField) && rowItem.Table.Columns.Contains(model.UnionParentField) ? model.UnionParentField : ModuleGridObj.ParmaryKey; string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; if (model.IsUnionleft && _leftGridSearchObj != null) { DataRow leftrow = _leftGridSearchObj.MainGridEx.GetViewFocusedDataRow(); sqlValue = ReplaceHelper.ReplaceRowParam(leftrow, sqlValue); } else { sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); } //如果有{parent.key},就替换为左侧的主键 //if (sqlValue.Contains("{parent.key}")) //{ // string parentValue = string.Empty; // if (this.ModuleGridObj.LeftTreeViewEx != null) // { // parentValue= this.ModuleGridObj.LeftTreeViewEx.TreeView.SelectedNode.Name; // } // else if (this.ModuleGridObj.LeftGridEx != null) // { // DataRow dataRow = this.ModuleGridObj.LeftGridEx.GridView.GetFocusedDataRow(); // if (this.ModuleGridObj.LeftGridEx is TreeGridControlEx) dataRow = this.ModuleGridObj.LeftGridEx.GetViewFocusedDataRow(); // parentValue = dataRow[this.ModuleGridObj.ParentKeyField] + ""; // } // sqlValue = ReplaceHelper.ReplaceParamToValue(sqlValue, "{parent.key}", parentValue); //} //sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); DataRow row = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow(); if (row != null && isLeft) { //先替换左侧选中行,在替换主表 sqlValue = ReplaceHelper.ReplaceRowParam(row, sqlValue); } // ① 先拿普通 GridView 的焦点列(始终会有) GridColumn fixColumn = this.ModuleGridObj.GridControlObj.GridView.FocusedColumn; string columnCaption = fixColumn?.Caption ?? string.Empty; string subColumnCaption = string.Empty; string Columnvalue= string.Empty; /* ② 如果启用了多表头(CustomGroupBandEx), * 尝试用 BandedGridColumn.OwnerBand 获取 Band 标题 */ if (this.ModuleGridObj.GridControlObj.CustomGroupBandEx != null) { var bandEx = this.ModuleGridObj.GridControlObj.CustomGroupBandEx; var bandedView = bandEx.GridView as DevExpress.XtraGrid.Views.BandedGrid.BandedGridView; GridColumn focusedColumn = null; //DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hitInfo = bandedView.CalcHitInfo(MousePosition.X, MousePosition.Y); focusedColumn = bandedView.FocusedColumn; if (bandedView != null && focusedColumn != null) { // 强转;成功才说明列属于 BandedGridView var bcol = focusedColumn as DevExpress.XtraGrid.Views.BandedGrid.BandedGridColumn; if (bcol != null && bcol.OwnerBand != null) { // 若只想最顶层 Band,循环 ParentBand 至 null var band = bcol.OwnerBand; while (band.ParentBand != null) band = band.ParentBand; columnCaption = band.Caption; // 用 Band 的标题 subColumnCaption= focusedColumn.FieldName; } } } else if (this.ModuleGridObj.GridControlObj.CustomGroupTreeBandEx != null) { var treeBandEx = this.ModuleGridObj.GridControlObj.CustomGroupTreeBandEx; var treeBandedView = treeBandEx.TreeListObj as DevExpress.XtraTreeList.TreeList; DevExpress.XtraTreeList.Columns.TreeListColumn focusedColumn = null; //DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hitInfo = bandedView.CalcHitInfo(MousePosition.X, MousePosition.Y); focusedColumn = treeBandedView.FocusedColumn; if (treeBandedView != null && focusedColumn != null) { // 强转;成功才说明列属于 BandedGridView var bcol = focusedColumn as DevExpress.XtraTreeList.Columns.TreeListColumn; if (bcol != null && bcol.ParentBand != null) { // 若只想最顶层 Band,循环 ParentBand 至 null var band = bcol.ParentBand; while (band.ParentBand != null) band = band.ParentBand; columnCaption = band.Caption; // 用 Band 的标题 subColumnCaption = focusedColumn.FieldName; } } } // ③ 替换占位符(Replace 会返回新字符串) sqlValue = sqlValue.Replace("{COLUMN_TITLE}", columnCaption); sqlValue = sqlValue.Replace("{COLUMN_SUBTITLE}", subColumnCaption); if (sqlValue.Contains("{COLUMN_VALUE}")&&!string.IsNullOrWhiteSpace(subColumnCaption)) { string value = rowItem[subColumnCaption]+""; sqlValue = sqlValue.Replace("{COLUMN_VALUE}", value); } if (ReplaceHelper.IsSelect(sqlValue) && !string.IsNullOrEmpty(model.UnionValue))//ReplaceHelper.IsSelect { 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; } //替换普通焦点行列列名 if (sqlValue.Contains("{FOCUSEDCOLUMN_NAME}") && fixColumn != null) { sqlValue = sqlValue.Replace("{FOCUSEDCOLUMN_NAME}", fixColumn.FieldName); } return sqlValue; } /// /// 说明:右键菜单执行后刷新数据,刷新规则按照上一次查询条件刷新 /// 创建人:龚宇超 /// 创建日期:2017-11-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewRightCallBack(object sender, EventArgs e) { try { if (callRefreshDetail) { this.SetDetailGridDataSource(); } else { this.SetDetailGridDataSource(this.TabObj.SelectedTabPage); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:双击加载明细 /// 创建人:龚宇超 /// 创建日期:2017-11-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnGridViewDoubleClick(object sender, EventArgs e) { try { WaitForm.ShowForm(); this.SetDetailGridDataSource(); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); LogHelper.Instance.WriteError(ex); } finally { WaitForm.HideForm(); } } /// /// 说明:双击加载树表格明细 /// 创建人:王一帆 /// 创建日期:2020-02-12 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. private void OnFocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e) { try { WaitForm.ShowForm(); this.SetDetailGridDataSource(); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); LogHelper.Instance.WriteError(ex); } finally { WaitForm.HideForm(); } } /// /// 双击模式时,主表搜索为空 /// /// /// private void SearchObj_ClearDetails_DoubleMode(object sender, EventArgs e) { try { //主表内容为空时清空所有明细数据 if (this.ModuleGridObj.GridControlObj.gridControl.DataSourceTable().Rows.Count == 0) { GridView_DoubleClick(null, null); } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } /// /// 基础模块双击加载明细 /// /// /// private void GridView_DoubleClick(object sender, EventArgs e) { try { WaitForm.ShowForm(); if (IsDynamicDetailType) { this.DynamicSetDetailGridDataSource(); } else { this.SetDetailGridDataSource(); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); LogHelper.Instance.WriteError(ex); } finally { WaitForm.HideForm(); } } /// /// 加载明细数据 /// /// /// private void GridView_MouseDown(object sender, MouseEventArgs e) { this.CancelSwitchingRow = false; //验证是否切换选中行 if (SystemInfo.Instance.EfficientVerification && !this.TcButtom.CheckIfSaved()) { //开启验证,且切换时保存失败。取消切换行操作 this.CancelSwitchingRow = true; return; } GridView view = sender as GridView; // 计算点击位置的信息 DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hitInfo = view.CalcHitInfo(e.X, e.Y); // 检查点击是否在行内 if (hitInfo.InRowCell) { // 获取点击的行句柄 int rowHandle = hitInfo.RowHandle; //this.ModuleGridObj.GridControlObj.GridView.FocusedColumn = hitInfo.Column; if (LastFocusedRowHandle == rowHandle) { //和上一次点击行一致就刷新数据原 if (IsDynamicDetailType) { this.DynamicSetDetailGridDataSource(); } else { this.SetDetailGridDataSource(); } } } } /// /// 说明:加载明细数据 /// 创建人:龚宇超 /// 创建日期:2018-09-28 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void GridView_RowCellClick(object sender, RowCellClickEventArgs e) { try { WaitForm.ShowForm(); if (this.isFocusedRowChanged) { if (IsDynamicDetailType) { this.DynamicSetDetailGridDataSource(); } else { this.SetDetailGridDataSource(); } } this.isFocusedRowChanged = true; } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } /// /// 说明:数据行发生改变加载明细 /// 创建人:龚宇超 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewFocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { try { WaitForm.ShowForm(); if (this.CancelSwitchingRow) { //this.CancelSwitchingRow = false; this.BeginInvoke(new Action(() => { this.ModuleGridObj.GridControlObj.GridView.FocusedRowHandle = this.LastFocusedRowHandle; this.ModuleGridObj.GridControlObj.GridView.RefreshData(); })); return; } else { if (e != null) this.LastFocusedRowHandle = e.RowHandle; if (IsDynamicDetailType) { this.DynamicSetDetailGridDataSource(); } else { this.SetDetailGridDataSource(); } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } /// /// 主表数据查询后发生 /// /// /// private void SearchObj_ClearDetails(object sender, EventArgs e) { try { //主表内容为空时清空所有明细数据 if (this.ModuleGridObj.GridControlObj.gridControl.DataSourceTable().Rows.Count == 0) { OnGridViewFocusedRowObjectChanged(null, null); } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } /// /// 说明:加载明细数据 /// 创建人:龚宇超 /// 创建日期:2017-11-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnGridViewFocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { try { WaitForm.ShowForm(); this.SetDetailGridDataSource(); } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show("加载明细数据失败!" + Message); } finally { WaitForm.HideForm(); } } /// /// 说明:设置分割条位置 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnSplitterMoved(object sender, EventArgs e) { try { if (this.Model != null) { IniHelper.Write(string.Format("base_height_{0}", this.Model.ModuleCode), this.scc_container.SplitterPosition + ""); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 刷新子页签数据 /// /// /// private void ModuleGridObj_AfterRefreshingCallBack(object sender, EventArgs e) { foreach (XtraTabPage tabPage in this.TabObj.TabPages) { GridDetailModel model = this.tcButtom.GetGridDetailModel(tabPage); if (model != null) { if (tabPage.Tag is TreeGridControlEx) { (tabPage.Tag as TreeGridControlEx).RefreshDataSource(); } else if (tabPage.Tag is GridControlEx) { (tabPage.Tag as GridControlEx).RefreshDataSource(); } } else if (tabPage.Tag is TabMultipledetails) { TabMultipledetails tabMultipledetails = tabPage.Tag as TabMultipledetails; (tabMultipledetails.SplitMain.Panel1.Tag as GridControlEx).RefreshDataSource(); (tabMultipledetails.SplitMain.Panel2.Tag as GridControlEx).RefreshDataSource(); } } } /// /// 判断是否有未保存的数据,并保存 /// /// 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; } /// /// 说明:检查可用条件 /// 创建人:龚宇超 /// 创建日期:2017-11-09 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The cond. /// The data row. /// true if XXXX, false otherwise. private bool ValidateCond(string cond, DataRow dataRow) { bool result = false; string condition = cond; try { if (string.IsNullOrWhiteSpace(cond)) return true;//如果值是空格或者空行,默认正确 cond = ReplaceHelper.ReplaceRowParamEmptyWrapQuote(dataRow, cond); if (cond.StartsWith("@") || cond.StartsWith("!")) { result = "1".Equals(BaseImpl.GetDefaultValue(cond)); } else if (dataRow == null) { result = ReplaceHelper.EvalCond(cond); } else { result = ReplaceHelper.ReplaceRowParamCond(dataRow, cond); } return result; } catch (Exception ex) { } return result; } } }