Files

2874 lines
138 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************
* 说明:TabControlEx多标签(标签内容包含表格和图表) 应用于审核附加信息、基础档案审核附加信息
* 创建人:龚宇超
* 创建日期:2018-01-10
* 修改人:
* 修改日期:
* 修改备注:
* 版本: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.Util;
using Lskj.Business.Impl;
using Lskj.Control.Model;
using Lskj.Model;
using DevExpress.XtraEditors;
using Lskj.Data;
using DevExpress.XtraGrid.Columns;
using Lskj.Business;
using DevExpress.XtraGrid.Views.Grid;
using System.Threading.Tasks;
using System.Collections;
using DevExpress.XtraGrid.Views.BandedGrid;
namespace Lskj.Control
{
/// <summary>
/// 多标签,标签内容包含表格和图表
/// </summary>
public partial class TabControlEx : UserControl
{
/// <summary>
/// 是否加载明细刷新
/// </summary>
/// <value><c>true</c> if [_ un refresh]; otherwise, <c>false</c>.</value>
private bool _UnRefresh
{
get
{
return Model is DynamicModuleDetailModel || Model is DynamicModuleModel || Model is DynamicProductionModel;
}
}
/// <summary>
/// 拖拽模式
/// </summary>
public bool IsDragDetail;
/// <summary>
/// 拖拽目标主键字段
/// </summary>
public string DrgaParentPrimaryKey;
/// <summary>
/// 添加数据sql赋值
/// </summary>
public string ControlSql;
/// <summary>
/// tab标签
/// </summary>
private List<GridDetailModel> _gridDetail;
/// <summary>
/// tab标签里明细数据
/// </summary>
private List<GridDetailModel> _gridIntoDetail;
/// <summary>
/// 是否为Mrp明细页签
/// </summary>
private bool isMrpDetail = false;
/// <summary>
/// The system model
/// </summary>
public DynamicModel Model;
/// <summary>
/// 父表格
/// </summary>
public GridControlEx ParentGridEx;
/// <summary>
/// Mrp父表格
/// </summary>
public GridControlEx MrpParentGridEx;
/// <summary>
/// Mrp父明细表格
/// </summary>
public GridControlEx MrpDetailGridEx;
/// <summary>
/// 父容器
/// </summary>
public MyControl ParentControlEx;
/// <summary>
/// 明细数据里的主表格
/// </summary>
public ModuleGridEx ModuleGridObj;
/// <summary>
/// 选项卡
/// </summary>
public XtraTabControl TabControlObj
{
get { return this.xtc_container; }
}
/// <summary>
/// 替换其他页签中条件的表
/// </summary>
public GridControlEx ReplaceControlEx;
/// <summary>
/// 右键菜单执行后调用
/// </summary>
/// <param name="sender">The sender.</param>
public event EventHandler OnRightCallback;
/// <summary>
/// 在保存网格回调(右键)
/// </summary>
/// <param name="sender">The sender.</param>
public event EventHandler OnDetailRightCallback;
/// <summary>
/// 在保存网格回调
/// </summary>
/// <param name="sender">The sender.</param>
public event EventHandler OnDetailSaveGridCallBack;
//拖拽模式拖拽完成委托
public delegate void DragCompleteCallbackEventHandler(object sender, GridDragGridArgs e);
//拖拽模式拖拽完成回调
public event DragCompleteCallbackEventHandler OnDragCompleteCallback;
/// <summary>
/// 拖拽模式DetailView双击点击事件回调
/// </summary>
public event EventHandler OnDetailViewDoubleClickCallBack;
/// <summary>
/// mrp拖拽完成后
/// </summary>
public event EventHandler OnMrpDragCallback;
public event EventHandler OnMrpBtnClickCallback;
/// <summary>
/// 右键执行后回调(针对单据,单据主表明细不是ModuleGridExSearchLastGrid方法无效)
/// </summary>
public event EventHandler BillDetailRightGridCallBack;
/// <summary>
/// 明细页签与主模块对应关系
/// </summary>
public Dictionary<string, List<DetailTabPageModel>> DetailTabPagesDic = new Dictionary<string, List<DetailTabPageModel>>();
/// <summary>
/// 页签控件集合
/// </summary>
public Dictionary<GridDetailModel, object> PageControlsDic = new Dictionary<GridDetailModel, object>();
/// <summary>
/// 左右结构中,左侧表格与右侧页签的对应关系。
/// 左侧重新绑定空数据源时不会触发行焦点变化事件,需要通过这个关系主动刷新右侧。
/// </summary>
private readonly Dictionary<GridControlEx, XtraTabControl> _rightTabsByLeftGrid = new Dictionary<GridControlEx, XtraTabControl>();
/// <summary>
/// 已经绑定过左右联动事件的左侧表格,避免重复绑定事件导致重复刷新。
/// </summary>
private readonly HashSet<GridControlEx> _rightTabRefreshRegisteredGrids = new HashSet<GridControlEx>();
/// <summary>
/// 左右结构中的右侧页签集合。
/// 只有这些页签会根据数据行数禁用 ModuleGridEx 底部操作栏。
/// </summary>
private readonly HashSet<XtraTabPage> _rightSideTabPages = new HashSet<XtraTabPage>();
/// <summary>
/// 页签名(判断是否有重复的左右结构)
/// </summary>
public string DetaiName = string.Empty;
public TabControlEx()
{
InitializeComponent();
this.Disposed += OnTabControlExDisposed;
}
#region 通用工具
/// <summary>尝试从 XtraTabPage 解析出 GridDetailModel。</summary>
private static GridDetailModel ResolveModel(XtraTabPage page)
{
// ① page.Tag 直接就是 GridDetailModel
if (page.Tag is GridDetailModel m) return m;
// ② page.Tag 是装控件,控件.Tag 才是 GridDetailModel
if (page.Tag is System.Windows.Forms.Control c && c.Tag is GridDetailModel m2) return m2;
// ③ page.Controls 里找第一个带 Tag 的控件
foreach (System.Windows.Forms.Control ctl in page.Controls)
if (ctl.Tag is GridDetailModel m3) return m3;
return null;
}
/// <summary>
/// 将 DataTable 绑定到指定 XtraTabPage(根据 page.Tag 控件类型自动处理)。
/// </summary>
private static void BindTableToPage(XtraTabPage page, DataTable table, string lastSql = null)
{
switch (page.Tag)
{
/* ① page.Tag 直接就是 GridControlEx -------------------------- */
case GridControlEx gridEx:
gridEx.LastSearchSql = lastSql ?? gridEx.LastSearchSql;
gridEx.SetGridViewDataSource(table);
break;
/* ② page.Tag 是某种 Control,且本身是 GridControlEx ----------- */
case System.Windows.Forms.Control ctl when ctl is GridControlEx g:
g.LastSearchSql = lastSql ?? g.LastSearchSql;
g.SetGridViewDataSource(table);
break;
/* ③ 图表控件:需先于通用容器判断,避免绑定到图表内部隐藏网格 -- */
case ChartControlEx chartEx:
chartEx.CreateChart(table);
break;
/* ④ Tag 是面板/其它容器,递归找内部网格 ------------------------ */
case System.Windows.Forms.Control container when FindGridControlEx(container) is GridControlEx g2:
g2.LastSearchSql = lastSql ?? g2.LastSearchSql;
g2.SetGridViewDataSource(table);
break;
/* ⑤ 其它控件无需绑定 ------------------------------------------- */
default:
break;
}
}
private static GridControlEx FindGridControlEx(System.Windows.Forms.Control root)
{
foreach (System.Windows.Forms.Control child in root.Controls)
{
if (child is GridControlEx gx) // 找到就返回
return gx;
GridControlEx inner = FindGridControlEx(child);
if (inner != null) return inner; // 递归向下
}
return null;
}
/// <summary>
/// 设置当前页签内 ModuleGridEx 底部操作栏是否可交互。
/// 只处理左右结构右侧页签里直接承载的 ModuleGridEx,不影响普通页签和左侧表。
/// </summary>
private void SetModuleGridBottomPanelEnabled(XtraTabPage tabPage, bool enabled)
{
if (tabPage == null) return;
if (!_rightSideTabPages.Contains(tabPage)) return;
ModuleGridEx moduleGrid = tabPage.Controls.OfType<ModuleGridEx>().FirstOrDefault();
if (moduleGrid != null && moduleGrid.ObjPanel != null)
{
moduleGrid.ObjPanel.Enabled = enabled;
}
}
#endregion
#region 新核心方法
/// <summary>
/// 统一刷新页签(既可用于旧底部 tcButtom,也可用于新右侧 rightTab)。
/// </summary>
protected void SetTabPageDataSource(
XtraTabPage tabPage,
GridControlEx leftGrid,
bool isNull = false,
DataRow overrideRow = null)
{
/********* 0. 前置:获得模型对象 & 当前行 *********/
GridDetailModel model = ResolveModel(tabPage);
if (model == null)
{
BindTableToPage(tabPage, new DataTable());
SetModuleGridBottomPanelEnabled(tabPage, false);
return;
}
// 行:优先 overrideRow,其次主表当前行
DataRow rowItem = overrideRow ?? leftGrid.GetViewFocusedDataRow();
//if (leftGrid.CustomGroupBandEx != null && overrideRow == null)
// rowItem = leftGrid.CustomGroupBandEx.GetViewFocusedDataRow();
if (leftGrid.CustomGroupSelectedRow != null && overrideRow == null)
rowItem = leftGrid.CustomGroupSelectedRow;
/********* 1. 置空逻辑 ***********************************************/
if (isNull || rowItem == null)
{
// 1-A: 左右结构且允许 UnionLeft → 仍可带条件取数
if (model.IsUnionleft && overrideRow != null)
{
string sqlValue = model.IsReadOnly || model.IsChart
? model.DetailSql
: model.SystemModel.MenuSql;
sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue);
sqlValue = ReplaceHelper.ReplaceWhereCond(sqlValue);
DataTable dt = MainImpl.GetDataTableResult(sqlValue);
BindTableToPage(tabPage, dt);
SetModuleGridBottomPanelEnabled(tabPage, dt != null && dt.Rows.Count > 0);
}
else
{
BindTableToPage(tabPage, new DataTable());
SetModuleGridBottomPanelEnabled(tabPage, false);
}
return;
}
/********* 2. PageVisibleCond(可见性判定) ***************************/
if (leftGrid.SysModel!=null && !string.IsNullOrEmpty(leftGrid.SysModel.PageVisbleCond))
{
string condSql = ReplaceHelper.ReplaceRowParam(rowItem,
ReplaceHelper.ReplaceUserInfo(leftGrid.SysModel.PageVisbleCond));
string numberList = MainImpl.GetResult(condSql) + "";
if (!string.IsNullOrEmpty(numberList))
{
string orderIdStr = model.Orderid.ToString();
bool visible = numberList.Split(',').Contains(orderIdStr);
tabPage.PageVisible = visible;
if (!visible)
{
BindTableToPage(tabPage, new DataTable());
SetModuleGridBottomPanelEnabled(tabPage, false);
return;
}
}
}
/********* 3. 浏览器页签 ************************************************/
if (tabPage.Tag is FrmWebBrowser ||
tabPage.Tag is FrmWebBrowser2 ||
tabPage.Tag is FrmMiniBlink)
{
string url = ReplaceHelper.ReplaceRowParam(rowItem,
ReplaceHelper.ReplaceUserInfo(model.DetailSql));
url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url;
switch (tabPage.Tag)
{
case FrmWebBrowser w1: w1.LoadUrl(url); break;
case FrmWebBrowser2 w2: w2.LoadUrl(url); break;
case FrmMiniBlink mb: mb.LoadUrl(url); break;
}
return;
}
/********* 4. 多明细 TabMultipledetails ********************************/
if (tabPage.Tag is TabMultipledetails multi)
{
multi.SetConditionValues(rowItem);
// 主格
GridControlEx grdMain = multi.SplitMain.Panel1.Tag as GridControlEx;
GridDetailModel mainM = grdMain.Tag as GridDetailModel;
string sqlMain = GetSearchSql(mainM, rowItem);
DataTable mainTable = MainImpl.GetDataTableResult(sqlMain);
grdMain.LastSearchSql = sqlMain;
grdMain.SetGridViewDataSource(mainTable);
// 附格 / 图表
System.Windows.Forms.Control rightCtl = multi.SplitMain.Panel2.Tag as System.Windows.Forms.Control;
if (rightCtl is GridControlEx grdAdd)
{
GridDetailModel addM = grdAdd.Tag as GridDetailModel;
string sqlAdd = GetSearchSql(addM, rowItem);
if (!mainM.IsUnioDetail)
{
grdAdd.LastSearchSql = sqlAdd;
grdAdd.SetGridViewDataSource(MainImpl.GetDataTableResult(sqlAdd));
}
else if (mainTable.Rows.Count == 0) // 主表无数据 → 清空
{
grdAdd.LastSearchSql = "";
grdAdd.SetGridViewDataSource(new DataTable());
}
}
else if (rightCtl is ChartControlEx chartAdd)
{
GridDetailModel addM = chartAdd.Tag as GridDetailModel;
string sqlAdd = GetSearchSql(addM, rowItem);
chartAdd.CreateChart(MainImpl.GetDataTableResult(sqlAdd));
}
tabPage.Text = $"{mainM.DetailName}({mainTable.Rows.Count}条)";
tabPage.Appearance.Header.ForeColor =
mainTable.Rows.Count > 0 ? Color.Red : Color.Black;
return;
}
/********* 5. 普通 Grid / Chart / 动态列 ******************************/
if (!string.IsNullOrEmpty(model.UnionModule) &&
string.IsNullOrEmpty(model.UnionValue) &&
string.IsNullOrEmpty(model.UnionCond))
return; // 无关联字段→不刷
if (model.IsDrag) return; // 拖拽页签不刷
string finalSql = GetSearchSql(model, rowItem);
//if (model.DynamicDetails && rowItem.Table.Columns.Contains("DisplayColumns"))
// tabContainer.SetGridDisplayColumns?.Invoke(tabPage, rowItem["DisplayColumns"] + "");
DataTable table = MainImpl.GetDataTableResult(finalSql);
BindTableToPage(tabPage, table, finalSql);
SetModuleGridBottomPanelEnabled(tabPage, table != null && table.Rows.Count > 0);
tabPage.Text = $"{model.DetailName}({table.Rows.Count}条)";
tabPage.Appearance.Header.ForeColor = table.Rows.Count > 0 ? Color.Red : Color.FromArgb(0, 0, 0);
// 首次加载自动查询
if (model.SystemModel != null && model.SystemModel.isFirstLoad == 1
&& tabPage.Tag is GridControlEx gc)
{
gc.ParentControl.SearchGrid();
tabPage.Text = $"{model.DetailName}({gc.ParentControl.GridRowCount}条)";
tabPage.Appearance.Header.ForeColor = gc.ParentControl.GridRowCount > 0 ? Color.Red : Color.FromArgb(0, 0, 0);
}
// 行定位 / 按钮状态
if (tabPage.Controls.OfType<ModuleGridEx>().FirstOrDefault() is ModuleGridEx mod)
{
mod.ParentButtonState(rowItem);
mod.SelectTheSpecifiedRow();
}
}
#endregion
/// <summary>
/// 注册左右结构的联动刷新。
/// 行焦点变化时刷新右侧,同时记录映射,便于左侧重新绑定空数据源后主动清空右侧。
/// </summary>
private void RegisterRightTabRefresh(GridControlEx leftGrid, XtraTabControl rightTab)
{
if (leftGrid == null || rightTab == null) return;
_rightTabsByLeftGrid[leftGrid] = rightTab;
if (!_rightTabRefreshRegisteredGrids.Contains(leftGrid))
{
leftGrid.GridView.FocusedRowObjectChanged += (s, e) => RefreshRightTabAfterLeftBind(leftGrid);
_rightTabRefreshRegisteredGrids.Add(leftGrid);
}
RefreshRightTab(rightTab, leftGrid);// 首次加载
}
/// <summary>根据左侧选中行刷新右侧整个 TabControl。</summary>
private void RefreshRightTab(XtraTabControl rightTab, GridControlEx leftGrid)
{
DataRow rowItem = leftGrid.GetViewFocusedDataRow();
foreach (XtraTabPage page in rightTab.TabPages)
{
bool isNull = rowItem == null;
SetTabPageDataSource(page, leftGrid, isNull, rowItem);
}
}
/// <summary>
/// 左侧表格重新绑定数据源后主动刷新右侧。
/// 解决空表没有焦点行变化事件,导致右侧表残留旧数据的问题。
/// </summary>
private void RefreshRightTabAfterLeftBind(GridControlEx leftGrid)
{
if (leftGrid == null) return;
if (_rightTabsByLeftGrid.TryGetValue(leftGrid, out XtraTabControl rightTab))
{
RefreshRightTab(rightTab, leftGrid);
}
}
/// <summary>
/// 新模式加载明细控件
/// </summary>
/// <param name="gridDetail"></param>
/// <param name="isGridmerge"></param>
/// <param name="isAddPages"></param>
public void InitTabPages(List<GridDetailModel> gridDetail, bool isGridmerge = true, bool isAddPages = false)
{
if (ParentGridEx != null && ParentGridEx.CustomGroupBandEx != null)
{
ParentGridEx.CustomGroupBandEx.BandedView.LeftCoordChanged += OnBandedViewLeftCoordChanged;
ParentGridEx.CustomGroupBandEx.BandedView.ColumnWidthChanged += OnBandedViewColumnWidthChanged;
ParentGridEx.OnBuildGroupedColumnCallBack += OnBandedViewColumnWidthChanged;
}
if (ParentGridEx != null && ParentGridEx.CustomGroupTreeBandEx != null)
{
ParentGridEx.CustomGroupTreeBandEx.TreeListObj.LeftCoordChanged += OnBandedViewLeftCoordChanged; ;
ParentGridEx.CustomGroupTreeBandEx.TreeListObj.ColumnWidthChanged += OnBandedViewColumnWidthChanged;
ParentGridEx.OnBuildGroupedColumnCallBack += OnBandedViewColumnWidthChanged;
}
this._gridDetail = gridDetail;
if (!isAddPages) this.xtc_container.TabPages.Clear();
// 1️⃣ 预分组:Rightdockid > 0 的明细
var rightGroups = gridDetail
.Where(m => m.Rightdockid != 0)
.GroupBy(m => m.Rightdockid)
.ToDictionary(g => g.Key, g => g.ToList());
Dictionary<object, Hashtable> dataCaches = Model?.DataCaches;
// 普通 ModuleGridEx 明细使用同一个父模块主键,避免同步加载时每个明细重复查询。
bool hasModuleGridDetail = Model != null && gridDetail.Any(model => IsModuleGridDetail(model, gridDetail, isGridmerge));
string parentPrimaryKey = null;
if (hasModuleGridDetail && !dataCaches.GetValue(this, "ParentPrimaryKey", out parentPrimaryKey))
{
parentPrimaryKey = BaseImpl.GetBasePrimaryKey(Model.ModuleCode);
}
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
{
Text = model.DetailName
};
page.SizeChanged += OnPageSizeChanged;
// 2️⃣ 先生成“左侧”父明细控件
System.Windows.Forms.Control leftCtrl = CreateDetailControl(page, model, dataCaches, true, null, hasModuleGridDetail, parentPrimaryKey);
int position = int.TryParse(IniHelper.Read($"base_TabPageMain_{model.Id}"), out int value) ? value : 0; // 0 是转换失败时的默认值
if (hasRight && isGridmerge)
{
/* ── 带右侧 Dock 的父明细 ───────────────────────────── */
SplitContainerControl split = new SplitContainerControl
{
Dock = DockStyle.Fill,
FixedPanel = SplitFixedPanel.Panel1,
SplitterPosition = position > 0 ? position : Math.Max(350, this.xtc_container.Width / 2)
};
split.Panel1.Controls.Add(leftCtrl);
split.SplitterPositionChanged += OnSplitterPositionChanged;
XtraTabControl rightTab = new XtraTabControl
{
Dock = DockStyle.Fill
};
if (rightChildren.Count == 1)
rightTab.ShowTabHeader = DevExpress.Utils.DefaultBoolean.False;
GridControlEx leftControl = new GridControlEx();
if (leftCtrl is GridControlEx left1)
{
leftControl = left1;
}
else if (leftCtrl is ModuleGridEx left2)
{
leftControl = left2.GridControlObj;
}
else if (page.Tag is GridControlEx left3)
{
leftControl = left3;
}
foreach (var child in rightChildren.OrderBy(c => c.Orderid))
{
XtraTabPage childPage = new XtraTabPage { Text = child.DetailName };
System.Windows.Forms.Control childCtrl = CreateDetailControl(childPage, child, dataCaches, true, leftControl, hasModuleGridDetail, parentPrimaryKey);
childPage.Controls.Add(childCtrl);
rightTab.TabPages.Add(childPage);
_rightSideTabPages.Add(childPage);
}
split.Panel2.Controls.Add(rightTab);
// split.Panel1 里是“左侧控件”
// 如果它是网格,就把事件绑上去
if (leftCtrl is GridControlEx g1)
{
RegisterRightTabRefresh(g1, rightTab);
}
else if (leftCtrl is ModuleGridEx mg)
{
var g2 = mg.GridControlObj;
RegisterRightTabRefresh(g2, rightTab);
} else if (page.Tag is GridControlEx g3)
{
RegisterRightTabRefresh(g3, rightTab);
}
page.Controls.Add(split);// 跟原来保持一致的 Tag 用法
}
else
{
/* ── 普通明细 ─────────────────────────────────────── */
page.Controls.Add(leftCtrl);
}
/* 3️⃣ 加入到容器 & 索引字典 */
this.xtc_container.TabPages.Add(page);
var dtp = new DetailTabPageModel
{
TabPageIndex = this.xtc_container.TabPages.IndexOf(page),//this._gridDetail.IndexOf(model), 如果是有左右结构,会跳过1个序号(右侧模块不会存序号),导致报错
DetailTabPage = page,
DetailModel = model
};
if (!string.IsNullOrEmpty(model.ParentModuleCode))
{
string key = model.ParentModuleCode.ToLower();
if (!this.DetailTabPagesDic.TryGetValue(key, out var list))
this.DetailTabPagesDic[key] = list = new List<DetailTabPageModel>();
list.Add(dtp);
}
}
}
/// <summary>
/// 判断明细配置是否会创建普通 ModuleGridEx 控件。
/// </summary>
private static bool IsModuleGridDetail(GridDetailModel model, List<GridDetailModel> gridDetail, bool isGridmerge)
{
if (model == null || model.IsChart || model.IsExcel || model.IsWebView || model.IsWebView2 || model.IsWebView3 ||
model.IsSched || (model.IsAddPanel && isGridmerge) || model.IsDetailView)
{
return false;
}
int sameDetailCount = gridDetail.Count(item => item.DetailName.Equals(model.DetailName));
return !(model.IsReadOnly && sameDetailCount == 1) && !(sameDetailCount > 1 && isGridmerge);
}
/// <summary>
/// <para>说明:绑定选项卡</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-09</para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
public void InitTabPagesOld(List<GridDetailModel> gridDetail, bool isGridmerge = true, bool isAddPages = false)
{
this._gridDetail = gridDetail;
if (!isAddPages)
{
this.xtc_container.TabPages.Clear();
}
string DetaiName = string.Empty;
Dictionary<object, Hashtable> dataCaches = Model != null ? Model.DataCaches : null;
foreach (GridDetailModel model in this._gridDetail)
{
object control = PageControlsDic.ContainsKey(model) ? PageControlsDic[model] : null;
bool hasControl = control != null;
if (DetaiName.Equals(model.DetailName) && isGridmerge) continue;
GridDetailModel[] isMeage = gridDetail.Cast<GridDetailModel>().Where(x => x.DetailName.Equals(model.DetailName)).ToArray();
XtraTabPage page = new XtraTabPage();
page.SizeChanged += OnPageSizeChanged;
page.Text = model.DetailName;
if (SystemInfo.Instance.GridRowFontSize > 0)
{
//页签大小
FontFamily fontFamily = page.Appearance.Header.Font.FontFamily;
page.Appearance.Header.Font = new System.Drawing.Font(fontFamily, SystemInfo.Instance.GridRowFontSize);
}
if (model.IsChart)
{
ChartControlEx chartEx = hasControl && control is ChartControlEx ? (ChartControlEx)control : 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 (!dataCaches.GetValue(chartEx, "ChartParams", out DataTable dtChartParams))
{
dtChartParams = BaseModuleImpl.GetChartParams(model.FormKey);
}
if (!dataCaches.GetValue(chartEx, "ChartRightMenus", out DataTable dtBaseGridRightMenus))
{
dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus(model.FormKey);
}
chartEx.SetCharts(dtChartParams);
chartEx.SetChartRightMenus(dtBaseGridRightMenus, this.Model, OnGridViewRightCallBack);
chartEx.Tag = model;
page.Tag = chartEx;
page.Controls.Add(chartEx);
}
else if (model.IsExcel)
{
ExcelControlEx excelEx = hasControl && control is ExcelControlEx ? (ExcelControlEx)control : new ExcelControlEx();
excelEx.Dock = DockStyle.Fill;
excelEx.Tag = model;
page.Tag = excelEx;
page.Controls.Add(excelEx);
}
else if (model.IsWebView)
{
// 加载网页
string url = model.DetailSql.StartsWith("http") ? model.DetailSql : SystemInfo.Instance.OAUrl + model.DetailSql;
//url= System.Web.HttpUtility.UrlEncode(url);
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = hasControl && control is FrmMiniBlink ? (FrmMiniBlink)control : new FrmMiniBlink();
webView.IsDownVerify = true;
webView.Dock = DockStyle.Fill;
webView.Tag = model;
page.Tag = webView;
page.Controls.Add(webView);
webView.LoadUrl(ReplaceHelper.ReplaceUserInfo(url));
}
else
{
FrmWebBrowser webView = hasControl && control is FrmWebBrowser ? (FrmWebBrowser)control : new FrmWebBrowser();
webView.Dock = DockStyle.Fill;
webView.Tag = model;
page.Tag = webView;
page.Controls.Add(webView);
webView.FrmLoad(ReplaceHelper.ReplaceUserInfo(url));
}
}
else if (model.IsWebView2)
{
// 加载网页
string url = model.DetailSql.StartsWith("http") ? model.DetailSql : SystemInfo.Instance.OAUrl + model.DetailSql;
//url= System.Web.HttpUtility.UrlEncode(url);
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = hasControl && control is FrmMiniBlink ? (FrmMiniBlink)control : new FrmMiniBlink();
webView.Dock = DockStyle.Fill;
webView.Tag = model;
page.Tag = webView;
page.Controls.Add(webView);
webView.LoadUrl(ReplaceHelper.ReplaceUserInfo(url));
}
else
{
FrmWebBrowser2 webView = hasControl && control is FrmWebBrowser2 ? (FrmWebBrowser2)control : new FrmWebBrowser2();
webView.Dock = DockStyle.Fill;
webView.Tag = model;
page.Tag = webView;
page.Controls.Add(webView);
webView.FrmLoad(ReplaceHelper.ReplaceUserInfo(url));
}
}
else if (model.IsWebView3)
{
// 加载网页
string url = model.DetailSql.StartsWith("http") ? model.DetailSql : SystemInfo.Instance.OAUrl + model.DetailSql;
//url= System.Web.HttpUtility.UrlEncode(url);
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = hasControl && control is FrmMiniBlink ? (FrmMiniBlink)control : new FrmMiniBlink();
webView.AllowDownload = false;
webView.Dock = DockStyle.Fill;
webView.Tag = model;
page.Tag = webView;
page.Controls.Add(webView);
webView.LoadUrl(ReplaceHelper.ReplaceUserInfo(url));
}
else
{
FrmWebBrowser2 webView = hasControl && control is FrmWebBrowser2 ? (FrmWebBrowser2)control : new FrmWebBrowser2();
webView.Dock = DockStyle.Fill;
webView.Tag = model;
webView.AllowDownload = false;
page.Tag = webView;
page.Controls.Add(webView);
webView.FrmLoad(ReplaceHelper.ReplaceUserInfo(url));
}
}
else if (model.IsAddPanel && isGridmerge)
{
// 加载添加界面
ModulePanelEx modulePanel = hasControl && control is ModulePanelEx ? (ModulePanelEx)control : new ModulePanelEx();
modulePanel.Dock = DockStyle.Fill;
if (!dataCaches.GetValue(modulePanel, "BasePrimaryKey", out string primaryKey))
{
primaryKey = BaseImpl.GetBasePrimaryKey(this.Model.ModuleCode);
}
modulePanel.PrimaryKey = primaryKey;
if (!dataCaches.GetValue(modulePanel, "SystemDllRow", out DataRow systemRow))
{
systemRow = MainImpl.GetSystemdllTab(this.Model.ModuleCode);
}
modulePanel.InitializeControl(new ModuleModel(systemRow), this.Model);
//modulePanel.OnAddRecordCallBack += new EventHandler(OnAddRecordCallBack);
//modulePanel.OnCloseCallback += new EventHandler(OnAddRecordCallBack);
modulePanel.OperatePanelControlObj.Visible = false;
modulePanel.SpeciesPanelControlObj.Visible = false;
modulePanel.Tag = model;
page.Tag = modulePanel;
page.Controls.Add(modulePanel);
}
else if (model.IsDetailView)
{
ModuleGridDetailEx DetailEx = hasControl && control is ModuleGridDetailEx ? (ModuleGridDetailEx)control : new ModuleGridDetailEx();
DetailEx.Dock = DockStyle.Fill;
if (!dataCaches.GetValue(DetailEx, "DynamicModel", out DynamicModel dyncModel))
{
dyncModel = new DynamicModuleModel(new string[] { model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, this.Model.Privilege, model.UnionModule, "0" });
}
if (!dataCaches.GetValue(DetailEx, "SystemDllRow", out DataRow moduleInformation))
{
moduleInformation = MainImpl.GetSystemdllTab(model.UnionModule);
}
if (moduleInformation == null)
{
MessageUtil.Show("没有找到编号为" + model.UnionModule + "的模块信息");
return;
}
if (!dataCaches.GetValue(DetailEx, "SysModel", out model.SystemModel))
{
model.SystemModel = new ModuleModel(moduleInformation);
}
if (!dataCaches.GetValue(DetailEx, "Details", out List<GridDetailModel> details))
{
details = GetDetails(model.SystemModel.ModeCode);//底部多标签表格数据
}
DetailEx.GridDetailList = details;
DetailEx.IsDragDetail = IsDragDetail;
DetailEx.TcButtom.OnDetailViewDoubleClickCallBack += OnDetailGridViewDoubleClick;
DetailEx.TcButtom.OnDragCompleteCallback += OnDragGridCompleted;
DetailEx.InitializeControl(model.SystemModel, dyncModel);//初始化控件
if (!Model.DataCaches.GetValue(DetailEx, "BaseGridRightMenus", out DataTable rightDt))
{
rightDt = rightDt = BaseModuleImpl.GetBaseGridRightMenus(model.UnionModule, ModuleType.MrpClickBtn);
}
if ((rightDt != null && rightDt.Rows.Count > 0) || this.isMrpDetail)
{
this.isMrpDetail = true;
//gridEx.VisibleMrpSearchPanel = true;
}
if (IsDragDetail && this.ParentGridEx != null && model.IsDrag)
{
// 拖拽模式,绑定拖拽对象
//GridDragGrid dragGrid = new GridDragGrid(DetailEx.ModuleGridObj.GridControlObj.GridView, this.ParentGridEx.GridView);
//dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnDragGridCompleted);
}
if (this.MrpParentGridEx != null && model.IsMrpDrag)//mrp拖拽
{
GridDragGrid dragGrid = new GridDragGrid(this.MrpParentGridEx.GridView, DetailEx.ModuleGridObj.GridControlObj.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnMrpDragGridCompleted);
}
if (this.MrpDetailGridEx != null && model.IsMrpDrag)//mrp拖拽
{
GridDragGrid dragGrid = new GridDragGrid(this.MrpDetailGridEx.GridView, DetailEx.ModuleGridObj.GridControlObj.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnMrpDragGridCompleted);
}
if (this.isMrpDetail && this.OnMrpBtnClickCallback != null)//当前为mrp模块
{
DetailEx.ModuleGridObj.RightGridCallBack += this.OnMrpBtnClickCallback;
}
if (model.MrpConditionTab)
{
this.ReplaceControlEx = DetailEx.ModuleGridObj.GridControlObj;
}
DetailEx.ModuleGridObj.VisibleSearchPanel = Model.IsDetailSearch || model.DetailSearch;
DetailEx.ModuleGridObj.GridControlObj.Tag = model;
page.Tag = DetailEx.ModuleGridObj.GridControlObj;
page.Controls.Add(DetailEx);
}
else
{
if (model.IsReadOnly && isMeage.Count() == 1)
{
PanelControl plBottom = new PanelControl();
plBottom.Dock = DockStyle.Bottom;
plBottom.Visible = false;
PanelControl plMain = new PanelControl();
plMain.Dock = DockStyle.Fill;
GridControlEx gridEx = null;
if (model.AutoMultiHeader == 1)
{
gridEx = hasControl && control is BandedGridControlEx ? (BandedGridControlEx)control : new BandedGridControlEx();
}
else
{
gridEx = hasControl && control is GridControlEx ? (GridControlEx)control : new GridControlEx();
}
gridEx.Dock = DockStyle.Fill;
gridEx.Tag = model;
gridEx.Parent = plMain;
gridEx.Model = this.Model;
if (!dataCaches.GetValue(model, "GridColumns", out DataTable dtGridColumns))
{
dtGridColumns = model.GridColumns;
}
gridEx.SetReadOnlyColumns(dtGridColumns, model.GridCustomColumnKey);
//gridEx.SetGridRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, OnGridViewRightCallBack);
//gridEx.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(model.FormKey));
if (!dataCaches.GetValue(gridEx, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus))
{
dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus(model.FormKey);
}
if (!dataCaches.GetValue(gridEx, "BaseGridRowColors", out DataTable dtBaseGridRowColors))
{
dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors(model.FormKey);
}
gridEx.SetGridRightMenus(dtBaseGridRightMenus, this.Model, OnGridViewRightCallBack);
gridEx.SetGridRowColors(dtBaseGridRowColors);
if (model.IsCheck == 1)//加载复选框
{
GridDragGrid.GridAddCheckBox(gridEx.GridView);
}
if (model.LoadFilter)//加载筛选行
{
gridEx.GridView.OptionsView.ShowAutoFilterRow = true;
}
if (IsDragDetail && this.ParentGridEx != null && model.IsDrag)
{
// 拖拽模式,绑定拖拽对象
GridDragGrid dragGrid = new GridDragGrid(gridEx.GridView, this.ParentGridEx.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnDragGridCompleted);
}
if (this.MrpParentGridEx != null && model.IsMrpDrag)//mrp拖拽
{
GridDragGrid dragGrid = new GridDragGrid(this.MrpParentGridEx.GridView, gridEx.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnMrpDragGridCompleted);
}
if (this.MrpDetailGridEx != null && model.IsMrpDrag)//mrp拖拽
{
GridDragGrid dragGrid = new GridDragGrid(this.MrpDetailGridEx.GridView, gridEx.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnMrpDragGridCompleted);
}
if (model.MrpConditionTab)
{
this.ReplaceControlEx = gridEx;
}
// 加载配置查询条件
if (Model != null && Model.IsDetailSearch)
{
plBottom.Visible = true;
MyControl searchObj = new MyControl(model.DetailSql, gridEx);
if (!dataCaches.GetValue(gridEx, "CustomQueryFields", out DataTable dtCustomQueryFields))
{
dtCustomQueryFields = BaseModuleImpl.GetCustomQueryFields(model.FormKey);
}
plBottom.Height = searchObj.InitSearchControl(dtCustomQueryFields, plBottom);
}
page.Tag = gridEx;
page.Controls.AddRange(new PanelControl[] { plBottom, plMain });
}
else if (isMeage.Count() > 1 && isGridmerge)
{
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;
page.Tag = tabMultipledetails;
page.Controls.Add(tabMultipledetails);
}
else
{
ModuleGridEx gridEx = hasControl && control is ModuleGridEx ? (ModuleGridEx)control : new ModuleGridEx();
if (!dataCaches.GetValue(gridEx, "DynamicModel", out DynamicModel dyncModel))
{
dyncModel = new DynamicModuleModel(new string[] { model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, this.Model.Privilege, model.UnionModule, "0" });
}
if (!dataCaches.GetValue(gridEx, "SystemDllRow", out DataRow moduleInformation))
{
moduleInformation = MainImpl.GetSystemdllTab(model.UnionModule);
}
if (moduleInformation == null)
{
MessageUtil.Show("没有找到编号为" + model.UnionModule + "的模块信息");
return;
}
if (!dataCaches.GetValue(gridEx, "SysModel", out model.SystemModel))
{
model.SystemModel = new ModuleModel(moduleInformation);
}
if (Model != null)
{
if (!dataCaches.GetValue(gridEx, "ParentPrimaryKey", out string primaryKey))
{
primaryKey = BaseImpl.GetBasePrimaryKey(Model.ModuleCode);
}
model.SystemModel.ParmaryKey = primaryKey;
}
gridEx.OnSaveGridCallBack += OnDetailSaveGridCallBack;
gridEx.DetailRightGridCallBack += OnDetailRightCallback;
gridEx.Name = "gridEx";
gridEx.IsDetail = true;
gridEx.Dock = DockStyle.Fill;
gridEx.OperShortMode = Model.IsDetailSearch; // 不显示简短模式
gridEx.VisibleSearchPanel = Model.IsDetailSearch || model.DetailSearch;
if (!dataCaches.GetValue(gridEx, "UnionBaseGridRightMenus", out DataTable rightDt))
{
rightDt = BaseModuleImpl.GetBaseGridRightMenus(model.UnionModule, ModuleType.MrpClickBtn);
}
if ((rightDt != null && rightDt.Rows.Count > 0) || this.isMrpDetail)
{
this.isMrpDetail = true;
gridEx.VisibleMrpSearchPanel = true;
}
gridEx.MrpClickMenus = rightDt;
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.IsCheck == 1)//加载复选框
{
GridDragGrid.GridAddCheckBox(gridEx.GridControlObj.GridView);
//判断父表格是否是复选框
if (model.RecordDetailsCheckbox && ParentGridEx != null && ParentGridEx.GridView.OptionsSelection.MultiSelect == true)
{
gridEx.TagName = model.DetailName;
gridEx.GridControlObj.GridView.SelectionChanged += GridView_SelectionChanged;
}
}
if (model.LoadFilter)//加载筛选行
{
gridEx.GridControlObj.GridView.OptionsView.ShowAutoFilterRow = true;
}
if (this.ParentGridEx != null && model.IsDrag)//IsDragDetail &&
{
gridEx.GridControlObj.GridView.DoubleClick += OnDetailGridViewDoubleClick;
// 拖拽模式,绑定拖拽对象
if (model.IsDrag)
{
GridDragGrid dragGrid = new GridDragGrid(gridEx.GridControlObj.GridView, this.ParentGridEx.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnDragGridCompleted);
}
}
if (this.MrpParentGridEx != null && model.IsMrpDrag)//mrp拖拽
{
GridDragGrid dragGrid = new GridDragGrid(this.MrpParentGridEx.GridView, gridEx.GridControlObj.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnMrpDragGridCompleted);
}
if (this.MrpDetailGridEx != null && model.IsMrpDrag)//mrp拖拽
{
GridDragGrid dragGrid = new GridDragGrid(this.MrpDetailGridEx.GridView, gridEx.GridControlObj.GridView);
dragGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnMrpDragGridCompleted);
}
if (this.isMrpDetail && this.OnMrpBtnClickCallback != null)//当前为mrp模块
{
gridEx.RightGridCallBack += this.OnMrpBtnClickCallback;
}
if (model.MrpConditionTab)
{
this.ReplaceControlEx = gridEx.GridControlObj;
}
if (model.AutoRefresh && !_UnRefresh && isGridmerge)
gridEx.SearchObj.SearchGrid();
page.Tag = gridEx.GridControlObj;
page.Controls.Add(gridEx);
}
}
this.xtc_container.TabPages.Add(page);
DetailTabPageModel detailTabPageModel = new DetailTabPageModel();
detailTabPageModel.TabPageIndex = this._gridDetail.IndexOf(model);
detailTabPageModel.DetailTabPage = page;
detailTabPageModel.DetailModel = model;
if (!string.IsNullOrEmpty(model.ParentModuleCode))
{
string ParentModuleCode = model.ParentModuleCode.ToLower();
if (this.DetailTabPagesDic.ContainsKey(ParentModuleCode))
{
List<DetailTabPageModel> detailTabPageModels = this.DetailTabPagesDic[ParentModuleCode];
detailTabPageModels.Add(detailTabPageModel);
}
else
{
List<DetailTabPageModel> detailTabPageModels = new List<DetailTabPageModel>();
detailTabPageModels.Add(detailTabPageModel);
this.DetailTabPagesDic.Add(ParentModuleCode, detailTabPageModels);
}
}
}
}
/// <summary>
/// <para>说明:并行分割条位置变化事件</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2020-08-24</para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
void OnSplitterPositionChanged(object sender, EventArgs e)
{
try
{
SplitContainerControl splitContainerControl = sender as SplitContainerControl;
if (splitContainerControl.Parent is XtraTabPage tabPage)
{
GridDetailModel model = ResolveModel(tabPage);
if (model != null)
{
//GridDetailModel model = splitContainerControl.Panel1.Controls[0].Tag as GridDetailModel;
IniHelper.Write(string.Format("base_TabPageMain_{0}", model.Id), splitContainerControl.SplitterPosition + "");
}
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
}
/// <summary>
/// 创建公用的页签显示
/// </summary>
/// <param name="model"></param>
/// <param name="dataCaches"></param>
/// <param name="isGridmerge"></param>
/// <returns></returns>
private System.Windows.Forms.Control CreateDetailControl(System.Windows.Forms.Control parentControl, GridDetailModel model, Dictionary<object, Hashtable> dataCaches, bool isGridmerge = true, GridControlEx leftGridControlEx = null, bool hasParentPrimaryKey = false, string parentPrimaryKey = null)
{
GridDetailModel[] isMeage = _gridDetail.Cast<GridDetailModel>().Where(x => x.DetailName.Equals(model.DetailName)).ToArray();
// ① 取缓存的已生成控件
object control = PageControlsDic.ContainsKey(model) ? PageControlsDic[model] : null;
bool hasControl = control != null;
GridControlEx currentParentGridEx = this.ParentGridEx;
if (leftGridControlEx != null)
{
currentParentGridEx = leftGridControlEx;
}
/* ───── 1. 图表 ───────────────────────────────────────── */
if (model.IsChart)
{
ChartControlEx chartEx = hasControl && control is ChartControlEx
? (ChartControlEx)control
: new ChartControlEx();
chartEx.Dock = DockStyle.Fill;
chartEx.transverseHistogram = model.transverseHistogram;
if (!dataCaches.GetValue(chartEx, "ChartParams", out DataTable dtChartParams))
dtChartParams = BaseModuleImpl.GetChartParams(model.FormKey);
if (!dataCaches.GetValue(chartEx, "ChartRightMenus", out DataTable dtBaseGridRightMenus))
dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus(model.FormKey);
chartEx.SetCharts(dtChartParams);
chartEx.SetChartRightMenus(dtBaseGridRightMenus, this.Model, OnGridViewRightCallBack);
chartEx.Tag = model;
parentControl.Tag = chartEx;
return chartEx;
}
/* ───── 2. Excel ──────────────────────────────────────── */
else if (model.IsExcel)
{
ExcelControlEx excelEx = hasControl && control is ExcelControlEx
? (ExcelControlEx)control
: new ExcelControlEx();
excelEx.Dock = DockStyle.Fill;
excelEx.Tag = model;
parentControl.Tag = excelEx;
return excelEx;
}
/* ───── 3. WebView 系列 ───────────────────────────────── */
else if (model.IsWebView || model.IsWebView2 || model.IsWebView3)
{
string url = model.DetailSql.StartsWith("http")
? model.DetailSql
: SystemInfo.Instance.OAUrl + model.DetailSql;
url = ReplaceHelper.ReplaceUserInfo(url);
bool forbidDownload = model.IsWebView3;
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = hasControl && control is FrmMiniBlink
? (FrmMiniBlink)control
: new FrmMiniBlink();
webView.Dock = DockStyle.Fill;
webView.AllowDownload = !forbidDownload;
webView.IsDownVerify = model.IsWebView;
webView.Tag = model;
webView.LoadUrl(url);
return webView;
}
else
{
if (model.IsWebView2 || model.IsWebView3)
{
FrmWebBrowser2 webView = hasControl && control is FrmWebBrowser2
? (FrmWebBrowser2)control
: new FrmWebBrowser2();
webView.Dock = DockStyle.Fill;
webView.AllowDownload = !forbidDownload;
webView.Tag = model;
parentControl.Tag = webView;
webView.FrmLoad(ReplaceHelper.ReplaceUserInfo(url));
return webView;
}
else
{
FrmWebBrowser webView = hasControl && control is FrmWebBrowser
? (FrmWebBrowser)control
: new FrmWebBrowser();
webView.Dock = DockStyle.Fill;
webView.Tag = model;
parentControl.Tag = webView;
webView.FrmLoad(ReplaceHelper.ReplaceUserInfo(url));
return webView;
}
}
}
/* ───── AddPanel ───────────────────────────────────── */
else 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;
parentControl.Tag = frmProductSched;
frmProductSched.InitializeControl(mainModel);
frmProductSched.DataModel.TopSearchObj.ButtonObj.Visible = false;
return frmProductSched;
}
/* ───── 4. AddPanel ───────────────────────────────────── */
else if (model.IsAddPanel && isGridmerge)
{
ModulePanelEx modulePanel = hasControl && control is ModulePanelEx
? (ModulePanelEx)control
: new ModulePanelEx();
modulePanel.Dock = DockStyle.Fill;
if (!dataCaches.GetValue(modulePanel, "BasePrimaryKey", out string primaryKey))
primaryKey = BaseImpl.GetBasePrimaryKey(this.Model.ModuleCode);
modulePanel.PrimaryKey = primaryKey;
if (!dataCaches.GetValue(modulePanel, "SystemDllRow", out DataRow systemRow))
systemRow = MainImpl.GetSystemdllTab(this.Model.ModuleCode);
modulePanel.InitializeControl(new ModuleModel(systemRow), this.Model);
modulePanel.OperatePanelControlObj.Visible = false;
modulePanel.SpeciesPanelControlObj.Visible = false;
modulePanel.Tag = model;
parentControl.Tag = modulePanel;
return modulePanel;
}
/* ───── 5. DetailView ─────────────────────────────────── */
else if (model.IsDetailView)
{
ModuleGridDetailEx detailEx = hasControl && control is ModuleGridDetailEx
? (ModuleGridDetailEx)control
: new ModuleGridDetailEx();
detailEx.Dock = DockStyle.Fill;
// DynamicModel
if (!dataCaches.GetValue(detailEx, "DynamicModel", out DynamicModel dyncModel))
dyncModel = new DynamicModuleModel(new[]
{ model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName,
this.Model.Privilege, model.UnionModule, "0" });
// SysModel
if (!dataCaches.GetValue(detailEx, "SystemDllRow", out DataRow moduleRow))
moduleRow = MainImpl.GetSystemdllTab(model.UnionModule);
if (moduleRow == null)
{
MessageUtil.Show($"没有找到编号为 {model.UnionModule} 的模块信息");
return new Panel();
}
if (!dataCaches.GetValue(detailEx, "SysModel", out model.SystemModel))
model.SystemModel = new ModuleModel(moduleRow);
if (model.SystemModel.GridObjIsCheck == 1)//主表加载复选框
{
GridDragGrid.GridAddCheckBox(detailEx.ModuleGridObj.GridControlObj.GridView);
}
// 子明细集合
if (!dataCaches.GetValue(detailEx, "Details", out List<GridDetailModel> details))
details = GetDetails(model.SystemModel.ModeCode);
detailEx.GridDetailList = details;
detailEx.IsDragDetail = IsDragDetail;
detailEx.TcButtom.OnDetailViewDoubleClickCallBack += OnDetailGridViewDoubleClick;
detailEx.TcButtom.OnDragCompleteCallback += OnDragGridCompleted;
detailEx.InitializeControl(model.SystemModel, dyncModel);
if (!Model.DataCaches.GetValue(detailEx, "BaseGridRightMenus", out DataTable rightDt))
rightDt = BaseModuleImpl.GetBaseGridRightMenus(model.UnionModule, ModuleType.MrpClickBtn);
if ((rightDt?.Rows.Count > 0) || isMrpDetail) isMrpDetail = true;
if (MrpParentGridEx != null && model.IsMrpDrag)
{
var dg = new GridDragGrid(MrpParentGridEx.GridView, detailEx.ModuleGridObj.GridControlObj.GridView);
dg.OnDragComplete += OnMrpDragGridCompleted;
}
if (MrpDetailGridEx != null && model.IsMrpDrag)
{
var dg = new GridDragGrid(MrpDetailGridEx.GridView, detailEx.ModuleGridObj.GridControlObj.GridView);
dg.OnDragComplete += OnMrpDragGridCompleted;
}
if (isMrpDetail && OnMrpBtnClickCallback != null)
detailEx.ModuleGridObj.RightGridCallBack += OnMrpBtnClickCallback;
if (model.MrpConditionTab) ReplaceControlEx = detailEx.ModuleGridObj.GridControlObj;
detailEx.ModuleGridObj.VisibleSearchPanel = Model.IsDetailSearch || model.DetailSearch;
detailEx.ModuleGridObj.GridControlObj.Tag = model;
parentControl.Tag = detailEx.ModuleGridObj.GridControlObj;
return detailEx;
}
/* ───── 6. 只读网格(单明细) ───────────────────────────── */
else if (model.IsReadOnly && isMeage.Count() == 1)
{
// 外层容器
Panel parent = new Panel { Dock = DockStyle.Fill };
PanelControl plBottom = new PanelControl { Dock = DockStyle.Bottom, Visible = false };
PanelControl plMain = new PanelControl { Dock = DockStyle.Fill };
GridControlEx gridEx;
if (model.AutoMultiHeader == 1)
gridEx = hasControl && control is BandedGridControlEx
? (BandedGridControlEx)control
: new BandedGridControlEx();
else
gridEx = hasControl && control is GridControlEx
? (GridControlEx)control
: new GridControlEx();
gridEx.Dock = DockStyle.Fill;
gridEx.Model = this.Model;
gridEx.Tag = model;
if (!dataCaches.GetValue(model, "GridColumns", out DataTable dtGridColumns))
dtGridColumns = model.GridColumns;
gridEx.SetReadOnlyColumns(dtGridColumns, model.GridCustomColumnKey);
if (!dataCaches.GetValue(gridEx, "BaseGridRightMenus", out DataTable dtRightMenu))
dtRightMenu = BaseModuleImpl.GetBaseGridRightMenus(model.FormKey);
if (!dataCaches.GetValue(gridEx, "BaseGridRowColors", out DataTable dtRowColor))
dtRowColor = BaseModuleImpl.GetBaseGridRowColors(model.FormKey);
gridEx.SetGridRightMenus(dtRightMenu, this.Model, OnGridViewRightCallBack);
gridEx.SetGridRowColors(dtRowColor);
if (model.IsCheck == 1) GridDragGrid.GridAddCheckBox(gridEx.GridView);
if (model.LoadFilter) gridEx.GridView.OptionsView.ShowAutoFilterRow = true;
// 拖拽
if (IsDragDetail && currentParentGridEx != null && model.IsDrag)
{
var dg = new GridDragGrid(gridEx.GridView, currentParentGridEx.GridView);
dg.OnDragComplete += OnDragGridCompleted;
}
if (MrpParentGridEx != null && model.IsMrpDrag)
{
var dg = new GridDragGrid(MrpParentGridEx.GridView, gridEx.GridView);
dg.OnDragComplete += OnMrpDragGridCompleted;
}
if (MrpDetailGridEx != null && model.IsMrpDrag)
{
var dg = new GridDragGrid(MrpDetailGridEx.GridView, gridEx.GridView);
dg.OnDragComplete += OnMrpDragGridCompleted;
}
if (model.MrpConditionTab) ReplaceControlEx = gridEx;
// 查询面板
if (Model != null && Model.IsDetailSearch)
{
plBottom.Visible = true;
MyControl searchObj = new MyControl(model.DetailSql, gridEx);
if (!dataCaches.GetValue(gridEx, "CustomQueryFields", out DataTable dtCustomQuery))
dtCustomQuery = BaseModuleImpl.GetCustomQueryFields(model.FormKey);
plBottom.Height = searchObj.InitSearchControl(dtCustomQuery, plBottom);
}
plMain.Controls.Add(gridEx);
parent.Controls.Add(plMain);
parent.Controls.Add(plBottom);
parentControl.Tag = gridEx;
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 = currentParentGridEx;
tabMultipledetails.ParentControlEx = this.ParentControlEx;
tabMultipledetails.IsDragDetail = this.IsDragDetail;
tabMultipledetails.Model = this.Model;
tabMultipledetails.OnSaveGridCallBack += OnDetailSaveGridCallBack;
tabMultipledetails.DetailRightGridCallBack += OnDetailRightCallback;
tabMultipledetails.BillDetailRightGridCallBack += BillDetailRightGridCallBack;
tabMultipledetails.DrgaParentPrimaryKey = this.DrgaParentPrimaryKey;
tabMultipledetails.InitTabPages(isMeage);
tabMultipledetails.Dock = DockStyle.Fill;
tabMultipledetails.Tag = model;
parentControl.Tag = tabMultipledetails;
return tabMultipledetails;
}
/* ───── 7. 普通 ModuleGridEx 明细 ──────────────────────── */
else
{
ModuleGridEx gridEx = hasControl && control is ModuleGridEx
? (ModuleGridEx)control
: new ModuleGridEx();
if (!dataCaches.GetValue(gridEx, "DynamicModel", out DynamicModel dyncModel))
dyncModel = new DynamicModuleModel(new[]
{ model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName,
this.Model.Privilege, model.UnionModule, "0" });
if (!dataCaches.GetValue(gridEx, "SystemDllRow", out DataRow moduleRow))
moduleRow = MainImpl.GetSystemdllTab(model.UnionModule);
if (moduleRow == null)
{
MessageUtil.Show($"没有找到编号为 {model.UnionModule} 的模块信息");
return new Panel();
}
if (!dataCaches.GetValue(gridEx, "SysModel", out model.SystemModel))
model.SystemModel = new ModuleModel(moduleRow);
if (Model != null)
{
string primaryKey = parentPrimaryKey;
if (!hasParentPrimaryKey && !dataCaches.GetValue(gridEx, "ParentPrimaryKey", out primaryKey))
{
primaryKey = BaseImpl.GetBasePrimaryKey(Model.ModuleCode);
}
model.SystemModel.ParmaryKey = primaryKey;
}
gridEx.OnSaveGridCallBack += OnDetailSaveGridCallBack;
gridEx.DetailRightGridCallBack += OnDetailRightCallback;
if(model.BottomRefreshMain) gridEx.RightGridCallBack += BillDetailRightGridCallBack;
gridEx.Name = "gridEx";
gridEx.IsDetail = true;
gridEx.Dock = DockStyle.Fill;
gridEx.OperShortMode = Model.IsDetailSearch;
gridEx.VisibleSearchPanel = Model.IsDetailSearch || model.DetailSearch;
if (!dataCaches.GetValue(gridEx, "UnionBaseGridRightMenus", out DataTable rightDt))
rightDt = BaseModuleImpl.GetBaseGridRightMenus(model.UnionModule, ModuleType.MrpClickBtn);
if ((rightDt?.Rows.Count > 0) || isMrpDetail)
{
isMrpDetail = true;
gridEx.VisibleMrpSearchPanel = true;
}
gridEx.MrpClickMenus = rightDt;
gridEx.VisibleOperPanel = !model.IsReadOnly;
if (model.HideBottomPanel|| model.Library.Equals("Lskj.Report.dll", StringComparison.OrdinalIgnoreCase))
{
gridEx.VisibleOperPanel = false;
dyncModel = new DynamicReportModel(new[]
{ model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName,
this.Model.Privilege, model.UnionModule, "0" });
}
gridEx.InitializeControl(model.SystemModel, dyncModel);
gridEx.GridControlObj.Tag = model;
gridEx.ParentControlEx = ParentControlEx;
gridEx.ParentGridEx = currentParentGridEx;
gridEx.ParentKeyField = string.IsNullOrEmpty(model.UnionParentField)
? model.SystemModel.ParmaryKey
: model.UnionParentField;
gridEx.DetailKeyField = model.UnionValue;
gridEx.GridControlObj.ParentControl = gridEx.SearchObj;
if (gridEx.GridControlObj.CustomGroupBandEx != null)
{
gridEx.GridControlObj.CustomGroupBandEx.BandedView.LeftCoordChanged += OnBandedViewLeftCoordChanged;
}
if (gridEx.GridControlObj.CustomGroupTreeBandEx != null)
{
gridEx.GridControlObj.CustomGroupTreeBandEx.TreeListObj.LeftCoordChanged += OnBandedViewLeftCoordChanged;
}
//gridEx.Tag = model;
if (model.IsCheck == 1)
{
GridDragGrid.GridAddCheckBox(gridEx.GridControlObj.GridView);
if (model.RecordDetailsCheckbox &&
currentParentGridEx?.GridView.OptionsSelection.MultiSelect == true)
{
gridEx.TagName = model.DetailName;
gridEx.GridControlObj.GridView.SelectionChanged += GridView_SelectionChanged;
}
}
if (model.LoadFilter)
gridEx.GridControlObj.GridView.OptionsView.ShowAutoFilterRow = true;
if (currentParentGridEx != null && model.IsDrag)
{
gridEx.GridControlObj.GridView.DoubleClick += OnDetailGridViewDoubleClick;
var dg = new GridDragGrid(gridEx.GridControlObj.GridView, currentParentGridEx.GridView);
dg.OnDragComplete += OnDragGridCompleted;
}
if (MrpParentGridEx != null && model.IsMrpDrag)
{
var dg = new GridDragGrid(MrpParentGridEx.GridView, gridEx.GridControlObj.GridView);
dg.OnDragComplete += OnMrpDragGridCompleted;
}
if (MrpDetailGridEx != null && model.IsMrpDrag)
{
var dg = new GridDragGrid(MrpDetailGridEx.GridView, gridEx.GridControlObj.GridView);
dg.OnDragComplete += OnMrpDragGridCompleted;
}
if (isMrpDetail && OnMrpBtnClickCallback != null)
gridEx.RightGridCallBack += OnMrpBtnClickCallback;
if (model.MrpConditionTab) ReplaceControlEx = gridEx.GridControlObj;
if (model.AutoRefresh && !_UnRefresh && isGridmerge)
gridEx.SearchObj.SearchGrid();
parentControl.Tag = gridEx.GridControlObj;
return gridEx;
}
}
/// <summary>
/// 主表和当前页签中表格配置了复选框时,记录当前页签表格的选中记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void GridView_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e)
{
DataRow FatherTableRow = this.ParentGridEx.GridView.GetFocusedDataRow();
if (FatherTableRow == null) return;
XtraTabPage RefreshPage = this.xtc_container.SelectedTabPage;
Object moduleObject = RefreshPage.Controls.Cast<Object>().FirstOrDefault();
if (moduleObject is ModuleGridEx)
{
ModuleGridEx moduleGridEx = moduleObject as ModuleGridEx;
DataRow[] rowArray = moduleGridEx.GridControlObj.GetViewFocusedDataRows();
string value = string.Empty;
foreach (DataRow item in rowArray)
{
value += item[moduleGridEx.ParmaryKey] + ",";
}
value = value.Trim(',');
GridDetailModel model = GetGridDetailModel(RefreshPage);
if (ParentControlEx.DetailSelection.ContainsKey(model.DetailName))
{
Dictionary<DataRow, string> dictionary = ParentControlEx.DetailSelection[model.DetailName];
if (dictionary.ContainsKey(FatherTableRow))
{
dictionary[FatherTableRow] = value;
}
else
{
dictionary.Add(FatherTableRow, value);
}
}
else
{
Dictionary<DataRow, string> dictionary = new Dictionary<DataRow, string>();
dictionary.Add(FatherTableRow, value);
ParentControlEx.DetailSelection.Add(model.DetailName, dictionary);
}
}
}
/// <summary>
/// 获取数据源缓存
/// </summary>
/// <param name="cachesDic"></param>
/// <param name="dynamicModel"></param>
/// <param name="isGridmerge"></param>
/// <param name="isAddPages"></param>
public void GetDataCaches(Dictionary<object, Hashtable> cachesDic, bool isGridmerge = true, bool isAddPages = false)
{
//获取通用数据
Task<DynamicModel> dynamicModelTask = cachesDic.GetTask<DynamicModel>(this, "DynamicModel");
Task<List<GridDetailModel>> detailsTask = cachesDic.GetTask<List<GridDetailModel>>(this, "Details");
DynamicModel dynamicModel = dynamicModelTask.Result;
List<GridDetailModel> details = detailsTask.Result;
// 所有子模块使用同一个父模块主键。优先复用外部主表的查询任务,其他入口只补查一次。
Task<string> parentPrimaryKeyTask = cachesDic.GetTask<string>(this, "ParentPrimaryKey");
if (parentPrimaryKeyTask == null)
{
parentPrimaryKeyTask = cachesDic.AddTask(this, "ParentPrimaryKey", new Task<string>(() =>
{
return BaseImpl.GetBasePrimaryKey(dynamicModel.ModuleCode);
}));
}
string DetaiName = string.Empty;
PageControlsDic.Clear();
foreach (GridDetailModel model in details)
{
if (DetaiName.Equals(model.DetailName) && isGridmerge)
{
continue;
}
List<GridDetailModel> isMeage = details.Cast<GridDetailModel>().Where(x => x.DetailName.Equals(model.DetailName)).ToList();
if (model.IsChart)
{
ChartControlEx chartEx = new ChartControlEx();
Task<DataTable> chartParamsTask = cachesDic.AddTask(chartEx, "ChartParams", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetChartParams(model.FormKey);
}));
Task<DataTable> chartRightMenusTask = cachesDic.AddTask(chartEx, "ChartRightMenus", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetBaseGridRightMenus(model.FormKey);
}));
PageControlsDic.Add(model, chartEx);
}
else if (model.IsExcel)
{
ExcelControlEx excelEx = new ExcelControlEx();
PageControlsDic.Add(model, excelEx);
}
else if (model.IsWebView)
{
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = new FrmMiniBlink();
PageControlsDic.Add(model, webView);
}
else
{
FrmWebBrowser webView = new FrmWebBrowser();
PageControlsDic.Add(model, webView);
}
}
else if (model.IsWebView2)
{
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = new FrmMiniBlink();
PageControlsDic.Add(model, webView);
}
else
{
FrmWebBrowser2 webView = new FrmWebBrowser2();
PageControlsDic.Add(model, webView);
}
}
else if (model.IsWebView3)
{
if (SystemInfo.Instance.PrimitiveBrowser)
{
FrmMiniBlink webView = new FrmMiniBlink();
PageControlsDic.Add(model, webView);
}
else
{
FrmWebBrowser2 webView = new FrmWebBrowser2();
PageControlsDic.Add(model, webView);
}
}
else if (model.IsAddPanel && isGridmerge)
{
ModulePanelEx modulePanel = new ModulePanelEx();
Task<string> basePrimaryKeyTask = cachesDic.AddTask(modulePanel, "BasePrimaryKey", new Task<string>(() =>
{
return BaseImpl.GetBasePrimaryKey(dynamicModel.ModuleCode);
}));
Task<DataRow> systemdllTabTask = cachesDic.AddTask(modulePanel, "SystemDllRow", new Task<DataRow>(() =>
{
return MainImpl.GetSystemdllTab(dynamicModel.ModuleCode);
}));
modulePanel.GetDataCaches(cachesDic, new ModuleModel(systemdllTabTask.Result), dynamicModel);
PageControlsDic.Add(model, modulePanel);
}
else if (model.IsDetailView)
{
ModuleGridDetailEx DetailEx = new ModuleGridDetailEx();
Task<DynamicModel> detailViewDynamicModelTask = cachesDic.AddTask(DetailEx, "DynamicModel", new Task<DynamicModel>(() =>
{
DynamicModuleModel dyncModel = new DynamicModuleModel(new string[] { model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, dynamicModel.Privilege, model.UnionModule, "0" });
dyncModel.DataCaches = cachesDic;
return dyncModel;
}));
Task<string> basePrimaryKeyTask = cachesDic.AddTask(DetailEx, "BasePrimaryKey", new Task<string>(() =>
{
return BaseImpl.GetBasePrimaryKey(dynamicModel.ModuleCode);
}));
Task<DataRow> detailViewSystemDllRowTask = cachesDic.AddTask(DetailEx, "SystemDllRow", new Task<DataRow>(() =>
{
return MainImpl.GetSystemdllTab(model.UnionModule);
}));
if (detailViewSystemDllRowTask.Result == null)
{
return;
}
Task<ModuleModel> detailViewSystemModelTask = cachesDic.AddTask(DetailEx, "SysModel", new Task<ModuleModel>(() =>
{
return new ModuleModel(detailViewSystemDllRowTask.Result);
}));
Task<List<GridDetailModel>> detailViewDetailsTask = cachesDic.AddTask(DetailEx, "Details", new Task<List<GridDetailModel>>(() =>
{
return GetDetails(detailViewSystemModelTask.Result.ModeCode);//底部多标签表格数据
}));
Task<DataTable> baseGridRightMenusTask = cachesDic.AddTask(DetailEx, "BaseGridRightMenus", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetBaseGridRightMenus(model.UnionModule, ModuleType.MrpClickBtn);
}));
DetailEx.GetDataCaches(cachesDic);
PageControlsDic.Add(model, DetailEx);
}
else
{
if (model.IsReadOnly && isMeage.Count() == 1)
{
GridControlEx gridEx = model.AutoMultiHeader == 1 ? new BandedGridControlEx() : new GridControlEx();
Task<bool> hasExistsSettingTableTask = cachesDic.AddTask(gridEx, "HasExistsSettingTable", new Task<bool>(() =>
{
return BaseImpl.HasExistsTable(ResourceKeys.SettingTableName);
}));
Task<DataTable> setGridRightMenusTask = cachesDic.AddTask(gridEx, "RightMenuBtn", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetBaseGridRightMenus(dynamicModel.ModuleCode);
}));
Task<DataTable> sourceColumnByDatabaseTask = cachesDic.AddTask(gridEx, "CustomColumnByDatabase", new Task<DataTable>(() =>
{
string customColumKey = model.GridCustomColumnKey;
return gridEx.GridView.GetCustomColumnByDatabase(customColumKey);
}));
Task<DataTable> baseGridRightMenusTask = cachesDic.AddTask(gridEx, "BaseGridRightMenus", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetBaseGridRightMenus(model.FormKey);
}));
Task<DataTable> baseGridRowColorsTask = cachesDic.AddTask(gridEx, "BaseGridRowColors", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetBaseGridRowColors(model.FormKey);
}));
// 加载配置查询条件
if (dynamicModel != null && dynamicModel.IsDetailSearch)
{
Task<DataTable> customQueryFieldsTask = cachesDic.AddTask(gridEx, "CustomQueryFields", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetCustomQueryFields(model.FormKey);
}));
}
PageControlsDic.Add(model, gridEx);
}
else if (isMeage.Count() > 1 && isGridmerge)
{
DetaiName = model.DetailName;
TabMultipledetails tabMultipledetails = new TabMultipledetails();
PageControlsDic.Add(model, tabMultipledetails);
//tabMultipledetails.InitTabPages(isMeage);
}
else
{
ModuleGridEx gridEx = new ModuleGridEx();
Task<DynamicModel> gridExDynamicModelTask = cachesDic.AddTask(gridEx, "DynamicModel", new Task<DynamicModel>(() =>
{
DynamicModuleModel dyncModel = new DynamicModuleModel(new string[] { model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, dynamicModel.Privilege, model.UnionModule, "0" });
dyncModel.DataCaches = cachesDic;
return dyncModel;
}));
Task<DataRow> gridExSystemDllRowTask = cachesDic.AddTask(gridEx, "SystemDllRow", new Task<DataRow>(() =>
{
return MainImpl.GetSystemdllTab(model.UnionModule);
}));
Task<ModuleModel> gridExSystemModelTask = cachesDic.AddTask(gridEx, "SysModel", new Task<ModuleModel>(() =>
{
return new ModuleModel(gridExSystemDllRowTask.Result);
}));
if (dynamicModel != null)
{
cachesDic.AddTask(gridEx, "ParentPrimaryKey", parentPrimaryKeyTask);
}
Task<DataTable> baseGridRightMenusTask = cachesDic.AddTask(gridEx, "UnionBaseGridRightMenus", new Task<DataTable>(() =>
{
return BaseModuleImpl.GetBaseGridRightMenus(model.UnionModule, ModuleType.MrpClickBtn);
}));
gridEx.GetDataCaches(cachesDic);
if (model.AutoRefresh && !_UnRefresh && isGridmerge)
{
//gridEx.SearchObj.SearchGrid();
}
PageControlsDic.Add(model, gridEx);
}
}
}
}
/// <summary>
/// 页签大小改变时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnPageSizeChanged(object sender, EventArgs e)
{
XtraTabPage tabPage = (XtraTabPage)sender;
if (tabPage.Tag is FrmWebBrowser)
{
// 加载网页
FrmWebBrowser webView = tabPage.Tag as FrmWebBrowser;
}
else if (tabPage.Tag is FrmWebBrowser2)
{
// 加载网页
FrmWebBrowser2 webView = tabPage.Tag as FrmWebBrowser2;
}
}
/// <summary>
/// <para>说明:特殊情况绑定选项卡</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-04-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="gridDetail">The grid detail.</param>
/// <param name="parentValue">The parent value.</param>
public void InitTabPages(List<GridDetailModel> gridDetail, string parentValue)
{
this._gridDetail = gridDetail;
this.xtc_container.TabPages.Clear();
bool ProcessExists = (Lskj.Data.Caches.CacheSYSConfig.Instance().JudgeProcessExists() && SystemInfo.Instance.isExecload);
foreach (GridDetailModel model in this._gridDetail)
{
XtraTabPage page = new XtraTabPage();
page.Text = model.DetailName;
if (model.IsChart)
{
ChartControlEx chartEx = new ChartControlEx();
chartEx.Dock = DockStyle.Fill;
if (ProcessExists)
{
chartEx.SetCharts(Lskj.Data.Caches.CacheSYSConfig.Instance().GetCustomQueryFields());
chartEx.SetChartRightMenus(Lskj.Data.Caches.CacheSYSConfig.Instance().GetBaseGridRightMenus(), this.Model, OnGridViewRightCallBack);
}
else
{
chartEx.SetCharts(BaseModuleImpl.GetChartParams(model.FormKey));
chartEx.SetChartRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, OnGridViewRightCallBack);
}
chartEx.Tag = model;
page.Tag = chartEx;
page.Controls.Add(chartEx);
}
else if (model.IsExcel)
{
ExcelControlEx excelEx = new ExcelControlEx();
excelEx.Dock = DockStyle.Fill;
excelEx.Tag = model;
page.Tag = excelEx;
page.Controls.Add(excelEx);
}
else
{
if (model.IsReadOnly)
{
PanelControl plTop = new PanelControl();
plTop.Dock = DockStyle.Top;
PanelControl plMain = new PanelControl();
plMain.Dock = DockStyle.Fill;
GridControlEx gridEx = new GridControlEx();
gridEx.Dock = DockStyle.Fill;
gridEx.Tag = model;
gridEx.Parent = plMain;
gridEx.Model = this.Model;
gridEx.SetReadOnlyColumns(model.GridColumns, model.GridCustomColumnKey);
if (ProcessExists)
{
gridEx.SetGridRightMenus(Lskj.Data.Caches.CacheSYSConfig.Instance().GetBaseGridRightMenus(), this.Model, OnGridViewRightCallBack);
gridEx.SetGridRowColors(Lskj.Data.Caches.CacheSYSConfig.Instance().GetCustomColumnByDatabase());
}
else
{
gridEx.SetGridRightMenus(BaseModuleImpl.GetBaseGridRightMenus(model.FormKey), this.Model, OnGridViewRightCallBack);
gridEx.SetGridRowColors(BaseModuleImpl.GetBaseGridRowColors(model.FormKey));
}
// 加载配置查询条件
if (model.IsSearch)
{
MyControl searchObj = new MyControl(model.DetailSql, gridEx);
if (!string.IsNullOrEmpty(model.UnionValue) && !string.IsNullOrEmpty(parentValue))
searchObj.WhereCond = string.Format(" and {0}='{1}'", model.UnionValue, parentValue);
plTop.Height = searchObj.InitSearchControl(BaseModuleImpl.GetCustomQueryFields(model.SystemModel.CondKey), plTop);
}
page.Tag = gridEx;
page.Controls.AddRange(new PanelControl[] { plTop, plMain });
}
else
{
DynamicModel dyncModel = new DynamicModel(new string[] { model.DetailName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, this.Model.Privilege, model.UnionModule, "0" });
dyncModel.Params = Model.OtherParams();
//if (ProcessExists)
//{
// model.SystemModel = new ModuleModel(Lskj.Data.Caches.CacheSYSConfig.Instance().GetSystemdllTab());
//}
//else
//{
// model.SystemModel = new ModuleModel(MainImpl.GetSystemdllTab(model.UnionModule));
//}
DataRow moduleInformation = ProcessExists ? Lskj.Data.Caches.CacheSYSConfig.Instance().GetSystemdllTab() : MainImpl.GetSystemdllTab(model.UnionModule);
if (moduleInformation == null)
{
MessageUtil.Show("没有找到编号为" + model.UnionModule + "的模块信息");
return;
}
model.SystemModel = new ModuleModel(moduleInformation);
ModuleGridEx gridEx = new ModuleGridEx();
gridEx.Name = "gridEx";
gridEx.Dock = DockStyle.Fill;
gridEx.OperShortMode = false; // 不显示简短模式
gridEx.VisibleSearchPanel = model.IsSearch;
gridEx.VisibleOperPanel = true;
gridEx.ParentGridEx = this.ParentGridEx;
gridEx.ParentControlEx = this.ParentControlEx;
gridEx.ParentKeyField = string.IsNullOrEmpty(model.UnionParentField) ? model.UnionValue : model.UnionParentField;
gridEx.ParentKeyValue = parentValue;
gridEx.DetailKeyField = model.UnionValue;
gridEx.UnionKey = model.UnionValue;
gridEx.UnionValue = parentValue; //Model.ObjectId;
gridEx.InitializeControl(model.SystemModel, dyncModel);
gridEx.GridControlObj.Tag = model;
gridEx.ControlSql = ControlSql;
gridEx.GridControlObj.ParentControl = gridEx.SearchObj;
if (model.AutoRefresh)
gridEx.SearchObj.SearchGrid();
page.Tag = gridEx.GridControlObj;
page.Controls.Add(gridEx);
}
}
this.xtc_container.TabPages.Add(page);
}
}
/// <summary>
/// <para>说明:加载tab标签里得明细数据</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2018-09-28 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="RowCellClickEventArgs"/> instance containing the event data.</param>
protected void GridView_RowCellClick(object sender, RowCellClickEventArgs e)
{
try
{
WaitForm.ShowForm();
XtraTabPage tabPage = this.xtc_container.SelectedTabPage;
foreach (System.Windows.Forms.Control control in tabPage.Controls)
{
if (control is SplitContainer)
{
SplitContainer splitContainer = control as SplitContainer;
ModuleGridEx gcMain = splitContainer.Panel1.Tag as ModuleGridEx;
TabAddControl tabadd = splitContainer.Panel2.Tag as TabAddControl;
GridDetailModel model = tabadd.gridEx.Tag as GridDetailModel;
GridDetailModel model2 = tabadd.gridEx2.GridControlObj.Tag as GridDetailModel;
DataRow rowItem = gcMain.GridControlObj.GridView.GetFocusedDataRow();
this.ModuleGridObj = gcMain;
tabadd.PrimaryKey = this.ModuleGridObj.ParmaryKey;
if (rowItem != null && model != null)
{
string searchSql = this.GetSearchSql(model, rowItem);
tabadd.gridEx.LastSearchSql = searchSql;
tabadd.gridEx.SetGridViewDataSource(MainImpl.GetDataTableResult(tabadd.gridEx.LastSearchSql));
string searchSql2 = this.GetSearchSql(model2, rowItem);
tabadd.gridEx2.GridControlObj.LastSearchSql = searchSql2;
tabadd.gridEx2.SearchObj.SearchLastGrid();
}
}
}
}
catch (Exception ex)
{
LogHelper.Instance.WriteError(ex);
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
finally
{
WaitForm.HideForm();
}
}
/// <summary>
/// <para>说明:获取查询条件</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-22 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="model">The model.</param>
/// <param name="rowItem">The row item.</param>
/// <returns>System.String.</returns>
protected string GetSearchSql(GridDetailModel model, DataRow rowItem)
{
string fieldName = !string.IsNullOrEmpty(model.UnionParentField) && rowItem.Table.Columns.Contains(model.UnionParentField) ? model.UnionParentField : ModuleGridObj != null ? ModuleGridObj.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] + "");
}
return sqlValue;
}
/// <summary>
/// <para>说明:判断多标签里是否有明细表</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2019-12-19 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <returns>List&lt;GridDetailModel&gt;.</returns>
private List<GridDetailModel> GetDetails(string ModuleCode)
{
List<GridDetailModel> details = new List<GridDetailModel>();
DataTable table = BaseModuleImpl.GetBaseDetailPages(ModuleCode);
foreach (DataRow item in table.Rows)
{
DataTable gridColumns = ReportImpl.GetReportDetailColumns(ModuleCode, item["id"] + "");
details.Add(new GridDetailModel(item, gridColumns, GridCustomColumnStruct.BaseDetailGridView));
}
return details;
}
/// <summary>
/// <para>说明:获取TabPage绑定的实体对象</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-02-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="tabPage">The tab page.</param>
/// <returns>GridDetailModel.</returns>
public GridDetailModel GetGridDetailModel(XtraTabPage tabPage)
{
if (tabPage == null) return null;
if (tabPage.Tag is GridControlEx)
return (tabPage.Tag as GridControlEx).Tag as GridDetailModel;
if (tabPage.Tag is ChartControlEx)
return (tabPage.Tag as ChartControlEx).Tag as GridDetailModel;
if (tabPage.Tag is ModuleWebView)
return (tabPage.Tag as ModuleWebView).Tag as GridDetailModel;
if (tabPage.Tag is FrmWebBrowser)
return (tabPage.Tag as FrmWebBrowser).Tag as GridDetailModel;
if (tabPage.Tag is FrmWebBrowser2)
return (tabPage.Tag as FrmWebBrowser2).Tag as GridDetailModel;
if (tabPage.Tag is FrmMiniBlink)
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;
}
/// <summary>
/// <para>说明:获取选中TabPage绑定的实体对象</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-02-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <returns>GridDetailModel.</returns>
public GridDetailModel GetFocusTabPageGridDetailModel()
{
return this.GetGridDetailModel(this.xtc_container.SelectedTabPage);
}
/// <summary>
/// <para>说明:设置指定TabPage数据源</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-15 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="tabPage">The tab page.</param>
/// <param name="rowItem">The row item.</param>
public void SetGridDataSource(XtraTabPage tabPage, DataTable table, GridView view = null)
{
try
{
if (tabPage == null) return;
if (tabPage.Tag is GridControlEx)
{
this.SetGridViewTabPage(tabPage, table);
}
else if (tabPage.Tag is ChartControlEx)
{
this.SetChartViewTabPage(tabPage, table, view);
}
else if (tabPage.Tag is TabMultipledetails)
{
this.SetTabMultipledetailsTabPage(tabPage, table);
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
LogHelper.Instance.WriteError(ex);
}
}
public void SetGridDataSource(XtraTabPage tabPage, string sqlValue, GridView view = null)
{
try
{
if (tabPage == null) return;
DataTable table = MainImpl.GetDataTableResult(sqlValue);
if (tabPage.Tag is GridControlEx)
{
this.SetGridViewTabPage(tabPage, table);
}
else if (tabPage.Tag is ChartControlEx)
{
this.SetChartViewTabPage(tabPage, table, view);
}
else if (tabPage.Tag is FrmWebBrowser)
{
this.SetWebUrlTabPage(tabPage, sqlValue);
}
else if (tabPage.Tag is FrmWebBrowser2)
{
this.SetWebUrlTabPage2(tabPage, sqlValue);
}
else if (tabPage.Tag is FrmMiniBlink)
{
this.SetMiniBlinkWebUrlTabPage(tabPage, sqlValue);
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
LogHelper.Instance.WriteError(ex);
}
}
/// <summary>
/// <para>说明:设置选中TabPage数据源</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-02-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="table">The table.</param>
public void SetGridDataSource(DataTable table)
{
this.SetGridDataSource(this.xtc_container.SelectedTabPage, table);
}
/// <summary>
/// <para>说明:设置表格数据</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="tabPage">The tab page.</param>
/// <param name="gridControl">The grid control.</param>
protected void SetGridViewTabPage(XtraTabPage tabPage, DataTable table)
{
GridControlEx gridControl = tabPage.Tag as GridControlEx;
GridDetailModel model = gridControl.Tag as GridDetailModel;
int dataRowCount = 0;
gridControl.GridView.DoubleClick -= new EventHandler(OnGridCompleted);
if (gridControl is TreeGridControlEx)
{
if (gridControl is TreeBandedGridControlEx)
{
TreeBandedGridControlEx treeGridControlEx = gridControl as TreeBandedGridControlEx;
treeGridControlEx.SetGridViewDataSource(table, false);
dataRowCount = (treeGridControlEx.TreeListObj.DataSource as DataTable).Rows.Count;
}
else
{
TreeGridControlEx treeGridControlEx = gridControl as TreeGridControlEx;
treeGridControlEx.SetGridViewDataSource(table, false);
dataRowCount = (treeGridControlEx.TreeListObj.DataSource as DataTable).Rows.Count;
}
}
else
{
gridControl.SetGridViewDataSource(table);
dataRowCount = gridControl.GridView.DataRowCount;
}
//数据源为空时,主动触发右侧刷新
if (dataRowCount == 0)
{
RefreshRightTabAfterLeftBind(gridControl);
}
if (IsDragDetail && this.ParentGridEx != null && model.IsDrag)
{
gridControl.GridView.DoubleClick += new EventHandler(OnGridCompleted);
}
if (gridControl.CustomGroupBandEx != null)
{
tabPage.Text = model.DetailName + "(" + gridControl.CustomGroupBandEx.DataRowCount() + "条)";
}
else if (gridControl.CustomGroupTreeBandEx != null)
{
tabPage.Text = model.DetailName + "(" + gridControl.CustomGroupTreeBandEx.DataRowCount() + "条)";
}
else
{
tabPage.Text = model.DetailName + "(" + dataRowCount + ")";
}
//tabPage.Text = gridControl.CustomGroupBandEx != null ? model.DetailName + "(" + gridControl.CustomGroupBandEx.DataRowCount() + "条)" : model.DetailName + "(" + dataRowCount + ")";
tabPage.Appearance.Header.ForeColor = dataRowCount > 0 ? Color.Red : Color.FromArgb(0, 0, 0);
}
/// <summary>
/// <para>说明:设置左右结构的表格数据</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="tabPage">The tab page.</param>
/// <param name="gridControl">The grid control.</param>
protected void SetTabMultipledetailsTabPage(XtraTabPage tabPage, DataTable table)
{
TabMultipledetails tabMultipledetails = tabPage.Tag as TabMultipledetails;
GridControlEx grdExMain = (tabMultipledetails.SplitMain.Panel1.Tag as GridControlEx);
GridDetailModel MainModel = grdExMain.Tag as GridDetailModel;
grdExMain.SetGridViewDataSource(table);
GridControlEx grdExAdditional = (tabMultipledetails.SplitMain.Panel2.Tag as GridControlEx);
grdExAdditional.SetGridViewDataSource(table);
tabPage.Text = MainModel.DetailName + "(" + table.Rows.Count + ")";
tabPage.Appearance.Header.ForeColor = table.Rows.Count > 0 ? Color.Red : Color.FromArgb(0, 0, 0);
}
/// <summary>
/// <para>说明:设置图表数据</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="tabPage">The tab page.</param>
/// <param name="chartControl">The chart control.</param>
protected void SetChartViewTabPage(XtraTabPage tabPage, DataTable table, GridView view = null)
{
ChartControlEx chartEx = tabPage.Tag as ChartControlEx;
GridDetailModel model = chartEx.Tag as GridDetailModel;
chartEx.CreateChart(table, view);
}
/// <summary>
/// <para>说明:设置网页Url</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="tabPage">The tab page.</param>
/// <param name="chartControl">The chart control.</param>
protected void SetWebUrlTabPage(XtraTabPage tabPage, string Url)
{
FrmWebBrowser webBrowser = tabPage.Tag as FrmWebBrowser;
webBrowser.LoadUrl(Url);
}
protected void SetWebUrlTabPage2(XtraTabPage tabPage, string Url)
{
FrmWebBrowser2 webBrowser = tabPage.Tag as FrmWebBrowser2;
webBrowser.LoadUrl(Url);
}
protected void SetMiniBlinkWebUrlTabPage(XtraTabPage tabPage, string Url)
{
FrmMiniBlink webBrowser = tabPage.Tag as FrmMiniBlink;
webBrowser.LoadUrl(Url);
}
/// <summary>
/// <para>说明:</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-02-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
protected void OnGridViewRightCallBack(object sender, EventArgs e)
{
try
{
if (this.OnRightCallback != null)
this.OnRightCallback(sender, e);
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
}
/// <summary>
/// <para>说明:表格双击完成</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2019-08-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
protected void OnGridCompleted(object sender, EventArgs e)
{
try
{
XtraTabPage tabPage = this.xtc_container.SelectedTabPage;
GridControlEx ge = tabPage.Tag as GridControlEx;
DataRow[] rowItems = new DataRow[] { ge.GridView.GetFocusedDataRow() };
GridColumnCollection gridColumns = this.ParentGridEx.GridView.Columns;
DataTable table = this.ParentGridEx.gridControl.DataSource as DataTable;
foreach (DataRow rowItem in rowItems)
{
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);
}
}
/// <summary>
/// <para>说明:表格拖拽完成</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-14 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
protected void OnDragGridCompleted(object sender, GridDragGridArgs e)
{
if (e.GridViewSelectRows == null || e.GridViewSelectRows.Length == 0 || this.ParentGridEx == null) return;
try
{
if (OnDragCompleteCallback != null)
{
OnDragCompleteCallback(sender, e);
}
else
{
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);
}
}
/// <summary>
/// <para>说明:表格拖拽完成</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-14 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
protected void OnMrpDragGridCompleted(object sender, GridDragGridArgs e)
{
if (e.GridViewSelectRows == null || e.GridViewSelectRows.Length == 0 || this.MrpParentGridEx == null) return;
try
{
if (MessageUtil.Show(ResourceKeys.DragSelectRow, MessageBoxButtons.YesNo) == DialogResult.Yes)
{
GridColumnCollection gridColumns = e.TargetGridViewObj.Columns;
DataTable table = e.TargetGridViewObj.GridControl.DataSource as DataTable;
ModuleModel mrpMainModule = e.SourceGridViewObj.Tag as ModuleModel;
GridControlEx gridControlEx = e.TargetGridViewObj.GridControl.Parent.Parent as GridControlEx;
GridDetailModel gridDetailModel = gridControlEx.Tag as GridDetailModel;
//if (table == null)
//{
// gridControlEx.ParentControl.SearchGrid();
// table = e.TargetGridViewObj.GridControl.DataSource as DataTable;
//}
// 验证删除存储过程
string tipMsg = string.Empty;
int[] records = new int[e.GridViewSelectRows.Length];
string ParmaryKey = mrpMainModule.ParmaryKey;
for (int i = 0; i < e.GridViewSelectRows.Length; i++)
{
DataRow item = e.GridViewSelectRows[i];
try
{
string outMsg = "";
records[i] = BaseImpl.getMrpPlanAdd(mrpMainModule.ModeCode, item[ParmaryKey] + "", out outMsg);
tipMsg += outMsg;
}
catch (Exception ex)
{
LogHelper.Instance.WriteError(ex);
//MessageUtil.Show("表格拖拽出错!" + ex);
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
}
//int successCount = records.Contains(1) ? records.Where(x => x == 1).Count() : 0;
//int faultCount = records.Contains(0) ? records.Where(x => x == 0).Count() : 0;
//string Msg = string.Empty;
//string filepath = string.Empty;
//string paramstr = string.Empty;
//if (successCount > 0) Msg = string.Format(ResourceKeys.DragSuccessCount, successCount);
//if (faultCount > 0) Msg += successCount > 0 ? "\r\n" : "" + string.Format(ResourceKeys.DragFaultCount, faultCount);
//Msg = string.IsNullOrWhiteSpace(Msg) ? tipMsg : Msg;
if (!string.IsNullOrWhiteSpace(tipMsg))
{
MessageUtil.Show(tipMsg);
}
if (this.OnMrpDragCallback != null)
{
OnMrpDragCallback(gridControlEx, null);
}
if (table == null) table = e.TargetGridViewObj.GridControl.DataSource as DataTable;
if (table != null)
{
e.TargetGridViewObj.ClearSelection();
e.TargetGridViewObj.SelectRowHandler(table.Rows.Count - 1);
e.TargetGridViewObj.UpdateCurrentRow();
e.TargetGridViewObj.ShowEditor();
}
//gridControlEx.ParentControl.SearchGrid();
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
LogHelper.Instance.WriteError(ex);
// MessageUtil.Show(ResourceKeys.OperFault);
}
}
/// <summary>
/// 设置动态列
/// </summary>
/// <param name="tabPage"></param>
/// <param name="ColumnName"></param>
public void SetGridDisplayColumns(XtraTabPage tabPage, string ColumnName)
{
try
{
if (tabPage == null) return;
if (tabPage.Tag is GridControlEx)
{
GridControlEx gridControl = tabPage.Tag as GridControlEx;
gridControl.SetDisplayColumns(ColumnName);
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
LogHelper.Instance.WriteError(ex);
}
}
/// <summary>
/// 拖拽模式DetailView明细表双击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnDetailGridViewDoubleClick(object sender, EventArgs e)
{
if (OnDetailViewDoubleClickCallBack != null)
{
OnDetailViewDoubleClickCallBack("Detail", null);
}
}
/// <summary>
/// 提示保存所有页签中有修改的数据
/// </summary>
public bool CheckIfSaved()
{
try
{
foreach (XtraTabPage tabPage in this.TabControlObj.TabPages)
{
if (tabPage.Tag is GridControlEx && (tabPage.Tag as GridControlEx).IsDataNotSaved())
{
GridDetailModel model = this.GetGridDetailModel(tabPage);
DialogResult dialog = MessageUtil.Show(string.Format("{0}有数据未保存,是否保存", model.DetailName), MessageBoxButtons.YesNo);
if (dialog == DialogResult.Yes)
{
Object moduleObject = tabPage.Controls.Cast<Object>().FirstOrDefault();
if (moduleObject is ModuleGridEx)
{
ModuleGridEx moduleGridEx = moduleObject as ModuleGridEx;
bool SaveResults = moduleGridEx.SaveWhenSwitching();
if (!SaveResults) return false;
}
}
}
}
}
catch (Exception ex)
{
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
LogHelper.Instance.WriteError(ex);
return false;
}
return true;
}
/// <summary>
/// 控件注销时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnTabControlExDisposed(object sender, EventArgs e)
{
PageControlsDic?.Clear();
DetailTabPagesDic?.Clear();
}
/// <summary>
/// 水平滚动条改变时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnBandedViewLeftCoordChanged(object sender, EventArgs e)
{
BandedGridControlEx childBandView = null;
TreeBandedGridControlEx childTreeBandView = null;
if (this.TabControlObj.SelectedTabPage != null && this.TabControlObj.SelectedTabPage.Controls.Count > 0)
{
foreach (System.Windows.Forms.Control item in this.TabControlObj.SelectedTabPage.Controls)
{
if (item is ModuleGridEx moduleGridEx && moduleGridEx.GridControlObj.CustomGroupBandEx != null)
{
childBandView = moduleGridEx.GridControlObj.CustomGroupBandEx;
break;
}
if (item is ModuleGridEx moduleGridExNew && moduleGridExNew.GridControlObj.CustomGroupTreeBandEx != null)
{
childTreeBandView = moduleGridExNew.GridControlObj.CustomGroupTreeBandEx;
break;
}
}
}
//父表格是 表格 的情况
if (childBandView != null && ParentGridEx != null && ParentGridEx.CustomGroupBandEx != null)
{
if (sender == ParentGridEx.CustomGroupBandEx.BandedView)
{
childBandView.BandedView.LeftCoord = ParentGridEx.CustomGroupBandEx.BandedView.LeftCoord;
}
else if (sender == childBandView.BandedView)
{
ParentGridEx.CustomGroupBandEx.BandedView.LeftCoord = childBandView.BandedView.LeftCoord;
}
}
if (childTreeBandView != null && ParentGridEx != null && ParentGridEx.CustomGroupBandEx != null)
{
if (sender == ParentGridEx.CustomGroupBandEx.BandedView)
{
childTreeBandView.TreeListObj.LeftCoord = ParentGridEx.CustomGroupBandEx.BandedView.LeftCoord;
}
else if (sender == childTreeBandView.TreeListObj)
{
ParentGridEx.CustomGroupBandEx.BandedView.LeftCoord = childTreeBandView.TreeListObj.LeftCoord;
}
}
//父表格是 树表格 的情况
if (childBandView != null && ParentGridEx != null && ParentGridEx.CustomGroupTreeBandEx != null)
{
if (sender == ParentGridEx.CustomGroupTreeBandEx.TreeListObj)
{
childBandView.BandedView.LeftCoord = ParentGridEx.CustomGroupTreeBandEx.TreeListObj.LeftCoord;
}
else if (sender == childBandView.BandedView)
{
ParentGridEx.CustomGroupTreeBandEx.TreeListObj.LeftCoord = childBandView.BandedView.LeftCoord;
}
}
if (childTreeBandView != null && ParentGridEx != null && ParentGridEx.CustomGroupTreeBandEx != null)
{
if (sender == ParentGridEx.CustomGroupTreeBandEx.TreeListObj)
{
childTreeBandView.TreeListObj.LeftCoord = ParentGridEx.CustomGroupTreeBandEx.TreeListObj.LeftCoord;
}
else if (sender == childTreeBandView.TreeListObj)
{
ParentGridEx.CustomGroupTreeBandEx.TreeListObj.LeftCoord = childTreeBandView.TreeListObj.LeftCoord;
}
}
}
/// <summary>
/// 宽度改变事件处理,兼容BandedGridView和TreeList
/// </summary>
public void OnBandedViewColumnWidthChanged(object sender, EventArgs e)
{
BandedGridControlEx childBandView = null;
TreeBandedGridControlEx childTreeBandView = null;
if (this.TabControlObj.SelectedTabPage != null && this.TabControlObj.SelectedTabPage.Controls.Count > 0)
{
foreach (System.Windows.Forms.Control item in this.TabControlObj.SelectedTabPage.Controls)
{
if (item is ModuleGridEx moduleGridEx && moduleGridEx.GridControlObj.CustomGroupBandEx != null)
{
childBandView = moduleGridEx.GridControlObj.CustomGroupBandEx;
break;
}
if (item is ModuleGridEx moduleGridExNew && moduleGridExNew.GridControlObj.CustomGroupTreeBandEx != null)
{
childTreeBandView = moduleGridExNew.GridControlObj.CustomGroupTreeBandEx;
break;
}
}
}
if ((childBandView != null || childTreeBandView != null) && ParentGridEx != null && (ParentGridEx.CustomGroupBandEx != null || ParentGridEx.CustomGroupTreeBandEx != null))
{
int allWidth = 0;
// 如果sender为原有的BandedView类型
if (ParentGridEx.CustomGroupBandEx != null && sender == ParentGridEx.CustomGroupBandEx.BandedView)
{
foreach (GridBand gridBand in ParentGridEx.CustomGroupBandEx.BandedView.Bands)
{
if (gridBand.Caption.Equals("基本信息"))
{
allWidth += gridBand.Width;
break;
}
}
}
else if (ParentGridEx.CustomGroupTreeBandEx != null && sender == ParentGridEx.CustomGroupTreeBandEx.TreeListObj)
{
//父表格为树表格
foreach (DevExpress.XtraTreeList.Columns.TreeListBand gridBand in ParentGridEx.CustomGroupTreeBandEx.TreeListObj.Bands)
{
if (gridBand.Caption.Equals("基本信息"))
{
allWidth += gridBand.VisibleWidth;
break;
}
}
}
else
{
return; // 非预期sender类型时直接退出
}
if (childBandView != null)
{
// 调整底部bandGcBottom的列宽(始终为BandedGridView类型)
List<BandedGridColumn> bottomColumnList = new List<BandedGridColumn>();
foreach (GridBand gridBand in childBandView.BandedView.Bands)
{
if (gridBand.Caption.Equals("基本信息"))
{
bottomColumnList.AddRange(gridBand.Columns.Cast<BandedGridColumn>());
break;
}
}
// 按计算好的宽度均分调整
if (bottomColumnList.Count > 0)
{
int perWidth = allWidth / bottomColumnList.Count;
foreach (BandedGridColumn bandedGridColumn in bottomColumnList)
{
bandedGridColumn.Width = perWidth;
}
}
}
//选中页签为树表格
if (childTreeBandView != null)
{
// 调整底部bandGcBottom的列宽(始终为BandedGridView类型)
List<DevExpress.XtraTreeList.Columns.TreeListColumn> bottomColumnList = new List<DevExpress.XtraTreeList.Columns.TreeListColumn>();
foreach (DevExpress.XtraTreeList.Columns.TreeListBand gridBand in childTreeBandView.TreeListObj.Bands)
{
if (gridBand.Caption.Equals("基本信息"))
{
bottomColumnList.AddRange(gridBand.Columns.Cast<DevExpress.XtraTreeList.Columns.TreeListColumn>());
break;
}
}
// 按计算好的宽度均分调整
if (bottomColumnList.Count > 0)
{
int perWidth = allWidth / bottomColumnList.Count;
foreach (DevExpress.XtraTreeList.Columns.TreeListColumn bandedGridColumn in bottomColumnList)
{
bandedGridColumn.Width = perWidth;
}
}
}
}
}
}
}