/****************************** * 说明:自定义表格控件 * 创建人:龚宇超 * 创建日期:2017-08-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.Utils; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Columns; using DevExpress.XtraEditors.Repository; using Lskj.Control.Model; using DevExpress.Data; using DevExpress.XtraEditors.Controls; using Lskj.Business; using Lskj.Business.Impl; using Lskj.Util; using Lskj.Control.Properties; using Lskj.Model; using Lskj.Data; using DevExpress.XtraEditors; using System.Data.SqlClient; using System.IO; using DevExpress.XtraPrinting; using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Menu; using DevExpress.Utils.Menu; using Lskj.Control.MultiGridLookUp; using DevExpress.XtraGrid.Views.Grid.ViewInfo; using System.Reflection; using DevExpress.Data.Filtering; using Lskj.Core; using System.Text.RegularExpressions; using DevExpress.XtraGrid.Views.BandedGrid; using Lskj.Control.MultiModelLookUp; using Lskj.Control.HighBeaterInvoice; using DevExpress.XtraGrid.Drawing; using DevExpress.XtraPrinting.BarCode.Native; using Spire.Barcode; using System.Threading.Tasks; using System.Collections; using Newtonsoft.Json; using System.Net; using System.Data.Common; using Lskj.Control.SpecialDate; namespace Lskj.Control { /// /// 自定义表格控件 /// public partial class GridControlEx : UserControl { /// /// 说明:缓存计划行 /// 时间:2024-5-22 /// public DataRow jhrowitem = null; /// /// 说明:第一列获取合计 /// 时间:2022-5-7 /// private bool isFirstVisableCol = true; /// /// 表格自定义字体 /// private System.Drawing.Text.PrivateFontCollection customFont = new System.Drawing.Text.PrivateFontCollection(); /// /// The _grid enum object /// private HeaderSiftEnum _columnEnumObj; protected bool GridSumming = false; /// /// 表格列头筛选 /// protected GridColumn HeaderColumnSift; /// /// 列筛选值 /// protected int ColumnSiftValue; /// /// 筛选类型 /// public enum HeaderSiftEnum { /// /// 求和类型 /// Sum, /// /// 平均类型 /// Avg, /// /// 最大 /// Max, /// 最小 /// Min, /// /// 计数 /// Count } /// /// 表格类型 /// /// The grid enum object. public virtual HeaderSiftEnum SiftEnumObj { get { return this._columnEnumObj == null ? HeaderSiftEnum.Count : this._columnEnumObj; } set { this._columnEnumObj = value; } } /// /// 表格类型 /// /// The grid enum object. public virtual DevExpress.XtraEditors.PanelControl plbuttomObj { get { return this.pl_buttom; } } public List ObjmControlList { get { return ColumnList; } } /// /// 表格列头颜色 /// protected string HeaderColor = string.IsNullOrWhiteSpace(SystemInfo.Instance.HeaderColor) ? "#A0A0A0" : SystemInfo.Instance.HeaderColor; /// /// 必填颜色 /// protected Color RequiredForceColor = string.IsNullOrEmpty(SystemInfo.Instance.ControlRequiredColor) ? Color.Blue : ColorTranslator.FromHtml(SystemInfo.Instance.ControlRequiredColor); /// /// The reset colum primary key /// protected string CustomColumKey; /// /// 缓存列对象 /// protected List ColumnList = new List(); /// /// 缓存自动填充值列对象 /// protected List AutoPadDataReleColList = new List(); /// /// 表格行颜色数据源 /// protected DataTable GridRowColorsTable; /// /// 表格行颜色数据源 /// protected DataTable ChartTable = new DataTable(); protected string CurrentOperColumnKey = string.Empty; protected GridColumnModel CurrentOperModel = null; protected GridView CurrentOperGridView = null; public List ImageList = new List(); protected bool mLoading = false; protected Timer mTimer = new Timer(); /// /// 配置有数据源的控件对象 /// protected List mControlList = new List(); /// /// 数据源任务对象 /// public Dictionary> mControlSourceDic = new Dictionary>(); /// /// 计算值 /// public decimal customSum; /// /// 计算配置求和值 /// public string SumText; /// /// 求和列的虚拟表 /// public DataRow sumdr; /// /// 是否为PubSpec模块 /// public bool IsSpecModel = false; /// /// 禁用控件是否改变颜色 /// public bool EnabledChangeColor = true; /// /// 上一次查询SQL /// public string LastSearchSql = string.Empty; /// /// 上一次点击搜索按钮查询SQL /// public string LastSearchButtonhSql = string.Empty; /// /// 调用动态链接库默认传递参数 /// public DynamicModel Model; /// /// 系统模块实体对象 /// /// The system model. public ModuleModel SysModel { get; set; } /// /// 合计弹出浮窗 /// public SumPanelControl sumPanel; /// /// 单据主表控件、基础档案查询条件控件等等 /// public MyControl ParentControl; /// /// Gets or sets the adapter object. /// /// The adapter object. public DbDataAdapter AdapterObj { get; set; } /// /// Gets the grid view. /// /// The grid view. public virtual GridView GridView { get { return gridView; } } /// /// Gets the grid control. /// /// The grid control. public virtual GridControl GridControl { get { return gridControl; } } /// /// 下拉框数据源绑定完成后执行 /// public event EventHandler OnDataSourceBindCallBack; /// /// Delegate ParseGridDataEventHandler /// /// The row item. public delegate void ParseGridDataEventHandler(DataRow rowItem); /// /// 粘贴表格数据时调用 /// public event ParseGridDataEventHandler OnParseGridDataCallBack; /// /// 所有数据粘贴完成后调用 /// public event EventHandler OnAllAfterParseCallBack; /// /// Delegate GridColumnCallDLL /// /// The row item. public delegate void GridColumnCallDLL(string type); /// /// 表格列右键调用dll用 /// public event GridColumnCallDLL OnGridColumnCallDLL; /// /// 表格列为会计模块 /// private AmountCellRender cellHelper; /// /// 合并求和时,前一行的内容 /// public decimal BeforeClass; /// /// 合并求和时,前一行合并组名 /// public string BeforeGroupName; /// /// 界面关闭时 /// public event EventHandler OnPopupClosed; /// /// 默认自定义控件 /// public PopupContainerEdit PopupEdit; /// /// 缓存筛选数据 /// private Dictionary> _CheckedList = new Dictionary>(); //修改过的单元格 public Dictionary modifyThePosition = new Dictionary(); /// /// 右键菜单类 /// public BaseRightMenu gridViewRightMenu; /// /// 构建表格列的数据源 /// public DataTable InitGridColumsTab; /// /// 上次选中行 /// public int LastFocusedRowHandle; /// /// 是否加载导出 /// public bool ExportPermission = true; /// /// 当前选中行数组 /// private int[] SelectedRows = new int[0]; /// /// 修改条件 /// public string ModifyCond = string.Empty; /// ///超链接点击回调 /// public event EventHandler OnAfterLinkCilk; /// /// 表格粘贴行后回调 /// public event EventHandler OnAfterPasting; //模块返回id框(text)的数据源 public Dictionary ModuleEnclosure = new Dictionary(); /// /// 保存时需要验证是否重复的列 /// public List RepeatedVerificationNames = new List(); /// /// 触发计算关联后,计算合计 /// public bool RefreshTotal = true; /// /// 排序关联值 /// private string DetailOrderField = string.Empty; /// /// 冻结列 /// private List FrozenColumns = new List(); private Point m_mouseDownLocation; private int m_dragHandle; private int[] dragRowsIndex; private DragForm m_dragRowShadow; /// /// 判断明细是否是拖拽中 /// private bool isSortDrag; /// /// 设置数据源时是否允许清空列 /// public bool AllowClearColumns = true; /// /// 第一次保存全部的列 /// private List ColumnsList = new List(); /// ///复选模式,表格主键 /// public string MultiplePrimary = string.Empty; /// ///选中的行在数据源中的主键值 /// private List SelectedDataSource = new List(); /// /// 禁显列不加载数据源 /// public bool DisableFieldSources; /// /// 表格重新赋值数据源时,更新的列 /// public string UpdateColumns; /// /// 聚合多表头控件 /// public BandedGridControlEx CustomGroupBandEx; /// /// 聚合多表头控件 /// public TreeBandedGridControlEx CustomGroupTreeBandEx; /// /// 聚合界面是否冻结基本信息列 /// public bool AggregationFreeze; /// /// 聚合多表头控件选中行 /// public DataRow CustomGroupSelectedRow { get { DataRow dataRow = null; if (CustomGroupBandEx != null) { dataRow = CustomGroupBandEx.GetViewFocusedDataRow(); } else if (CustomGroupTreeBandEx != null) { dataRow = CustomGroupTreeBandEx.GetViewFocusedDataRow(); } return dataRow; } } /// /// 导出名不包含日期 /// public bool ExportNameWithoutDate = false; /// /// 导出名不包含日期 /// public bool IgnoreTab = false; /// /// 创建动态分组列控件回调 /// public event EventHandler OnBuildGroupedColumnCallBack; /// /// 记录上一次分组状态,避免重复排序 /// private int _lastGroupCount = 0; /// /// 分组后根据汇总排序是否完成 /// private bool Completed = true; /// /// 进度条类型的列名称 /// private List ProgressBarColumn = new List(); /// /// 提示文本 字段(列名,提示信息) /// public Dictionary PromptMessage = new Dictionary(); /// /// 合计行格式(设置成全局变量,更好的处理语言翻译的情况) /// public string TotalFormat = Business.Impl.LanguageTranslation.Translatable ? Business.Impl.LanguageTranslation.GetTranslatedText("合计") + ": {0:#,###}" + Business.Impl.LanguageTranslation.GetTranslatedText("行") : "合计: {0:#,###}行"; /// /// 搜索框 手动添加行 /// public Dictionary> ManuallyAddData = new Dictionary>(); /// /// 修改字段 /// public string ModifyFields = string.Empty; /// /// 必填字段 /// public string RequiredFields = string.Empty; /// /// 合计显示选中行数 /// public bool TotalQuantity; /// ///新增行 /// /// The sender. public event ModuleAddLine OnNewLine; public delegate void ModuleAddLine(string name, List list); public GridControlEx() { SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.Selectable | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true); InitializeComponent(); // 自定义选中区域方式 this.gridView.CustomDrawRowIndicator += new RowIndicatorCustomDrawEventHandler(OnGridViewCustomDrawRowIndicator); this.gridView.SelectionChanged += new SelectionChangedEventHandler(OnGridViewSelectionChanged); this.gridView.FocusedRowObjectChanged += new FocusedRowObjectChangedEventHandler(OnGridViewFocusedRowObjectChanged); this.gridView.BeforeLeaveRow += new RowAllowEventHandler(OnGridView_BeforeLeaveRow); this.gridView.CustomDrawCell += new RowCellCustomDrawEventHandler(OnGridViewCustomDrawCell); this.gridView.CellValueChanged += new CellValueChangedEventHandler(OnGridViewCellValueChanged); this.gridView.DragObjectDrop += new DragObjectDropEventHandler(OnGridViewDragObjectDrop); this.gridView.CustomDrawGroupRow += new RowObjectCustomDrawEventHandler(OnGridCustomDrawGroupRow); this.gridView.KeyDown += new KeyEventHandler(OnGridViewKeyDown); this.gridView.DoubleClick += new EventHandler(OnGridViewDoubleClick); this.gridView.Click += new EventHandler(OnGridViewClick); this.gridView.CellMerge += new CellMergeEventHandler(OnGridViewCellMerge); this.gridView.CustomSummaryCalculate += new CustomSummaryEventHandler(OnGridViewSummaryCalculate); this.gridView.OptionsNavigation.EnterMoveNextColumn = true; this.gridView.OptionsBehavior.EditorShowMode = EditorShowMode.MouseDownFocused; this.SetGridRowHeightAndFont(); this.gridView.ShowFilterPopupCheckedListBox += new FilterPopupCheckedListBoxEventHandler(OnShowFilterPopupCheckedListBox);//(修复筛选条件) //this.gridView.ValidateRow += OnGridView_ValidateRow; this.gridView.DataSourceChanged += new EventHandler(OnGridDataSourceChanged); cellHelper = new AmountCellRender(this.gridView); //鼠标悬浮提示框 ToolTipController MainGvTool = new ToolTipController(); MainGvTool.AutoPopDelay = 1000000;//提示框显示时间 10分钟 MainGvTool.BeforeShow += new ToolTipControllerBeforeShowEventHandler(MainGvTool_BeforeShow); this.gridControl.ToolTipController = MainGvTool; //this.gridView.PopupMenuShowing += new PopupMenuShowingEventHandler(OnGridView_PopupMenuShowing);//添加Footer菜单选项 this.gridView.Click += new EventHandler(OnGridView_Click);//点击复制Footer数据信息 if (SystemInfo.Instance.SelectColorHighlight) { this.gridView.RowCellStyle += GridView_RowCellStyle; } if (SystemInfo.Instance.GroupRowFontSizeDelta > 0) { this.gridView.Appearance.GroupRow.FontSizeDelta = SystemInfo.Instance.GroupRowFontSizeDelta; } if (SystemInfo.Instance.DisplayCheckboxSelection) { this.gridView.CustomRowFilter += GridView_CustomRowFilter; } #region LabPicUrl控件实现事件 //this.gridView.CustomUnboundColumnData += OnGridViewCustomUnboundColumnData; //this.gridView.DoubleClick += OnShowImageDoubleClick; LabPicUrlPreview.Attach(this.gridView); // 必须 LabPicUrlPreview.AttachPreview(this.gridView); // 新增(双击预览) #endregion if (SystemInfo.Instance.GroupSpecialMode) this.gridView.EndGrouping += GridView_EndGrouping; this.gridView.ShowingEditor += GridView_ShowingEditor; this.gridView.MouseDown += GridView_MouseDown; //绑定滚轮横向滚动 this.gridView.MouseWheel += GridView_MouseWheel; } /// /// 保存前反写多表头数据源 /// public void callbackUpdData() { try { if (CustomGroupBandEx != null) { // 获取动态多表头的Grid控件数据源 (假设为DataTable) DataTable updatedTable = CustomGroupBandEx.gridControl.DataSource as DataTable; if (updatedTable == null) return; // 获取原始的GridControl的数据源 DataTable originalDataTable = this.gridControl.DataSource as DataTable; if (originalDataTable == null) return; // 获取分组相关的列定义 GridColumnModel GroupPrimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupPrimary); GridColumnModel GroupFieldprimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupField == 1); List GroupField = ColumnList.Where(o => o.IsCustomGroupField == 2).ToList(); if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any()) return; // 遍历每一行更新回原始数据表 foreach (DataRow updatedRow in updatedTable.Rows) { string primaryKeyValue = updatedRow[GroupPrimary.FieldName]?.ToString(); // 根据主键定位原始表中的行集合 var originalRows = originalDataTable.AsEnumerable() .Where(row => row.Field(GroupPrimary.FieldName) == primaryKeyValue).ToList(); if (!originalRows.Any()) continue; // 若没有匹配的行,跳过 // 遍历动态表头的Band及子列 foreach (GridBand band in CustomGroupBandEx.BandedView.Bands) { if (band.Caption == "基本信息") continue; // 跳过普通列Band string groupFieldPrimaryValue = band.Caption; foreach (BandedGridColumn column in band.Columns) { var subField = column.Tag as GridColumnModel; if (subField == null) continue; string dynamicFieldName = column.FieldName; object updatedValue = updatedRow[dynamicFieldName]; // 精确匹配原数据源对应的单行 DataRow targetRow = originalRows.FirstOrDefault(r => r.Field(GroupFieldprimary.FieldName) == groupFieldPrimaryValue); // 若找到行,则更新该行对应的字段 if (targetRow != null && originalDataTable.Columns.Contains(subField.FieldName)) { targetRow[subField.FieldName] = updatedValue; } else if (targetRow == null) { // 若没找到,说明可能为新增数据行,插入新行(若业务需要) DataRow newOriginalRow = originalDataTable.NewRow(); newOriginalRow[GroupPrimary.FieldName] = primaryKeyValue; newOriginalRow[GroupFieldprimary.FieldName] = groupFieldPrimaryValue; foreach (var col in ColumnList.Where(x => !x.IsCustomGroupField.Equals(1) && !x.IsCustomGroupPrimary)) { if (updatedTable.Columns.Contains(col.FieldName) && originalDataTable.Columns.Contains(col.FieldName)) { newOriginalRow[col.FieldName] = updatedRow[col.FieldName]; } } if (originalDataTable.Columns.Contains(subField.FieldName)) { newOriginalRow[subField.FieldName] = updatedValue; } originalDataTable.Rows.Add(newOriginalRow); } } } } } else if (CustomGroupTreeBandEx != null) { // 获取动态多表头的Grid控件数据源 (假设为DataTable) DataTable updatedTable = CustomGroupTreeBandEx.TreeListObj.DataSource as DataTable; if (updatedTable == null) return; // 获取原始的GridControl的数据源 DataTable originalDataTable = this.gridControl.DataSource as DataTable; if (originalDataTable == null) return; // 获取分组相关的列定义 GridColumnModel GroupPrimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupPrimary); GridColumnModel GroupFieldprimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupField == 1); List GroupField = ColumnList.Where(o => o.IsCustomGroupField == 2).ToList(); if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any()) return; // 遍历每一行更新回原始数据表 foreach (DataRow updatedRow in updatedTable.Rows) { string primaryKeyValue = updatedRow[GroupPrimary.FieldName]?.ToString(); // 根据主键定位原始表中的行集合 var originalRows = originalDataTable.AsEnumerable() .Where(row => row.Field(GroupPrimary.FieldName) == primaryKeyValue).ToList(); if (!originalRows.Any()) continue; // 若没有匹配的行,跳过 // 遍历动态表头的Band及子列 foreach (DevExpress.XtraTreeList.Columns.TreeListBand band in CustomGroupTreeBandEx.TreeListObj.Bands) { if (band.Caption == "基本信息") continue; // 跳过普通列Band string groupFieldPrimaryValue = band.Caption; foreach (DevExpress.XtraTreeList.Columns.TreeListColumn column in band.Columns) { var subField = column.Tag as GridColumnModel; if (subField == null) continue; string dynamicFieldName = column.FieldName; object updatedValue = updatedRow[dynamicFieldName]; // 精确匹配原数据源对应的单行 DataRow targetRow = originalRows.FirstOrDefault(r => r.Field(GroupFieldprimary.FieldName) == groupFieldPrimaryValue); // 若找到行,则更新该行对应的字段 if (targetRow != null && originalDataTable.Columns.Contains(subField.FieldName)) { targetRow[subField.FieldName] = updatedValue; } else if (targetRow == null) { // 若没找到,说明可能为新增数据行,插入新行(若业务需要) DataRow newOriginalRow = originalDataTable.NewRow(); newOriginalRow[GroupPrimary.FieldName] = primaryKeyValue; newOriginalRow[GroupFieldprimary.FieldName] = groupFieldPrimaryValue; foreach (var col in ColumnList.Where(x => !x.IsCustomGroupField.Equals(1) && !x.IsCustomGroupPrimary)) { if (updatedTable.Columns.Contains(col.FieldName) && originalDataTable.Columns.Contains(col.FieldName)) { newOriginalRow[col.FieldName] = updatedRow[col.FieldName]; } } if (originalDataTable.Columns.Contains(subField.FieldName)) { newOriginalRow[subField.FieldName] = updatedValue; } originalDataTable.Rows.Add(newOriginalRow); } } } } } } catch (Exception ex) { MessageBox.Show("保存失败:" + ex.Message); } } /// /// 说明:单元格合并 /// 创建人:王一帆 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewCellMerge(object sender, CellMergeEventArgs e) { try { GridColumn column = e.Column; GridColumnModel model = column.Tag as GridColumnModel; if (string.IsNullOrEmpty(model.MergeGroup)) return; string[] fields = model.MergeGroup.Trim(',').Split(','); bool handled = false;//默认合并 DataTable table = gridView.GridControl.DataSourceTable(); for (int i = 0; i < fields.Length; i++) { int row1 = e.RowHandle1; int row2 = e.RowHandle2; string McColumn = fields[i] + "";//关联条件列 if (!table.Columns.Contains(McColumn)) break; string value1 = gridView.GetDataRow(row1)[McColumn].ToString(); string value2 = gridView.GetDataRow(row2)[McColumn].ToString(); if (value1 != value2) { //e.Handled = true; handled = true;//如果配置多个,有一个分组上下值不同,则不会合并 } //else //{ // //e.Handled = false; //} } e.Handled = handled; } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); LogHelper.Instance.WriteError(ex); } } private string GetMergeGroupValue(GridColumnModel model, DataRow row) { if (model == null || row == null || string.IsNullOrEmpty(model.MergeGroup)) return string.Empty; string[] fields = model.MergeGroup.Trim(',').Split(','); StringBuilder groupValue = new StringBuilder(); foreach (string item in fields) { string fieldName = (item + "").Trim(); if (string.IsNullOrEmpty(fieldName) || !row.Table.Columns.Contains(fieldName)) continue; groupValue.Append(fieldName); groupValue.Append("="); groupValue.Append(row[fieldName] + ""); groupValue.Append("|"); } return groupValue.ToString(); } /// /// 说明:表格列求和触发事件 /// 创建人:王一帆 /// 创建日期:2020-09-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void OnGridViewSummaryCalculate(object sender, CustomSummaryEventArgs e) { try { bool isSum = false; //DataRow NRow = e.Row != null ? (e.Row as DataRowView).Row : null; var gridView = sender as DevExpress.XtraGrid.Views.Grid.GridView; GridSummaryItem gridSummaryItem = e.Item as GridSummaryItem; GridColumn gridColumn = gridView.Columns[gridSummaryItem.FieldName] as GridColumn; GridColumnModel model = gridColumn.Tag as GridColumnModel; GridViewInfo info = gridView.GetViewInfo() as GridViewInfo; switch (e.SummaryProcess) { //calculation entry point 计算开始时 case DevExpress.Data.CustomSummaryProcess.Start: customSum = 0; SumText = model.sumCalc; sumdr = null; if (!string.IsNullOrEmpty(model.sumCalc)) { DataTable SumTab = new DataTable(); List condition = ReplaceHelper.GetParamFields(model.sumCalc); foreach (string item in condition) { string field = item.Replace("{", "").Replace("}", ""); SumTab.Columns.Add(field); } sumdr = SumTab.NewRow(); } break; //consequent calculations 计算中自定义计算方法 case CustomSummaryProcess.Calculate: bool isAddCheck = gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect && gridView.OptionsSelection.EnableAppearanceFocusedCell == false ? true : false; DataRow gridRow = null; if (isAddCheck && this.SelectedRows != null && this.SelectedRows.Count() > 0) { if (this.SelectedRows != null && this.SelectedRows.Contains(e.RowHandle)) { gridRow = gridView.GetDataRow(e.RowHandle); } else { break; } } else { gridRow = gridView.GetDataRow(e.RowHandle); } isSum = !string.IsNullOrWhiteSpace(model.SumCond) ? "true".Equals(EvalHelper.Eval(ReplaceHelper.ReplaceEvalCond(ReplaceHelper.ReplaceRowParam(gridRow, model.SumCond))) + "", StringComparison.OrdinalIgnoreCase) : true; if (!string.IsNullOrEmpty(model.sumCalc)) { foreach (DataColumn col in sumdr.Table.Columns) { sumdr[col.ColumnName] = Convert.ToDecimal(string.IsNullOrEmpty(sumdr[col.ColumnName] + "") ? "0" : sumdr[col.ColumnName] + "") + Convert.ToDecimal(string.IsNullOrEmpty(gridRow[col.ColumnName] + "") ? "0" : gridRow[col.ColumnName] + ""); } } else { if (model.isSumMerge && !string.IsNullOrEmpty(e.FieldValue + "")) { if (!string.IsNullOrEmpty(model.MergeGroup)) { string currentGroupName = GetMergeGroupValue(model, gridRow); bool isMergrGroup = !string.IsNullOrEmpty(currentGroupName) && e.RowHandle != 0 ? currentGroupName.Equals(BeforeGroupName) : false; if (model.CanMerge && BeforeClass == Convert.ToDecimal(e.FieldValue) && isMergrGroup) { BeforeClass = Convert.ToDecimal(e.FieldValue); BeforeGroupName = currentGroupName; } else { BeforeClass = Convert.ToDecimal(e.FieldValue); BeforeGroupName = currentGroupName; if (isSum || String.IsNullOrEmpty(model.SumCond)) customSum += Convert.ToDecimal(e.FieldValue); } } else { if (model.CanMerge && BeforeClass == Convert.ToDecimal(e.FieldValue)) { BeforeClass = Convert.ToDecimal(e.FieldValue); } else { BeforeClass = Convert.ToDecimal(e.FieldValue); BeforeGroupName = !string.IsNullOrEmpty(model.MergeGroup) && gridRow.Table.Columns.Contains(model.MergeGroup) ? gridRow[model.MergeGroup] + "" : ""; if (isSum || String.IsNullOrEmpty(model.SumCond)) customSum += Convert.ToDecimal(e.FieldValue); } } } if (model.CanSum && isSum) { if (BeforeClass != Convert.ToDecimal(e.FieldValue)) { customSum += Convert.ToDecimal(e.FieldValue); } } } break; //final summary value 计算结束 case CustomSummaryProcess.Finalize: if (gridView.GridControl.DataSourceTable().Rows.Count == 0) break; if (sumdr != null) { foreach (DataColumn col in sumdr.Table.Columns) { string newresult = sumdr[col.ColumnName] + ""; GridColumn newColumn = gridView.Columns[col.ColumnName] as GridColumn; GridColumnModel newModel = newColumn.Tag as GridColumnModel; if (!string.IsNullOrEmpty(newModel.DataFormat)) { //计算后先执行保存小数位数 if (!model.sumCalc.StartsWith("@")) { newresult = string.Format("{0:" + newModel.DataFormat + "}", Convert.ToDecimal(string.IsNullOrEmpty(newresult) ? "0" : newresult)); } } sumdr[col.ColumnName] = newresult + ""; } if (this.ParentControl != null) SumText = ParentControl.ReplaceParentControlValue(model.sumCalc); SumText = ReplaceHelper.ReplaceRowParam(sumdr, SumText); string result = string.Empty; if (SumText.StartsWith("@")) { try { result = MainImpl.GetResult(SumText.Replace("@", "")) + ""; } catch (Exception) { } } else { result = EvalHelper.Eval2(ReplaceHelper.ReplaceEvalCond(SumText)) + ""; } if (result.Equals("NaN") || string.IsNullOrWhiteSpace(result)) result = "0"; if (string.IsNullOrEmpty(model.DataFormat)) { result = Math.Round(Convert.ToDouble(result), model.Decimals, MidpointRounding.AwayFromZero) + ""; } else { //计算后先执行保存小数位数 result = string.Format("{0:" + model.DataFormat + "}", Convert.ToDecimal(result)); } //如果是数值类型,就去掉百分号 //if (model.FieldType == 7 && result.Contains('%')) //{ // result = (double.Parse(result.Replace("%", "")) * 0.01).ToString(); //} e.TotalValue = result; } else { e.TotalValue = customSum; BeforeClass = 0; BeforeGroupName = ""; } //汇总数据为当前列展示值相加 if (model.CanSum && model.Summation) { if (gridColumn != null) { double value = 0; for (int i = 0; i < gridView.RowCount; i++) { string DisplayText = gridView.GetRowCellDisplayText(i, gridColumn.FieldName) + ""; if (!string.IsNullOrWhiteSpace(DisplayText)) value += double.Parse(DisplayText); } e.TotalValue = value; } } break; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:创建列 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The dr row. protected void InitEditColumns(GridColumn column, GridColumnModel model) { if (this.DisableFieldSources && model.isVislble) { return; } if (!string.IsNullOrEmpty(model.SqlSource) && !ControlType.IsNotLoadData(model.FieldType)) { Task sourceTask = new Task(() => { DataTable dataTable = new DataTable(); using (DbConnection sqlConnection = SqlHelper.dbFactory.CreateConnection()) { sqlConnection.ConnectionString = SqlHelper._connection.ConnectionString; using (DbCommand cmd = SqlHelper.dbFactory.CreateCommand()) { try { string sqlValue = BaseImpl.GetDefaultValue(model.SqlSource); sqlValue = ReplaceHelper.ReplaceParam(sqlValue); if (sqlConnection.State != ConnectionState.Open) { sqlConnection.Open(); } cmd.Connection = sqlConnection; cmd.CommandTimeout = 0; cmd.CommandText = sqlValue; cmd.CommandType = CommandType.Text; DbDataAdapter adapter = SqlHelper.dbFactory.CreateDataAdapter(); adapter.SelectCommand = cmd; adapter.Fill(dataTable); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { sqlConnection.Close(); cmd.Dispose(); } } } return dataTable; }); sourceTask.Start(DataTableExtend.SchedulerUtil); mControlSourceDic.Add(model, sourceTask); } switch (model.FieldType) { case ControlType.LabAutoLinefeedText: InitAutoLinefeedEdit(column, model); break; case ControlType.LabPassWordValue: InitPasswordEdit(column, model); break; case ControlType.LabComboxValue: case ControlType.LabComboxText: case ControlType.LabComboxValueParam: case ControlType.LabComboxTextParam: InitComboxEdit(column, model); break; case ControlType.LabProgressBar: InitProgressEdit(column); break; case ControlType.LabCheckBox: InitCheckEdit(column); break; case ControlType.LabAutoCompleteValue: case ControlType.LabAutoCompleteText: case ControlType.LabAutoCompleteValueParam: case ControlType.LabAutoCompleteTextParam: case ControlType.LabAutoGridValue: case ControlType.LabAutoGridText: case ControlType.LabAutoGridValueParam: case ControlType.LabAutoGridTextParam: InitAutoSearchEdit(column, model); break; case ControlType.LabDate: case ControlType.LabDateTime: case ControlType.LabDateTimeShort: case ControlType.LabShortDate: InitDateTimeEdit(column, model.FieldType); break; case ControlType.LabDateHalfDay: InitSpecialDate(column, model); break; case ControlType.LabTime: case ControlType.LabShortTime: InitTimeEdit(column, model.FieldType); break; case ControlType.LabCalcText: InitCalcEdit(column); break; case ControlType.LabMemoEdit: InitMemoEdit(column); break; case ControlType.LabRemark: InitRemarkEdit(column); break; case ControlType.LabAccount: this.cellHelper.AddAmountColumn(column, 11); break; case ControlType.LabMultiSelectValue: case ControlType.LabMultiSelectValueNew: case ControlType.LabMultiSelectValueParam: case ControlType.LabMultiSelectText: case ControlType.LabMultiSelectTextNew: case ControlType.LabMultiSelectTextParam: InitMutilEdit(column, model); break; case ControlType.LabMulitTreeText: case ControlType.LabMulitTreeTextParam: case ControlType.LabMulitTreeValue: case ControlType.LabMulitTreeValueParam: InitAutoTreeSearchEdit(column, model, true, false); break; case ControlType.LabMultiComTreeboxValue: case ControlType.LabMultiComTreeboxText: case ControlType.LabMultiComTreeboxValueParam: case ControlType.LabMultiComTreeboxTextParam: InitAutoTreeSearchEdit(column, model, true, true); break; case ControlType.LabTreeLastlevelValue: case ControlType.LabTreeLastlevelText: case ControlType.LabCheckTreeLastlevelValue: case ControlType.LabCheckTreeLastlevelText: InitAutoTreeSearchEdit(column, model, false, false); break; case ControlType.LabTreeLookValue: case ControlType.LabTreeLookText: case ControlType.LabCheckTreeLookValue: case ControlType.LabCheckTreeLookText: InitAutoTreeSearchEdit(column, model, false, true); break; case ControlType.LabComboxCheckListValue: case ControlType.LabComboxCheckListText: InitMutilComboxEdit(column, model); break; //case ControlType.LabQQ: // column.Tag = "QQ"; // break; //case ControlType.LabWWW: // column.Tag = "Brower"; // break; case ControlType.LabRichEdit: InitRichEdit(column); break; case ControlType.LabPic: InitPicEdit(column); break; case ControlType.LabPicUrl: //InitPicEditUrl(column, model); // 用工具类创建图片列(绑定 Tag、Repository、UnboundType) LabPicUrlPreview.InitPicColumn(this.gridControl, column, model); break; case ControlType.LabSelectReturnId: case ControlType.LabSelectReturnText: InitSelectReturnId(column, model); break; case ControlType.LabSelectReturnIdNew: case ControlType.LabSelectReturnTextNew: InitSelectReturnIdNew(column, model); break; case ControlType.LabSelectReturnRows: InitSelectReturnRows(column, model); break; case ControlType.LabSelectReturnRowsNew: InitSelectReturnRowsNew(column, model); break; case ControlType.DynamicallyGeneratedSql: InitSqlGenerate(column, model); break; case ControlType.HighShotMeter: InitHighShotMeterEdit(column, model); break; case ControlType.BarCode128B: InitBarCode128BEdit(column, model); break; case ControlType.LabHyperlink: InitHyperlink(column, model); break; case ControlType.LabRightlink: InitRightlink(column, model); break; case ControlType.LabComboxPopupValue: case ControlType.LabComboxPopupText: InitComboxPopup(column, model); break; case ControlType.LabGridPopupValue: case ControlType.LabGridPopupText: //case ControlType.LabGridPopupMutilValue: //case ControlType.LabGridPopupMutilText: InitGridPopup(column, model); break; case ControlType.LabModuleAddRowsID: case ControlType.LabModuleAddRowsText: InitModuleReturnLine(column, model); break; case ControlType.LabModuleSelectReturnIdExtended: case ControlType.LabSearchReturnIdExtended: InitExtendedReturn(column, model); break; default: break; } // 特殊处理 if (ControlType.LabTreeType == model.FieldType && !IsSpecModel) { InitComboxEdit(column, model); } } /// /// 说明:设置列格式化 /// 创建人:龚宇超 /// 创建日期:2018-03-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. /// The model. protected virtual void SetColumnFormat(GridColumn gridColumn, GridColumnModel model) { if (gridColumn == null || model == null) return; // 格式化数字 if (!string.IsNullOrEmpty(model.DataFormat)) { if (model.FieldType == ControlType.LabTextInt || model.FieldType == ControlType.LabCalcText || model.FieldType == ControlType.LabAccount) { gridColumn.DisplayFormat.FormatType = FormatType.Numeric; gridColumn.DisplayFormat.FormatString = model.DataFormat; } else { gridColumn.DisplayFormat.FormatType = FormatType.Custom; gridColumn.DisplayFormat.FormatString = model.DataFormat; } } // 特殊字段格式化 if (model.CanAccuracy) { gridColumn.DisplayFormat.FormatType = FormatType.Numeric; gridColumn.DisplayFormat.FormatString = "F2"; } } /// /// 说明:设置列汇总 /// 创建人:龚宇超 /// 创建日期:2018-03-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. /// The model. protected virtual void SetColumnSumming(GridColumn gridColumn, GridColumnModel model) { // 设置底部合计 if (gridColumn.VisibleIndex >= 0 && this.isFirstVisableCol) { gridView.OptionsView.ShowFooter = true; gridColumn.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, TotalFormat) }); if (SystemInfo.Instance.GroupSpecialMode) { //gridView.GroupSummary.Add(new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, null, "合计: {0:#,###}行")); gridView.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; } else { gridView.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, null, TotalFormat) }); } isFirstVisableCol = false; } else { if (model.CanSum) { gridColumn.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem((!string.IsNullOrEmpty(model.sumCalc) || !string.IsNullOrEmpty(model.SumCond) || model.isSumMerge) ? SummaryItemType.Custom : SummaryItemType.Sum, gridColumn.FieldName, model.SumText + "{0:" + model.DataFormat + "}") }); if (SystemInfo.Instance.GroupSpecialMode) { gridView.GroupSummary.Add(new GridGroupSummaryItem((!string.IsNullOrEmpty(model.sumCalc) || !string.IsNullOrEmpty(model.SumCond) || model.isSumMerge) ? SummaryItemType.Custom : SummaryItemType.Sum, gridColumn.FieldName, gridColumn, model.SumText + "{0:" + model.DataFormat + "}")); gridView.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; } else { gridView.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem((!string.IsNullOrEmpty(model.sumCalc) || !string.IsNullOrEmpty(model.SumCond) || model.isSumMerge) ? SummaryItemType.Custom : SummaryItemType.Sum, gridColumn.FieldName, null, model.SumText + "{0:" + model.DataFormat + "}") }); } } } } /// /// 行转列多表头列合计。动态列创建在独立的BandedGridView里,不能直接复用主表格的SetColumnSumming。 /// private void SetDynamicBandedColumnSumming(BandedGridView view, BandedGridColumn gridColumn, GridColumnModel model, ref bool isFirstVisibleColumn, bool useSimpleSum) { if (view == null || gridColumn == null || model == null || !gridColumn.Visible) return; if (isFirstVisibleColumn) { view.OptionsView.ShowFooter = true; gridColumn.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, TotalFormat) }); if (SystemInfo.Instance.GroupSpecialMode) { view.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; } else { view.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, null, TotalFormat) }); } isFirstVisibleColumn = false; return; } if (!model.CanSum) return; SummaryItemType summaryType = useSimpleSum ? SummaryItemType.Sum : ((!string.IsNullOrEmpty(model.sumCalc) || !string.IsNullOrEmpty(model.SumCond) || model.isSumMerge) ? SummaryItemType.Custom : SummaryItemType.Sum); string format = model.SumText + "{0:" + model.DataFormat + "}"; view.OptionsView.ShowFooter = true; gridColumn.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(summaryType, gridColumn.FieldName, format) }); if (SystemInfo.Instance.GroupSpecialMode) { view.GroupSummary.Add(new GridGroupSummaryItem(summaryType, gridColumn.FieldName, gridColumn, format)); view.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; } else { view.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(summaryType, gridColumn.FieldName, null, format) }); } } /// /// 行转列树形多表头列合计。TreeList使用SummaryFooter,需单独设置。 /// private void SetDynamicTreeColumnSumming(DevExpress.XtraTreeList.TreeList treeList, DevExpress.XtraTreeList.Columns.TreeListColumn gridColumn, GridColumnModel model, ref bool isFirstVisibleColumn) { if (treeList == null || gridColumn == null || model == null || !gridColumn.Visible) return; if (isFirstVisibleColumn) { treeList.OptionsView.ShowSummaryFooter = true; gridColumn.AllNodesSummary = true; gridColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Count; gridColumn.RowFooterSummaryStrFormat = TotalFormat; isFirstVisibleColumn = false; return; } if (!model.CanSum) return; treeList.OptionsView.ShowSummaryFooter = true; gridColumn.AllNodesSummary = true; gridColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Sum; gridColumn.RowFooterSummaryStrFormat = model.SumText + "{0:" + model.DataFormat + "}"; } /// /// 说明:创建只读列 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The table. /// 需要显示表格列右键菜单(保存列属性、重置列属性)则传递此值. public virtual void SetReadOnlyColumns(DataTable table, string customColumKey = "") { Dictionary dataCaches = Model != null ? Model.DataCaches : null; this.mLoading = false; this.InitGridColumsTab = table; this.CustomColumKey = customColumKey; this.GridView.Columns.Clear(); this.ColumnList.Clear(); if (table == null) return; this.gridView.BeginUpdate(); for (int i = 0; i < table.Rows.Count; i++) { GridColumnModel model = new GridColumnModel(table.Rows[i], false); GridColumn gridColumn = new GridColumn(); gridColumn.OptionsFilter.AutoFilterCondition = AutoFilterCondition.Contains; gridColumn.FieldName = model.FieldName; gridColumn.Name = model.FieldName; gridColumn.Caption = model.FieldText; gridColumn.Width = model.Width; gridColumn.Tag = model; gridColumn.VisibleIndex = i; gridColumn.Visible = model.Visible && model.Width > 0; gridColumn.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; gridColumn.OptionsColumn.AllowEdit = false; gridColumn.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; gridColumn.OptionsColumn.AllowMerge = model.CanMerge ? DefaultBoolean.True : DefaultBoolean.False; if (model.CanMerge) gridView.OptionsView.AllowCellMerge = true; if (model.FieldType == ControlType.LabPic) { ImageList.Add(model.FieldName); } if (EnabledChangeColor) { if (!model.Edit) { gridColumn.AppearanceHeader.Options.UseForeColor = true; gridColumn.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } if (model.CanNull) { gridColumn.AppearanceHeader.Options.UseForeColor = true; gridColumn.AppearanceHeader.ForeColor = RequiredForceColor; } } if (model.DataAlignment > 0) { gridColumn.AppearanceCell.Options.UseTextOptions = true; gridColumn.AppearanceCell.TextOptions.HAlignment = model.DataAlignment == 1 ? DevExpress.Utils.HorzAlignment.Center : DevExpress.Utils.HorzAlignment.Far; } if (!string.IsNullOrEmpty(model.FontName) || model.FontSize != 0) { //gridColumn.AppearanceCell.Options.UseFont = true;//设置后数值和英文会加粗,2026-3-17 注释 //gridColumn.AppearanceCell.Font = new System.Drawing.Font(model.FontName, gridColumn.AppearanceCell.Font.Size); gridColumn.AppearanceCell.Font = new System.Drawing.Font(string.IsNullOrEmpty(model.FontName) ? gridColumn.AppearanceCell.Font.Name : model.FontName, model.FontSize == 0 ? gridColumn.AppearanceCell.Font.Size : model.FontSize); } this.SetColumnFormat(gridColumn, model); this.SetColumnSumming(gridColumn, model); // 创建列 this.InitEditColumns(gridColumn, model); this.gridView.Columns.Add(gridColumn); this.ColumnList.Add(model); if (model.RepeatedVerification) { this.RepeatedVerificationNames.Add(model.FieldName); } if (!string.IsNullOrWhiteSpace(model.PromptText)) { PromptMessage.Add(model.FieldName, model.PromptText); } if (!string.IsNullOrWhiteSpace(model.ColumnAnnotation)) { gridColumn.ToolTip = model.ColumnAnnotation; } } //创建右键菜单列 if (!dataCaches.GetValue(this, "RightMenuBtn", out DataTable rightMentTab)) { if (this.Model != null) { rightMentTab = BaseModuleImpl.GetBaseGridRightMenus(this.Model.ModuleCode); } } //左侧如果配置表格,也和出现和主表一样的操作列。先限制为左侧固定不加载(要加载的话要获取左侧的fieldKey) if (this.Model != null && BaseModuleImpl.IsGridViewRightMenuBtnEdit(rightMentTab) && !customColumKey.Contains("BaseLeftGridView_")) { this.InitRightMenuBtnEdit(); } if (!dataCaches.GetValue(this, "CustomColumnByDatabase", out DataTable customTable)) { customTable = this.gridView.GetCustomColumnByDatabase(this.CustomColumKey); } this.SetCustomColumns(customTable); ////创建右键菜单列 //if (this.Model != null && BaseModuleImpl.IsGridViewRightMenuBtnEdit(this.Model.ModuleCode)) this.InitRightMenuBtnEdit(); //this.SetCustomColumns(); this.gridView.EndUpdate(); //延迟加载数据源 this.mLoading = false; this.mTimer.Tick += new EventHandler(mTimerTick); this.mTimer.Start(); } /// /// 说明:延迟加载数据源 /// 创建人:龚宇超 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void mTimerTick(object sender, EventArgs e) { if (!mLoading) { mLoading = true; try { if (this.OnDataSourceBindCallBack != null) { this.OnDataSourceBindCallBack(null, null); } SetColumnsSource(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { mControlSourceDic.Clear(); } } else { this.mTimer.Stop(); this.mTimer.Dispose(); } } private void SetColumnsSource(bool UpdateColumnRefresh = false) { foreach (GridColumnModel item in mControlList) { if (this.DisableFieldSources && item.isVislble) continue; if (ControlType.IsNotLoadData(item.FieldType)) continue; if (UpdateColumnRefresh && !string.IsNullOrWhiteSpace(UpdateColumns) && !UpdateColumns.Split(',').Contains(item.FieldName)) continue; if (!string.IsNullOrWhiteSpace(item.SqlSource)) { DataTable dataTable = new DataTable(); if (mControlSourceDic.ContainsKey(item)) { dataTable = mControlSourceDic[item].Result; } else { dataTable = BaseImpl.GetDataTableResult(item.SqlSource); } Application.DoEvents(); if (!item.Visible) continue; switch (item.FieldType) { case ControlType.LabComboxValue: case ControlType.LabComboxText: case ControlType.LabComboxValueParam: case ControlType.LabComboxTextParam: case ControlType.LabTreeType: RepositoryItemLookUpEdit lookUp = GridView.Columns[item.FieldName].ColumnEdit as RepositoryItemLookUpEdit; //if (false) //{ // //设置有下划线不显示,其余的显示 // foreach (LookUpColumnInfo lookUpColumnInfo in lookUp.Columns) // { // if(lookUpColumnInfo.FieldName.Substring(0, 1) == "_") lookUpColumnInfo.Visible = false; // } // foreach (DataColumn dcol in dataTable.Columns) // { // if ((dcol.ColumnName.Substring(0, 1) != "_") && (dcol.ColumnName.ToLower() != item.ValueMember.ToLower()) && (dcol.ColumnName.ToLower() != item.TextMember.ToLower()) && (dcol.ColumnName.ToLower() != "remark") && ((int)dcol.ColumnName[0] > 127)) // { // LookUpColumnInfo textColumn = new LookUpColumnInfo(); // textColumn.Caption = textColumn.FieldName = dcol.ColumnName; // textColumn.Visible = true; // lookUp.Columns.Add(textColumn); // } // } //} lookUp.DataSource = dataTable; break; case ControlType.LabAutoCompleteValue: case ControlType.LabAutoCompleteText: case ControlType.LabAutoCompleteValueParam: case ControlType.LabAutoCompleteTextParam: case ControlType.LabAutoGridValue: case ControlType.LabAutoGridText: case ControlType.LabAutoGridValueParam: case ControlType.LabAutoGridTextParam: int popWidth = 0; RepositoryItemGridLookUpEdit lookGridUp = GridView.Columns[item.FieldName].ColumnEdit as RepositoryItemGridLookUpEdit; DataTable table = dataTable; lookGridUp.DataSource = table; //Type dataType = table.Columns[item.ValueMember].DataType; //if (dataType.Name == "Int32") //{ // lookGridUp.View.Columns[item.ValueMember].Tag = table.AsEnumerable().Select(t => t.Field(item.ValueMember)).Max(); //} //else if(dataType.Name == "String") //{ //} if (table.Columns.Contains("remark") && lookGridUp.View.Columns.FirstOrDefault(x => x.FieldName == "remark") == null) { GridColumn remarkColumn = new GridColumn(); remarkColumn.Caption = "备注"; remarkColumn.Name = remarkColumn.FieldName = "remark"; remarkColumn.Visible = true; lookGridUp.View.Columns.Add(remarkColumn); } //if (false) //{ // //设置有下划线不显示,其余的显示 // foreach (GridColumn gridColumn in lookGridUp.View.Columns) // { // if (gridColumn.FieldName.Substring(0, 1) == "_") gridColumn.Visible = false; // } // foreach (DataColumn dcol in dataTable.Columns) // { // if ((dcol.ColumnName.Substring(0, 1) != "_") && (dcol.ColumnName.ToLower() != item.ValueMember.ToLower()) && (dcol.ColumnName.ToLower() != item.TextMember.ToLower()) && (dcol.ColumnName.ToLower() != "remark") && ((int)dcol.ColumnName[0] > 127)) // { // GridColumn otherColumn = new GridColumn(); // otherColumn.Name = otherColumn.FieldName = otherColumn.Caption = dcol.ColumnName; // otherColumn.Visible = true; // lookGridUp.View.Columns.Add(otherColumn); // } // } //} foreach (DataColumn dcol in table.Columns) { if ((dcol.ColumnName.Substring(0, 1) != "_") && lookGridUp.View.Columns.FirstOrDefault(x => x.FieldName == dcol.ColumnName) == null) { if ((dcol.ColumnName.ToLower() != item.ValueMember.ToLower()) && (dcol.ColumnName.ToLower() != item.TextMember.ToLower()) && (dcol.ColumnName.ToLower() != "remark") && ((int)dcol.ColumnName[0] > 127)) { GridColumn otherColumn = new GridColumn(); otherColumn.Name = otherColumn.FieldName = otherColumn.Caption = dcol.ColumnName; otherColumn.Visible = true; lookGridUp.View.Columns.Add(otherColumn); } if (lookGridUp.View.Columns.FirstOrDefault(x => x.FieldName == dcol.ColumnName) != null) { GridColumn gCol = lookGridUp.View.Columns[dcol.ColumnName]; gCol.Width = CalcMaxColumnWidth(table, gCol.Name); popWidth += gCol.Width; } } } lookGridUp.PopupFormSize = new System.Drawing.Size(popWidth, lookGridUp.PopupFormSize.Height); break; //case ControlType.LabMultiSelectValue: //case ControlType.LabMultiSelectValueParam: //case ControlType.LabMultiSelectText: //case ControlType.LabMultiSelectTextParam: // RepositoryItemCheckedComboBoxEdit checkCombox = GridView.Columns[item.FieldName].ColumnEdit as RepositoryItemCheckedComboBoxEdit; // checkCombox.DataSource = BaseImpl.GetDataTableResult(item.SqlSource); // break; default: break; } } } } /// /// 说明:创建只读列 /// 创建人:龚宇超 /// 创建日期:2018-11-14 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The table. /// The custom colum key. /// The font. public virtual void SetReadOnlyColumns(DataTable table, string customColumKey, Font font, DefaultBoolean allSort) { this.CustomColumKey = customColumKey; this.GridView.Columns.Clear(); this.ColumnList.Clear(); if (table == null) return; for (int i = 0; i < table.Rows.Count; i++) { GridColumnModel model = new GridColumnModel(table.Rows[i], false); GridColumn gridColumn = new GridColumn(); gridColumn.OptionsFilter.AutoFilterCondition = AutoFilterCondition.Contains; gridColumn.FieldName = model.FieldName; gridColumn.Name = model.FieldName; gridColumn.Caption = model.FieldText; gridColumn.Width = model.Width; gridColumn.Tag = model; gridColumn.VisibleIndex = i; gridColumn.Visible = model.Visible && model.Width > 0; gridColumn.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; gridColumn.OptionsColumn.AllowEdit = false; gridColumn.OptionsColumn.AllowSort = allSort; gridColumn.AppearanceHeader.Options.UseFont = true; gridColumn.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; gridColumn.AppearanceHeader.Font = font; gridColumn.OptionsColumn.AllowMerge = model.CanMerge ? DefaultBoolean.True : DefaultBoolean.False; if (model.CanMerge) gridView.OptionsView.AllowCellMerge = true; if (model.DataAlignment > 0) { gridColumn.AppearanceCell.Options.UseTextOptions = true; gridColumn.AppearanceCell.TextOptions.HAlignment = model.DataAlignment == 1 ? DevExpress.Utils.HorzAlignment.Center : DevExpress.Utils.HorzAlignment.Far; } if (model.FieldType == ControlType.LabPic) { ImageList.Add(model.FieldName); } //if (model.FieldText.Contains("\\r\\n")) //{ // gridColumn.AppearanceHeader.Options.UseTextOptions = true; // gridColumn.AppearanceHeader.TextOptions.WordWrap = WordWrap.Wrap; // gridColumn.Caption = model.FieldText.Replace("\\r\\n", " "); // gridView.ColumnPanelRowHeight = 35; //} this.SetColumnFormat(gridColumn, model); this.SetColumnSumming(gridColumn, model); // 创建列 this.InitEditColumns(gridColumn, model); this.gridView.Columns.Add(gridColumn); this.ColumnList.Add(model); if (model.RepeatedVerification) { this.RepeatedVerificationNames.Add(model.FieldName); } if (model.FieldType == 9) { gridColumn.AppearanceCell.TextOptions.VAlignment = VertAlignment.Center; gridColumn.AppearanceCell.TextOptions.WordWrap = WordWrap.Wrap; } if (!string.IsNullOrWhiteSpace(model.PromptText)) { PromptMessage.Add(model.FieldName, model.PromptText); } if (!string.IsNullOrWhiteSpace(model.ColumnAnnotation)) { gridColumn.ToolTip = model.ColumnAnnotation; } } DataTable customTable = this.gridView.GetCustomColumnByDatabase(this.CustomColumKey); this.SetCustomColumns(customTable); // 延迟加载数据源 this.mTimer.Tick += new EventHandler(mTimerTick); this.mTimer.Start(); } /// /// 说明:设置可编辑列 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The table. /// 需要显示表格列右键菜单(保存列属性、重置列属性)则传递此值. public virtual void SetEditColumns(DataTable table, string customColumKey = "") { this.mLoading = false; this.InitGridColumsTab = table; this.CustomColumKey = customColumKey; this.GridView.Columns.Clear(); this.ColumnList.Clear(); if (table == null) return; Console.WriteLine(DateTime.Now); int index = 0; foreach (DataRow item in table.Rows) { GridColumnModel model = new GridColumnModel(item); GridColumn gridColumn = new GridColumn(); gridColumn.OptionsFilter.AutoFilterCondition = AutoFilterCondition.Contains; gridColumn.FieldName = model.FieldName; gridColumn.Name = model.FieldName; gridColumn.Caption = model.FieldText; gridColumn.Width = model.Width; gridColumn.Tag = model; gridColumn.VisibleIndex = index++; gridColumn.Visible = model.Visible && model.Width > 0; gridColumn.OptionsColumn.AllowEdit = model.Edit; //gridColumn.OptionsColumn.AllowMerge = model.CanMerge ? DefaultBoolean.True : DefaultBoolean.False; gridColumn.OptionsColumn.ShowInCustomizationForm = model.Width == 0 ? false : true; gridColumn.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; gridColumn.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; gridColumn.OptionsColumn.AllowMerge = model.CanMerge ? DefaultBoolean.True : DefaultBoolean.False; //gridView.OptionsSelection.MultiSelect=true; if (model.CanMerge) gridView.OptionsView.AllowCellMerge = true; if (model.FieldType == ControlType.LabPic) { ImageList.Add(model.FieldName); } //gridView.OptionsView.AllowCellMerge = gridView.OptionsView.AllowCellMerge; if (!string.IsNullOrWhiteSpace(model.TitleColor)) { gridColumn.AppearanceHeader.Options.UseForeColor = true; gridColumn.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(model.TitleColor); } if (EnabledChangeColor) { if (!model.Edit) { gridColumn.AppearanceHeader.Options.UseForeColor = true; gridColumn.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } if (model.CanNull) { gridColumn.AppearanceHeader.Options.UseForeColor = true; gridColumn.AppearanceHeader.ForeColor = RequiredForceColor; } } if (model.DataAlignment > 0) { gridColumn.AppearanceCell.Options.UseTextOptions = true; gridColumn.AppearanceCell.TextOptions.HAlignment = model.DataAlignment == 1 ? DevExpress.Utils.HorzAlignment.Center : DevExpress.Utils.HorzAlignment.Far; } //if (!string.IsNullOrEmpty(model.FontName)) //{ // gridColumn.AppearanceCell.Options.UseFont = true; // gridColumn.AppearanceCell.Font = new System.Drawing.Font(model.FontName, gridColumn.AppearanceCell.Font.Size); //} //修改字体控制 if (!string.IsNullOrEmpty(model.FontName) || model.FontSize != 0) { //gridColumn.AppearanceCell.Options.UseFont = true;//设置后数值和英文会加粗,2026-3-17 注释 //gridColumn.AppearanceCell.Font = new System.Drawing.Font(model.FontName, gridColumn.AppearanceCell.Font.Size); gridColumn.AppearanceCell.Font = new System.Drawing.Font(string.IsNullOrEmpty(model.FontName) ? gridColumn.AppearanceCell.Font.Name : model.FontName, model.FontSize == 0 ? gridColumn.AppearanceCell.Font.Size : model.FontSize); gridColumn.AppearanceHeader.Font = new System.Drawing.Font(string.IsNullOrEmpty(model.FontName) ? gridColumn.AppearanceHeader.Font.Name : model.FontName, model.FontSize == 0 ? gridColumn.AppearanceHeader.Font.Size : model.FontSize); gridColumn.AppearanceHeader.Options.UseFont = true; } if (model.IsFixColumn == 1) { gridColumn.Fixed = FixedStyle.Left; } //工具中设置的冻结列 if (model.FrozenFlag) { FrozenColumns.Add(gridColumn); } if (!string.IsNullOrEmpty(model.AutoPadDataReleColName)) { AutoPadDataReleColList.Add(model); } // 创建列 this.InitEditColumns(gridColumn, model); // 设置列格式化、汇总 this.SetColumnFormat(gridColumn, model); this.SetColumnSumming(gridColumn, model); this.gridView.Columns.Add(gridColumn); this.ColumnList.Add(model); if (model.RepeatedVerification) { this.RepeatedVerificationNames.Add(model.FieldName); } if (model.FieldType == 9) { gridColumn.AppearanceCell.TextOptions.VAlignment = VertAlignment.Center; gridColumn.AppearanceCell.TextOptions.WordWrap = WordWrap.Wrap; } if (!string.IsNullOrWhiteSpace(model.PromptText)) { PromptMessage.Add(model.FieldName, model.PromptText); } if (!string.IsNullOrWhiteSpace(model.ColumnAnnotation)) { gridColumn.ToolTip = model.ColumnAnnotation; } } if (Model != null) { if (!Model.DataCaches.GetValue(this, "RightMenuBtn", out DataTable rightMentTab)) { if (this.Model != null) { rightMentTab = BaseModuleImpl.GetBaseGridRightMenus(this.Model.ModuleCode); } } //左侧如果配置表格,也和出现和主表一样的操作列。先限制为左侧固定不加载(要加载的话要获取左侧的fieldKey) if (this.Model != null && BaseModuleImpl.IsGridViewRightMenuBtnEdit(rightMentTab) && !customColumKey.Contains("BaseLeftGridView_")) { this.InitRightMenuBtnEdit(); } } if (Model != null && !Model.DataCaches.GetValue(this, "CustomColumnByDatabase", out DataTable customTable)) { customTable = this.gridView.GetCustomColumnByDatabase(this.CustomColumKey); this.SetCustomColumns(customTable); } else { DataTable customTableNew = this.gridView.GetCustomColumnByDatabase(this.CustomColumKey); this.SetCustomColumns(customTableNew); } //冻结 foreach (GridColumn item in FrozenColumns) { item.Fixed = FixedStyle.Left; } Console.WriteLine(DateTime.Now); // 延迟加载数据源 this.mTimer.Tick += new EventHandler(mTimerTick); this.mTimer.Start(); } /// /// 获取数据源缓存 /// /// /// public void GetDataCaches(Dictionary cachesDic, string customColumKey = "") { Task dynamicModelTask = cachesDic.GetTask(this, "DynamicModel"); //Task existsSettingTableTask = cachesDic.AddTask(this, "HasExistsSettingTable", new Task(() => //{ // return BaseImpl.HasExistsTable(ResourceKeys.SettingTableName); //})); Task setBaseGridRightMenusTask = cachesDic.AddTask(this, "RightMenuBtn", new Task(() => { DataTable dataTable = null; if (dynamicModelTask != null) { dataTable = BaseModuleImpl.GetBaseGridRightMenus(dynamicModelTask.Result.ModuleCode); } return dataTable; })); Task customColumnByDatabaseTask = cachesDic.AddTask(this, "CustomColumnByDatabase", new Task(() => { return this.GridView.GetCustomColumnByDatabase(customColumKey); })); } /// /// 说明:设置表格数据 /// 创建人:龚宇超 /// 创建日期:2018-01-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The table. public virtual void SetGridViewDataSource(DataTable table, bool selectRowHandler = true) { try { if (AllowClearColumns && (this.ColumnList == null || this.ColumnList.Count == 0)) { if (this is BandedGridControlEx) { BandedGridView bandedGridView = this.GridView as BandedGridView; bandedGridView.Bands.Clear(); bandedGridView.Columns.Clear(); } else { this.gridView.Columns.Clear(); } } if (table != null && this.gridView.Columns.Count > 0) { foreach (DataColumn column in table.Columns) { GridColumn gcolum = this.gridView.Columns.FirstOrDefault(x => x.FieldName.Equals(column.ColumnName, StringComparison.OrdinalIgnoreCase)); if (gcolum != null) column.ColumnName = gcolum.FieldName; } } //多表格设置数据源列名大小写 if (this is BandedGridControlEx) { BandedGridView bandedGridView = this.GridView as BandedGridView; if (table != null && bandedGridView.Columns.Count > 0) { foreach (DataColumn column in table.Columns) { GridColumn gcolum = bandedGridView.Columns.FirstOrDefault(x => x.FieldName.Equals(column.ColumnName, StringComparison.OrdinalIgnoreCase)); if (gcolum != null) column.ColumnName = gcolum.FieldName; } } } if (table != null && !table.Columns.Contains("RightMenuBtnEdit") && this.gridView.Columns.Where(n => n.FieldName.Equals("RightMenuBtnEdit")).Count() > 0) { table.Columns.Add("RightMenuBtnEdit"); } if (ParentControl != null)//刷新mrp按钮状态 { foreach (GridRightMenuModel menuModel in ParentControl.mrpBtnDic.Keys) { SimpleButton simpleButton = ParentControl.mrpBtnDic[menuModel]; if (menuModel.PrivilegeOper.Length > 1 && !menuModel.PrivilegeOper.Contains(ERPInfo.Instance.UserName + ",")) { simpleButton.Enabled = false; } else { if (!string.IsNullOrWhiteSpace(menuModel.MenuCond)) { try { string cond = ReplaceHelper.ReplaceUserInfo(menuModel.MenuCond); if (ParentControl != null) cond = ParentControl.ReplaceParentControlValue(cond); if (this.GridView != null) { GridCell[] cells = this.GridView.GetSelectedCells(); if (cells != null && cells.Length > 0 && cond.Contains("{COLUMN_")) { GridCell cell = cells[0]; DataRow focusedRow = this.GridView.GetFocusedDataRow(); string colValue = focusedRow == null || !focusedRow.Table.Columns.Contains(cell.Column.Name) ? "" : focusedRow[cell.Column.Name] + ""; cond = cond.ReplaceColumnParam(cell.Column.Name, cell.Column.Caption, colValue); } } simpleButton.Enabled = ReplaceHelper.EvalCond(cond); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(ResourceKeys.SetRightMenuCondFault + "\r\n" + Message); break; } } } } } this.ClearImage(); this.GridControl.DataSource = table; this.AdjustIndicatorWidthSmart(); //modifyThePosition.Clear(); this.SetAutoColumns(); if (selectRowHandler) this.gridView.SelectRowHandler(this.gridView.FocusedRowHandle); } catch (Exception ex) { LogUtil.WriteError("设置审核表格数据出错!", ex); } } /// /// 说明:设置表格数据 /// 创建人:龚宇超 /// 创建日期:2018-10-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The adapter. /// if set to true [select row handler]. /// System.Int32. public virtual int SetGridViewDataSource(DbDataAdapter adapter, bool selectRowHandler = true) { if (adapter == null) return 0; try { this.AdapterObj = adapter; DataSet dataSet = new DataSet(); // 重连配置 int maxRetryCount = 2; // 次数 int retryDelay = 1000; // 等待时间 for (int i = 0; i < maxRetryCount; i++) { try { adapter.Fill(dataSet, "SetGridViewDataSource"); break;//连接成功 } catch (SqlException ex) { // 判断是否是连接相关错误 if (IsConnectionError(ex.Number) || ex.Message.Contains("物理连接不可用") || ex.Message.Contains("传输级错误")) { if (i < maxRetryCount - 1) { SqlConnection.ClearAllPools(); System.Threading.Thread.Sleep(retryDelay); continue; // 重试 } else { // 最后一次重试失败,抛出错误 throw new Exception($"经过 {maxRetryCount} 次重试后仍无法连接到数据库: {ex.Message}", ex); } } else { // 其他SQL错误直接抛出 throw; } } } if (this.ColumnList == null || this.ColumnList.Count == 0) { if (this is BandedGridControlEx) { BandedGridView bandedGridView = this.GridView as BandedGridView; bandedGridView.Bands.Clear(); bandedGridView.Columns.Clear(); } else { this.gridView.Columns.Clear(); } } DbCommandBuilder cb = SqlHelper.dbFactory.CreateCommandBuilder(); cb.DataAdapter = this.AdapterObj; //this.GridControl.DataSource = dataSet.Tables[0]; //解决大小写问题后在赋值 DataTable dt = dataSet.Tables[0]; if (dt != null && this.gridView.Columns.Count > 0) { foreach (DataColumn column in dt.Columns) { GridColumn gcolum = this.gridView.Columns.FirstOrDefault(x => x.FieldName.Equals(column.ColumnName, StringComparison.OrdinalIgnoreCase)); if (gcolum != null) column.ColumnName = gcolum.FieldName; } } //多表格设置数据源列名大小写 if (this is BandedGridControlEx) { BandedGridView bandedGridView = this.GridView as BandedGridView; if (dt != null && bandedGridView.Columns.Count > 0) { foreach (DataColumn column in dt.Columns) { GridColumn gcolum = bandedGridView.Columns.FirstOrDefault(x => x.FieldName.Equals(column.ColumnName, StringComparison.OrdinalIgnoreCase)); if (gcolum != null) column.ColumnName = gcolum.FieldName; } } } if (dt != null && !dt.Columns.Contains("RightMenuBtnEdit") && this.gridView.Columns.Where(n => n.FieldName.Equals("RightMenuBtnEdit")).Count() > 0) { dt.Columns.Add("RightMenuBtnEdit"); } this.ClearImage(); this.GridControl.DataSource = dt; this.AdjustIndicatorWidthSmart(); //modifyThePosition.Clear(); // 动态列处理 this.SetAutoColumns(); if (selectRowHandler) this.gridView.SelectRowHandler(this.gridView.FocusedRowHandle); return dataSet.Tables[0] != null ? dataSet.Tables[0].Rows.Count : 0; } catch (Exception ex) { MessageUtil.Show(ex); } return 0; } /// /// 判断是否是连接相关的错误代码 /// protected virtual bool IsConnectionError(int errorNumber) { // 常见的连接相关错误代码 int[] connectionErrorNumbers = { 10053, 10054, 10060, 10061, // 网络相关错误 4060, 18456, // 登录相关错误 2, 53 // 服务器不存在或无法访问 }; return Array.IndexOf(connectionErrorNumbers, errorNumber) >= 0; } /// /// 说明:计算列关联字段 /// 创建人:龚宇超 /// 创建日期:2017-12-18 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The field value. protected virtual void SetUnionValue(GridColumnModel model, string fieldValue, int RowHandle) { DataTable table = this.gridControl.DataSourceTable(); //DataRow rowItem = this.gridView.FocusedRowHandle == RowHandle || RowHandle < 0 ? this.gridView.GetFocusedDataRow() : table.Rows[RowHandle]; DataRow rowItem = table.Rows.Count == 0 || this.gridView.FocusedRowHandle < 0 ? this.gridView.GetFocusedDataRow() : this.gridView.FocusedRowHandle == RowHandle || RowHandle < 0 ? this.gridView.GetFocusedDataRow() : table.Rows[RowHandle]; //DataRow rowItem = this.gridView.GetFocusedDataRow(); string unionValues = model.UnionValues; if (rowItem != null && model != null) { unionValues = ReplaceHelper.ReplaceRowParam(rowItem, unionValues.Replace("{" + model.FieldName + "}", fieldValue)); if (this.ParentControl != null) unionValues = ParentControl.ReplaceParentControlValue(unionValues); try { string[] fields = model.UnionFields.Trim().Trim(',').Split(','); DataRow rowResult = BaseImpl.GetDataRowResult(unionValues); if (rowResult != null) { for (int i = 0; i < fields.Length; i++) { string field = fields[i]; string value = rowResult.Table.Columns.Contains(field) ? rowResult[field] + "" : null; rowItem[field] = value; } } else { // 设置为空 for (int i = 0; i < fields.Length; i++) { string field = fields[i]; rowItem[field] = DBNull.Value; } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); LogUtil.WriteError("计算列关联字段--错误-->" + unionValues, ex); } } } /// /// 说明:计算列计算公式 /// 创建人:龚宇超 /// 创建日期:2017-12-18 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The field value. protected virtual void SetCalcValue(GridColumnModel model, string fieldValue, int RowHandle) { if (this.GridSumming) return; this.GridSumming = true; try { DataTable table = this.gridControl.DataSourceTable();//this.gridView.FocusedRowHandle == RowHandle || RowHandle < 0 ? this.gridView.GetFocusedDataRow() : table.Rows[RowHandle]; DataRow rowItem = table.Rows.Count == 0 || this.gridView.FocusedRowHandle < 0 ? this.gridView.GetFocusedDataRow() : this.gridView.FocusedRowHandle == RowHandle || RowHandle < 0 ? this.gridView.GetFocusedDataRow() : table.Rows[RowHandle]; if (rowItem != null && model != null) { foreach (GridColumn col in this.gridView.Columns) { GridColumnModel colModel = col.Tag as GridColumnModel; if (colModel == null) continue; string defultValue = colModel.DefaultValue; if (colModel.FieldType == 7 && rowItem.Table.Columns.Contains(col.FieldName) && string.IsNullOrEmpty(rowItem[col.FieldName] + "") && !string.IsNullOrEmpty(colModel.DefaultValue)) { defultValue = ReplaceHelper.ReplaceUserInfo(colModel.DefaultValue); if (ParentControl != null) defultValue = ParentControl.ReplaceParentControlValue(defultValue); if (defultValue.StartsWith("@")) { defultValue = BaseImpl.GetDefaultValue(ReplaceHelper.ReplaceRowParam(rowItem, defultValue)); } if (IsNumberic(defultValue)) rowItem[col.FieldName] = defultValue;//colModel.DefaultValue; } } List calcModels = this.ColumnList.FindAll(x => !string.IsNullOrEmpty(x.CalcExpr)).OrderBy(y => y.CalcOrder).ToList(); foreach (GridColumnModel gridModel in calcModels) { // 计算顺序小于当前控件则不计算 if (gridModel.CalcOrder < model.CalcOrder) continue; if (!gridModel.FieldName.Equals(model.FieldName, StringComparison.OrdinalIgnoreCase)) { bool isTruncate = false; string calcExpr = gridModel.CalcExpr; if (calcExpr.StartsWith("@truncate:")) { calcExpr = calcExpr.Substring(10); isTruncate = true; } try { if (this.ParentControl != null) calcExpr = ParentControl.ReplaceParentControlValue(calcExpr); string result = string.Empty; if (calcExpr.StartsWith("@")) { result = BaseImpl.GetDefaultValue(ReplaceHelper.ReplaceRowParam(rowItem, calcExpr)); } else { calcExpr = ReplaceHelper.ReplaceRowParam(rowItem, calcExpr); //EvalHelper.Eval2(ReplaceHelper.ReplaceEvalCond(calcExpr)) + "" object evalResult = EvalHelper.Eval2(ReplaceHelper.ReplaceEvalCond(calcExpr)); result = JsonConvert.SerializeObject(evalResult); if (result.Contains("E") || result.Contains("e")) { result = ChangeDataToD(result).ToString("0.########"); } } if (isTruncate) { result += result.Contains(".") ? "0000000000" : ".0000000000"; rowItem[gridModel.FieldName] = result.Substring(0, result.IndexOf(".")) + result.Substring(result.IndexOf("."), model.Decimals + 1); //this.gridView.SetRowCellValue(this.gridView.FocusedRowHandle, this.gridView.Columns[gridModel.FieldName], result.Substring(0, result.IndexOf(".")) + result.Substring(result.IndexOf("."), model.Decimals + 1)); } else { try { double d = 0; if (!string.IsNullOrEmpty(result) && !"NaN".Equals(result, StringComparison.OrdinalIgnoreCase) && !"非数字".Equals(result, StringComparison.OrdinalIgnoreCase) && !"undefined".Equals(result, StringComparison.OrdinalIgnoreCase) && result != "∞" && result != "-∞" && !"正无穷大".Equals(result, StringComparison.OrdinalIgnoreCase) && !"负无穷大".Equals(result, StringComparison.OrdinalIgnoreCase) && double.TryParse(result, out d)) { if (string.IsNullOrEmpty(gridModel.DataFormat)) { result = Math.Round(Convert.ToDouble(d), model.Decimals, MidpointRounding.AwayFromZero) + ""; } else { //计算后先执行保存小数位数 if (SystemInfo.Instance.ComputeFormatting) result = string.Format("{0:" + gridModel.DataFormat + "}", Convert.ToDecimal(result)); } if (model.FieldType == 7 && result.Contains('%')) { result = (double.Parse(result.Replace("%", "")) * 0.01).ToString(); } if (string.IsNullOrEmpty(result)) { rowItem[gridModel.FieldName] = DBNull.Value; } else { rowItem[gridModel.FieldName] = result; } // 判断计算列有无关联值 GridColumnModel UnionModel = calcModels.FirstOrDefault(x => x.FieldName == gridModel.FieldName); if (!string.IsNullOrEmpty(UnionModel.UnionFields)) { this.SetUnionValue(UnionModel, rowItem[gridModel.FieldName] + "", RowHandle); } //this.gridView.SetRowCellValue(this.gridView.FocusedRowHandle, this.gridView.Columns[gridModel.FieldName], result); } } catch (Exception) { } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); LogUtil.WriteError("计算列计算公式--错误-->" + rowItem[gridModel.FieldName], ex); } } } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); // MessageUtil.Show(Message,ex.Message); } finally { this.GridSumming = false; } } /// /// 说明:把科学计数转换为小数格式 /// 创建人:曹屹峰 /// 创建日期:2021-10-14 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private Decimal ChangeDataToD(string strData) { Decimal dData = 0.0M; if (strData.Contains("E")) { dData = Decimal.Parse(strData, System.Globalization.NumberStyles.Float); } return dData; } /// /// 说明:默认取上一行某字段值 /// 创建人:王一帆 /// 创建日期:2020-07-03 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The field value. protected virtual void SetUpperValue(GridColumnModel model, int RowHandle, string fieldValue, bool isUpperChage = true) { try { string ItemValue = string.Empty; string UpperFieldName = string.Empty; if (model != null) { List calcModels = this.ColumnList.FindAll(x => (x.DefaultValue + "").Contains("{ROW_")).OrderBy(y => y.CalcOrder).ToList(); foreach (GridColumnModel gridModel in calcModels) { this.UpperChange(model, gridModel, RowHandle); } } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); } } /// /// 说明:取得 /// 创建人:王一帆 /// 创建日期:2020-07-03 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The field value. public void UpperChange(GridColumnModel model, GridColumnModel gridModel, int RowHandle) { DataTable Table = this.gridControl.DataSourceTable(); DataRow rowItem = this.GridView.GetDataRow(RowHandle); string UpperFieldName = ReplaceHelper.GetParamFields(gridModel.DefaultValue)[0]; UpperFieldName = UpperFieldName.Replace("}", "").Replace("{", ""); UpperFieldName = UpperFieldName.Substring(UpperFieldName.IndexOf('_') + 1); if (string.IsNullOrWhiteSpace(rowItem[gridModel.FieldName] + "") || this.gridView.FocusedRowHandle != RowHandle) { if (Table.Rows.Count > 0 && Table.Columns.Contains(ERPInfo.Instance.isAddRows)) { DataRow lastRow = Table.Rows[Table.Rows.Count - 1]; if (RowHandle > 0) { lastRow = Table.Rows[RowHandle - 1]; } if (rowItem[ERPInfo.Instance.isAddRows] + "" != "1") { rowItem[gridModel.FieldName] = gridModel.DefaultValue.StartsWith("@") ? BaseImpl.GetDefaultValue(ReplaceHelper.ReplaceParamToValue(gridModel.DefaultValue, lastRow[UpperFieldName] + "")) : rowItem[gridModel.FieldName] = lastRow[UpperFieldName] + ""; } rowItem[ERPInfo.Instance.isAddRows] = "1"; } if (!string.IsNullOrEmpty(gridModel.UnionFields)) { this.SetUnionValue(gridModel, rowItem[gridModel.FieldName] + "", RowHandle); } // 计算规则配置在结果字段上,所以无需验证当前操作控件 this.SetCalcValue(model, rowItem[gridModel.FieldName] + "", RowHandle); } string[] fields = !string.IsNullOrEmpty(gridModel.UnionFields) ? gridModel.UnionFields.Trim(',').Split(',') : new string[] { }; if (RowHandle >= 0 && RowHandle < Table.Rows.Count - 1 && ((fields.Contains(model.FieldName)) || model.FieldName == UpperFieldName || model.FieldName == gridModel.FieldName)) { if (Table.Columns.Contains(ERPInfo.Instance.isAddRows)) { Table.Rows[RowHandle + 1][ERPInfo.Instance.isAddRows] = 0; } this.OnGridViewtUpperValueChanged(this.gridView.Columns[gridModel.FieldName], Table.Rows[RowHandle + 1][gridModel.FieldName] + "", RowHandle + 1, gridModel); //this.OnGridViewCellValueChanged(this.gridControl, new CellValueChangedEventArgs(RowHandle + 1, this.gridView.Columns[gridModel.FieldName], Table.Rows[RowHandle + 1][gridModel.FieldName] + "")); } } /// /// 说明:禁用控件条件 /// 创建人:龚宇超 /// 创建日期:2019-01-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The model. /// The field value. protected virtual void SetDisableColumn(GridColumnModel model, int rowHandler, string fieldValue) { //if (model.DisableCond != null) //{ // GridColumnModel[] columns = this.ColumnList.Where(x => x.DisableCond.Contains("{" + model.FieldName + "}")).ToArray(); // DataRow rowItem = this.gridView.GetDataRow(rowHandler); // foreach (GridColumnModel item in columns) // { // try // { // string disableCond = ReplaceHelper.ReplaceRowParam(rowItem, item.DisableCond.Replace("{" + model.FieldName + "}", fieldValue)); // string diaableType = item.DisableType; // //this.gridView.Columns.ColumnByFieldName(model.FieldName).OptionsColumn.AllowEdit = ("true".Equals(EvalHelper.Eval(ReplaceHelper.ReplaceEvalCond(disableCond)) + "", StringComparison.OrdinalIgnoreCase)); // this.gridView.Columns.ColumnByFieldName(model.FieldName).OptionsColumn.AllowEdit = ("true".Equals(ValidateCond(disableCond, null) + "", StringComparison.OrdinalIgnoreCase)); // } // catch (Exception) // { // } // } //} if (!string.IsNullOrEmpty(model.EnableCond)) { GridColumnModel[] columns = this.ColumnList.Where(x => x.EnableCond.Contains("{" + model.FieldName + "}")).ToArray(); DataRow rowItem = this.gridView.GetDataRow(rowHandler); foreach (GridColumnModel item in columns) { try { string disableCond = ReplaceHelper.ReplaceRowParam(rowItem, item.EnableCond.Replace("{" + model.FieldName + "}", fieldValue)); string diaableType = item.DisableType; //this.gridView.Columns.ColumnByFieldName(model.FieldName).Visible = ("true".Equals(EvalHelper.Eval(ReplaceHelper.ReplaceEvalCond(disableCond)) + "", StringComparison.OrdinalIgnoreCase)); this.gridView.Columns.ColumnByFieldName(model.FieldName).Visible = ("true".Equals(ValidateCond(disableCond, null) + "", StringComparison.OrdinalIgnoreCase)); //设置编辑状态 //this.gridView.Columns.ColumnByFieldName("").OptionsColumn.AllowEdit = true; } catch (Exception) { } } } } /// /// 说明:设置自定义列 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected virtual void SetCustomColumns(DataTable customTable, bool isInit = true) { Dictionary dataCaches = Model != null ? Model.DataCaches : null; //if (!dataCaches.GetValue(this, "HasExistsSettingTable", out bool hasExistsSettingTable)) //{ // hasExistsSettingTable = BaseImpl.HasExistsTable(ResourceKeys.SettingTableName); //} if (string.IsNullOrEmpty(this.CustomColumKey) || customTable.Columns.Count == 0)//!hasExistsSettingTable { return; } if (customTable != null && customTable.Rows.Count > 0) { int MaxIndex = customTable.Columns.Count; foreach (DataRow rowItem in customTable.Rows) { string fieldName = rowItem["fieldName"] + ""; int.TryParse(rowItem["fieldWidth"] + "", out int fieldWidth); //int.TryParse(rowItem["orderid"] + "", out int index); //2025-02-20 依米康把orderid字段类型改成了decimal(18, 2),不能int.TryParse直接转换 int index = Convert.ToInt32(Math.Round(double.Parse(rowItem["orderid"] + ""))); bool visible = "1".Equals(rowItem["isVisible"] + "") && fieldWidth > 0; bool isFix = "True".Equals(rowItem["IfFixColumn"] + "", StringComparison.OrdinalIgnoreCase); string FilterInfo = rowItem.Table.Columns.Contains("FilterInfo") ? rowItem["FilterInfo"] + "" : "";//列筛选条件 GridColumnModel column = this.ColumnList.Find(x => x.FieldName == fieldName); GridColumn gridColumn = this.gridView.Columns.ColumnByName(fieldName); if (column != null && !string.IsNullOrEmpty(fieldName) && gridColumn != null && gridColumn.Visible && gridColumn.Width > 0) { GridColumn colObj = this.gridView.Columns[fieldName]; colObj.VisibleIndex = index; colObj.Width = fieldWidth; colObj.Visible = visible; colObj.Fixed = isFix ? FixedStyle.Left : FixedStyle.None; if (!string.IsNullOrWhiteSpace(FilterInfo)) colObj.FilterInfo = new ColumnFilterInfo(FilterInfo); } } //是否显示筛选器行 if (customTable.Columns.Contains("DisplayFiltering") && "1".Equals(customTable.Rows[0]["DisplayFiltering"] + "")) this.gridView.OptionsView.ShowAutoFilterRow = true; //分组序号 if (customTable.Columns.Contains("GroupIndex")) { DataRow[] dataRows = customTable.Select("GroupIndex>-1"); for (int i = 0; i < dataRows.Length; i++) { DataRow row = dataRows.Cast().FirstOrDefault(x => Convert.ToInt32(x["GroupIndex"] + "") == i); if (row != null) { string fieldName = row["fieldName"] + ""; int GroupIndex = row.Table.Columns.Contains("GroupIndex") ? Convert.ToInt32(row["GroupIndex"] + "") : -1; GridColumnModel column = this.ColumnList.Find(x => x.FieldName == fieldName); GridColumn gridColumn = this.gridView.Columns.ColumnByName(fieldName); if (column != null && !string.IsNullOrEmpty(fieldName) && gridColumn != null && gridColumn.Visible && gridColumn.Width > 0) { GridColumn colObj = this.gridView.Columns[fieldName]; if (GroupIndex > -1) { colObj.GroupIndex = GroupIndex; this.gridView.OptionsView.ShowGroupPanel = true; } } } // 隐藏分组面板 this.gridView.OptionsView.ShowGroupPanel = false; // 展开所有分组 this.gridView.OptionsBehavior.AutoExpandAllGroups = true;//展开所有分组 } } foreach (GridColumn col in this.gridView.Columns) { DataRow a = customTable.Rows.Cast().FirstOrDefault(x => col.Name.Equals(x["fieldName"] + "", StringComparison.OrdinalIgnoreCase)); if (a == null) { bool visible = col.Visible;//获取设置VisibleIndex之前列的状态 col.VisibleIndex = MaxIndex; MaxIndex += 1; col.Visible = visible; } } } if (!isInit) { // 非初始化,假如未配置则初始化到系统配置 for (int i = 0; i < this.ColumnList.Count; i++) { GridColumnModel column = this.ColumnList[i]; if (this.gridView.Columns.ColumnByName(column.FieldName) != null) { GridColumn colObj = this.gridView.Columns[column.FieldName]; colObj.VisibleIndex = i; colObj.Width = column.Width; colObj.Visible = column.Visible; } } } } /// /// 说明:设置动态列 /// 创建人:龚宇超 /// 创建日期:2019-06-03 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected virtual void SetAutoColumns() { if (this.ColumnList == null || this.ColumnList.Count == 0) { bool isShowFooter = false; List autoFixColumns = new List(); for (int i = 0; i < gridView.Columns.Count; i++) { try { GridColumn col = gridView.Columns[i]; col.OptionsFilter.AutoFilterCondition = AutoFilterCondition.Contains; col.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; if (col.FieldName.Contains("_")) { string[] colSplit = col.FieldName.Split('_'); if (colSplit.Length >= 2) { col.Caption = colSplit[0]; col.Width = Convert.ToInt32(colSplit[1]); if (Convert.ToInt32(colSplit[1]) == 0) col.Visible = false; if (colSplit.Length > 2) { bool visible = "1".Equals(colSplit[2]); // 设置底部合计 if (col.VisibleIndex == 0) { isShowFooter = true; col.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Count, col.FieldName, TotalFormat) }); if (SystemInfo.Instance.GroupSpecialMode) { //gridView.GroupSummary.Add(new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Count, col.FieldName, null, "合计: {0:#,###}行")); gridView.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; } else { gridView.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Count, col.FieldName, null, TotalFormat) }); } } else { if (visible) { isShowFooter = true; string dataFormat = colSplit.Length > 3 ? colSplit[3] : ""; col.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(SummaryItemType.Sum, col.FieldName, "{0:" + dataFormat + "}") }); if (SystemInfo.Instance.GroupSpecialMode) { gridView.GroupSummary.Add(new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Sum, col.FieldName, col, "{0:" + dataFormat + "}")); gridView.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; } else { gridView.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(SummaryItemType.Sum, col.FieldName, null, "{0:" + dataFormat + "}") }); } } } if (colSplit.Length > 3) { string dataFormat = colSplit[3]; if (!string.IsNullOrWhiteSpace(dataFormat)) { col.DisplayFormat.FormatType = FormatType.Custom; col.DisplayFormat.FormatString = dataFormat; } } if (colSplit.Length > 4) { // 是否冻结列:1冻结 if ("1".Equals(colSplit[4])) { autoFixColumns.Add(col); } } } } } else { col.Width = 150; } gridView.OptionsView.ShowFooter = isShowFooter; } catch (Exception) { } } foreach (GridColumn col in autoFixColumns.Where(x => x.Visible && x.Width > 0)) { col.Fixed = FixedStyle.Left; } } } /// /// 说明:设置表格提示框(自带提示框有提示信息不全的问题) /// 创建人:曹屹峰 /// 创建日期:2021-11-11 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void MainGvTool_BeforeShow(object sender, ToolTipControllerShowEventArgs e) { DevExpress.Utils.ToolTipController toolTipController = (DevExpress.Utils.ToolTipController)sender; GridControl control = toolTipController.ActiveControlClient as GridControl; if (control == null) return; GridView gridView = control.MainView as GridView; GridHitInfo hitInfo = GridView.CalcHitInfo(gridView.GridControl.PointToClient(System.Windows.Forms.Control.MousePosition)); if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != GridHitTest.RowCell) { return; } if (hitInfo.Column.FieldName.Equals("RightMenuBtnEdit"))//操作列提示信息显示 { e.ToolTip = e.ToolTip; } else//否则显示单元格值 { DataRow row = this.GridView.GetDataRow(hitInfo.RowHandle); e.ToolTip = row[hitInfo.Column.FieldName].ToString(); } } /// /// 说明:设置表格行高、行字体大小(默认微软雅黑) /// 创建人:龚宇超 /// 创建日期:2019-11-11 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void SetGridRowHeightAndFont() { if (SystemInfo.Instance.GridRowFontSize > 0) { this.gridView.Appearance.Row.Font = new Font(this.gridView.Appearance.Row.Font.Name, SystemInfo.Instance.GridRowFontSize); this.gridView.Appearance.HeaderPanel.Font = new Font(this.gridView.Appearance.HeaderPanel.Font.Name, SystemInfo.Instance.GridRowFontSize); } if (!string.IsNullOrWhiteSpace(SystemInfo.Instance.GridFontName)) { this.gridView.Appearance.Row.Font = new Font(SystemInfo.Instance.GridFontName, this.gridView.Appearance.Row.Font.Size); this.gridView.Appearance.HeaderPanel.Font = new Font(SystemInfo.Instance.GridFontName, this.gridView.Appearance.HeaderPanel.Font.Size); } if (SystemInfo.Instance.GridRowHeight > 0) { this.gridView.ColumnPanelRowHeight = this.gridView.RowHeight = SystemInfo.Instance.GridRowHeight; } } /// /// 说明:验证表格列是否有为空的值 /// 创建人:龚宇超 /// 创建日期:2017-12-08 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// true if XXXX, false otherwise. public virtual bool VerifyNull() { DataTable table = this.GridControl.DataSourceTable().TrimEmptyRows(); List columns = this.ColumnList.FindAll(x => x.CanNull); foreach (DataRow item in table.Rows) { foreach (GridColumnModel model in columns) { GridColumn column = this.gridView.Columns[model.FieldName]; string value = item[model.FieldName] + ""; string displayText = this.gridView.GetDisplayTextByColumnValue(column, item[model.FieldName]); if (string.IsNullOrWhiteSpace(value) || string.IsNullOrWhiteSpace(displayText)) { MessageUtil.Show(string.Format(ResourceKeys.NullField, model.FieldText)); this.gridView.Focus(); this.gridView.SelectRowHandler(table.Rows.IndexOf(item)); this.gridView.FocusedColumn = this.gridView.Columns[model.FieldName]; this.gridView.SelectCell(gridView.FocusedRowHandle, this.gridView.Columns[model.FieldName]); this.gridView.ShowEditorByMouse(); return false; } } } return true; } /// /// 说明:冻结某一列 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void FixLeftItemClick(object sender, EventArgs e) { DXMenuItem item = sender as DXMenuItem; GridColumn column = item.Tag as GridColumn; column.Fixed = FixedStyle.Left; } /// /// 说明:冻结所有列 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void FixLeftAllItemClick(object sender, EventArgs e) { DXMenuItem item = sender as DXMenuItem; GridColumn column = item.Tag as GridColumn; foreach (GridColumn col in gridView.Columns) { if (col.AbsoluteIndex <= column.AbsoluteIndex) { col.Fixed = FixedStyle.Left; } } } /// /// 说明:取消冻结列 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void UnFixItemClick(object sender, EventArgs e) { DXMenuItem item = sender as DXMenuItem; GridColumn column = item.Tag as GridColumn; column.Fixed = FixedStyle.None; column.VisibleIndex = column.AbsoluteIndex; } /// /// 清除冻结(全部列) /// /// /// protected virtual void itemUnFixAllClick(object sender, EventArgs e) { foreach (GridColumn column in this.gridView.Columns) { column.Fixed = FixedStyle.None; } foreach (GridColumn column in this.gridView.Columns) { column.VisibleIndex = column.AbsoluteIndex; } } /// /// 说明:保存表格属性 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void SaveItemClick(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.CustomColumKey)) { MessageUtil.Show(ResourceKeys.NotSettingResetColumn); return; } if (this.ColumnList == null || this.ColumnList.Count == 0) { MessageUtil.Show("动态列无法保存属性"); return; } DataRow rowItem = null; bool success = BaseImpl.HasExistsDataRow(ResourceKeys.SettingTableName, "formKey", CustomColumKey.ToString(), string.Format(" and OperatorId='{0}' ", ERPInfo.Instance.UserId), out rowItem); if (!success) { MessageUtil.Show(ResourceKeys.NotFoundSettingColumnTable); return; } if (MessageUtil.Show(ResourceKeys.IsSaveColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) { try { if (rowItem == null) { success = this.gridView.SaveCustomColumnToDatabase(this.CustomColumKey); } else { success = this.gridView.UpdateCustomColumnToDatabase(this.CustomColumKey); } #region old if (ERPInfo.Instance.UserName == "管理员") { string[] keys = CustomColumKey.Split('_'); if (keys.Count() > 1) { string ModuleTypes = keys[0]; string ModuleKey = keys[1]; int ModelType = ControlType.ModelType(ModuleTypes); string tmpsql = string.Empty; string colTable = string.Empty; string keyField = string.Empty; string stepCode = string.Empty; int keyOrder = 0; //DXMenuItem item = sender as DXMenuItem; //GridView grv = item.Tag as GridView; //基础档案主表 if (ModelType == 1 || ModelType == 2) { colTable = "p_systemwordbooktab"; tmpsql = "select top 1 orderid from p_systemwordbooktab where formKey='" + ModuleKey + "' order by orderid"; object obj = SqlHelper.ExecuteScalar(CommandType.Text, tmpsql); if (obj != null) { keyField = "formKey"; keyOrder = Convert.ToInt32(obj); } } if (ModelType == 2 && string.IsNullOrEmpty(keyField)) { colTable = "p_systemDlltabDetailGrid"; tmpsql = "select top 1 orderid from p_systemDlltabDetailGrid where detailKey='" + ModuleKey + "' order by orderid"; object obj = SqlHelper.ExecuteScalar(CommandType.Text, tmpsql); if (obj != null) { keyField = "detailKey"; keyOrder = Convert.ToInt32(obj); } } ////单据明细 if (ModelType == 3) { colTable = "p_systembillDetail"; keyField = "typecode"; ModuleKey = Model.ModuleCode; } ////单据来源主信息 if (ModelType == 4) { colTable = "p_systembillsourcegrid"; keyField = "sourcekey"; } ////单据来源明细信息 if (ModelType == 5) { colTable = "p_systembillsourcedetail"; keyField = "sourcekey"; } //单据审核列表 if (ModelType == 6) { colTable = "p_systembillstepgrid"; keyField = "typeCode"; if (!string.IsNullOrEmpty(ModuleKey) && keys.Length == 5) { ModuleKey = keys[2]; stepCode = keys[3]; } } //基础档案审核列表 if (ModelType == 7) { colTable = "p_systemdlltabflowstepgrid"; keyField = "typeCode"; if (!string.IsNullOrEmpty(ModuleKey) && keys.Length == 5) { ModuleKey = keys[2]; stepCode = keys[3]; } } // 单据审核附加信息 if (ModelType == 8) { colTable = "p_systembillauditAttachDetail"; keyField = "attachKey"; } tmpsql = ""; if (ModelType != 0 && !string.IsNullOrEmpty(keyField)) { foreach (GridColumn col in gridView.Columns) { //+ ((ModelType == 1) && (col.VisibleIndex == -1) ? " ,vislble=1" : "") tmpsql = tmpsql + "update " + colTable + " set width=" + col.Width.ToString() + (col.VisibleIndex != -1 ? ",orderid=" + (col.VisibleIndex + keyOrder + (ModelType == 1 ? 1 : 0)).ToString() : "") + " where " + keyField + "='" + ModuleKey + "' and fieldname='" + col.FieldName + "'"; if (ModelType == 1 || ModelType == 2) tmpsql = tmpsql + " and orderid<>" + keyOrder.ToString(); if (ModelType == 7 || ModelType == 6) tmpsql = tmpsql + " and stepCode=" + stepCode; tmpsql = tmpsql + ";"; } //MessageBox.Show(tmpsql); SqlHelper.ExecuteNonQuery(tmpsql); } } } #endregion MessageUtil.Show(success ? ResourceKeys.SaveSuccess : ResourceKeys.SaveFault); } catch (SqlException sex) { if (sex.Message.Contains(ResourceKeys.FieldLenIsShort) && MessageUtil.Show(ResourceKeys.SaveFault + "\r\n" + ResourceKeys.CanUpgradeTable, MessageBoxButtons.YesNo) == DialogResult.Yes && BaseImpl.UpdateTableField(ResourceKeys.SettingTableName, "formKey", "varchar(200)")) { MessageUtil.Show(ResourceKeys.UpdateSuccess); } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } } /// /// 说明:保存表格属性 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void SaveItemClick2(object sender, EventArgs e) { if (this.ColumnList == null || this.ColumnList.Count == 0) { MessageUtil.Show("动态列无法保存属性"); return; } DataRow rowItem = null; bool success = BaseImpl.HasExistsDataRow(ResourceKeys.SettingTableName, "formKey", CurrentOperColumnKey, string.Format(" and OperatorId='{0}' ", ERPInfo.Instance.UserId), out rowItem); if (!success) { MessageUtil.Show(ResourceKeys.NotFoundSettingColumnTable); return; } if (MessageUtil.Show(ResourceKeys.IsSaveColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) { try { if (rowItem == null) { success = this.CurrentOperGridView.SaveCustomColumnToDatabase(this.CurrentOperColumnKey); } else { success = this.CurrentOperGridView.UpdateCustomColumnToDatabase(this.CurrentOperColumnKey); } MessageUtil.Show(success ? ResourceKeys.SaveSuccess : ResourceKeys.SaveFault); } catch (SqlException sex) { if (sex.Message.Contains(ResourceKeys.FieldLenIsShort) && MessageUtil.Show(ResourceKeys.SaveFault + "\r\n" + ResourceKeys.CanUpgradeTable, MessageBoxButtons.YesNo) == DialogResult.Yes && BaseImpl.UpdateTableField(ResourceKeys.SettingTableName, "formKey", "varchar(200)")) { MessageUtil.Show(ResourceKeys.UpdateSuccess); } } catch (Exception ex) { LogHelper.Instance.WriteError(ex); string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } CurrentOperColumnKey = ""; CurrentOperGridView = null; } /// /// 说明:重置表格属性 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void ResetItemClick(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(this.CustomColumKey)) { MessageUtil.Show(ResourceKeys.NotSettingResetColumn); return; } if (!BaseImpl.HasExistsTable(ResourceKeys.SettingTableName)) { MessageUtil.Show(ResourceKeys.NotFoundSettingColumnTable); return; } if (MessageUtil.Show(ResourceKeys.IsResetColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) { bool success = this.gridView.ResetCustomColumnToDatabase(this.CustomColumKey); DataTable customTable = this.gridView.GetCustomColumnByDatabase(this.CustomColumKey); this.SetCustomColumns(customTable, false); MessageUtil.Show(success ? ResourceKeys.ResetSuccess : ResourceKeys.ResetFault); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:重置表格属性 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void ResetItemClick2(object sender, EventArgs e) { try { if (!BaseImpl.HasExistsTable(ResourceKeys.SettingTableName)) { MessageUtil.Show(ResourceKeys.NotFoundSettingColumnTable); return; } if (MessageUtil.Show(ResourceKeys.IsResetColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) { bool success = this.CurrentOperGridView.ResetCustomColumnToDatabase(CurrentOperColumnKey); GridColumn gridColumn = gridView.Columns[CurrentOperModel.FieldName]; InitAutoSearchEdit(gridColumn, CurrentOperModel); MessageUtil.Show(success ? ResourceKeys.ResetSuccess : ResourceKeys.ResetFault); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 设置导出列 /// /// /// protected virtual void SetExportItemClick(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(this.CustomColumKey)) { MessageUtil.Show("未实现设置导出列功能,请联系朗速!"); return; } //导出设置表列名 Dictionary colDic = new Dictionary(); colDic.Add("formkey", "varchar(200)"); colDic.Add("fieldName", "varchar(50)"); colDic.Add("userName", "varchar(50)"); colDic.Add("OperatorId", "int"); colDic.Add("OperatorName", "varchar(50)"); colDic.Add("OperateDate", "datetime"); colDic.Add("isExport", "int"); string isExitTabSql = "select top 1 * from sysObjects where Id=OBJECT_ID(N'{0}') and xtype='U'"; isExitTabSql = string.Format(isExitTabSql, ResourceKeys.SettingExportTableName); DataTable isExitTab = SqlHelper.ExecuteDataTable(isExitTabSql); if (isExitTab.Rows.Count == 0)//不存在导出设置表 { string createTabSql = "create table {0} (id int IDENTITY(1,1) NOT NULL,{1})"; string createCol = string.Empty; foreach (KeyValuePair colunmField in colDic) { createCol += string.Format("{0} {1},", colunmField.Key, colunmField.Value); } createTabSql = string.Format(createTabSql, ResourceKeys.SettingExportTableName, createCol.TrimEnd(',')); SqlHelper.ExecuteNonQuery(createTabSql);//创建表 } if (!BaseImpl.HasExistsColumn(ResourceKeys.SettingExportTableName, "isExport"))//如果不存在isExport列 { string addColSql = string.Format("alter table {0} add {1} {2}", ResourceKeys.SettingExportTableName, "isExport", "int"); SqlHelper.ExecuteNonQuery(addColSql);//添加isExport列 } FrmSetExport frmSetExport = new FrmSetExport(this); frmSetExport.CustomColumKey = this.CustomColumKey; frmSetExport.ShowDialog(); frmSetExport.Dispose(); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:导出表格数据 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void ExportItemClick(object sender, EventArgs e) { try { this.gridControl.ToExcel(this.Model.FormText, false, this.CustomColumKey); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:打印表格数据 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void PrintItemClick(object sender, EventArgs e) { try { PrintUtil.Print(this.gridControl); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:清除全部列排序 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void ClearSortItemClick(object sender, EventArgs e) { try { this.gridView.Columns.ClearAllSort(); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:设置条件筛选列弹出设置 /// 创建人:王一帆 /// 创建日期:2021-08-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void InstColumnSift(object sender, EventArgs e) { try { DXMenuItem item = sender as DXMenuItem; GridColumn gridColumn = item.Tag as GridColumn; // 保存流转步骤 FilterState filterState = new FilterState(); filterState.LabelObj.Text = string.Format("设置列{0}筛选条件:", gridColumn.Caption); if (filterState.ShowDialog() == DialogResult.OK) { HeaderColumnSift = gridColumn; SiftEnumObj = filterState.SiftEnumObj; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:多功能设置列条件筛选 /// 创建人:王一帆 /// 创建日期:2021-08-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void Multifunction(object sender, EventArgs e) { try { //DataTable newDt = this.SetDealWithValueTab(); FrmGridSift frmGridSift = new FrmGridSift(); frmGridSift.CustomColumKey = this.CustomColumKey; //frmGridSift.source = newDt; frmGridSift.ParentGridEx = this; DllModule module = new DllModule { DllName = "", Id = this.Model.ModuleCode, Name = this.Model.FormText, BeforePage = ERPInfo.Instance.PageControl.SelectedTabPage }; module.ModuleForm = frmGridSift; string guid = Guid.NewGuid().ToString(); DevExpress.XtraTab.XtraTabPage tp = new DevExpress.XtraTab.XtraTabPage(); tp.Tag = guid; // 这个必须有不然会提示:"不能向tabControl中添加顶级控件" frmGridSift.TopLevel = false; frmGridSift.Location = new Point(0, 0); frmGridSift.Dock = DockStyle.Fill; frmGridSift.FormBorderStyle = FormBorderStyle.None; tp.Text = this.Model.FormText + "分组统计"; tp.AutoScroll = true; tp.AutoScroll = true; tp.Controls.Add(frmGridSift); tp.ShowCloseButton = DefaultBoolean.True; tp.Dock = DockStyle.Fill; ERPInfo.Instance.PageControl.TabPages.Add(tp); ERPInfo.Instance.PageControl.SelectedTabPage = tp; ERPInfo.Instance.ModuleForms.Add(guid, module); frmGridSift.Show(); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:根据显示值获取隐藏Value /// 创建人:王一帆 /// 创建日期:2022-11-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// public DataTable SetDealWithValueTab() { Dictionary ValueGridColumnTable = new Dictionary(); Dictionary LookupParentKey = new Dictionary(); DataTable dataTable = this.gridView.GetGridViewFilteredAndSortedDataToDataTable(); DataTable dtResult = new DataTable(); if (dataTable != null) { DataTable nowDt = dataTable.Copy(); foreach (DataColumn dataCol in nowDt.Columns) { GridColumn newColumn = this.gridView.Columns.FirstOrDefault(x => (dataCol.ColumnName + "").Equals(x.FieldName + "")); DataColumn newDataColumn = dataTable.Columns.Cast().FirstOrDefault(x => (dataCol.ColumnName + "").Equals(x.ColumnName + "")); if (newColumn == null) { dataTable.Columns.Remove(newDataColumn); } else { GridColumnModel model = newColumn.Tag as GridColumnModel; if (model.Visible) { dataTable.Columns[newDataColumn.ColumnName].ColumnName = newColumn.FieldName; dataTable.Columns[newDataColumn.ColumnName].Caption = newColumn.Caption; if (ControlType.IsValue(model.FieldType)) { string sqlValue = model.SqlSource; if (sqlValue.Contains(" #")) { //sqlValue = sqlValue.Replace("#", ""); Match m = Regex.Match(sqlValue, @"#([\s\S]*?)#"); //处理带参数上一级编码过滤问题,需在带参数sql中增加名称的父级字段 if (m.Success) { sqlValue = Regex.Replace(sqlValue, "#[^##]+#", " 1=1 "); LookupParentKey.Add(model.FieldName, m.Value.Replace("#", "")); } } ValueGridColumnTable.Add(model, BaseImpl.GetDataTableResult(sqlValue)); } } else { dataTable.Columns.Remove(newDataColumn); } } } //克隆表结构 dtResult = dataTable.Clone(); //修改数据列类型 foreach (DataColumn col in dtResult.Columns) { col.DataType = typeof(string); } foreach (DataRow dataRow in dataTable.Rows) { DataRow rowNew = dtResult.NewRow(); foreach (DataColumn datacol in dataTable.Columns) { rowNew[datacol.ColumnName] = dataRow[datacol.ColumnName] + ""; } dtResult.Rows.Add(rowNew); } foreach (DataRow dataRow in dtResult.Rows) { foreach (GridColumnModel item in ValueGridColumnTable.Keys) { if (!string.IsNullOrWhiteSpace(dataRow[item.FieldName] + "")) { DataTable table = ValueGridColumnTable[item]; DataRow rowItemValue = table.Rows.Cast().FirstOrDefault(x => x[item.ValueMember] + "" == dataRow[item.FieldName + ""] + ""); DataRow rowItemText = table.Rows.Cast().FirstOrDefault(x => x[item.ValueMember] + "" == dataRow[item.FieldName + ""] + ""); dataRow[item.FieldName + ""] = rowItemValue != null ? rowItemValue[item.TextMember] + "" : rowItemText != null ? rowItemText[item.TextMember] + "" : ""; } } } } return dtResult; } /// /// 说明:调用bs展示图表模块 /// 创建人:王一帆 /// 创建日期:2020-07-27 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void ChartShowClick(object sender, EventArgs e) { try { // 其它处理(如绑定左侧树结构数据) if (OnGridColumnCallDLL != null) this.OnGridColumnCallDLL("1"); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:调用bs展示图表模块 /// 创建人:王一帆 /// 创建日期:2020-07-27 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void BsChartShowClick(object sender, EventArgs e) { try { // 其它处理(如绑定左侧树结构数据) if (OnGridColumnCallDLL != null) this.OnGridColumnCallDLL("0"); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:所有表格属性设置 /// 创建人:王一帆 /// 创建日期:2020-12-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void InstAllColumn(object sender, EventArgs e) { try { string[] defaultArgs = string.Format(ModuleArgs.DefaultArgs, this.Model.FormText, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, this.Model.Privilege, this.Model.ModuleCode).Split('~'); string[] menuArgs = new string[] { Model.ModuleCode, CustomColumKey }; string[] args = defaultArgs.Concat(menuArgs).ToArray(); IForm form = FormHelper.LoadDllForm("Lskj.ToolSetNew.dll", args); DialogResult result = form.SubForm.ShowDialog(); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 查找指定列(定位到弹窗选中列) /// /// /// protected virtual void LookUpColumn(object sender, EventArgs e) { Dictionary columnInformation = new Dictionary(); foreach (GridColumn column in this.gridView.Columns) { if (column.Visible) { columnInformation.Add(column.FieldName, column.Caption); } } FrmPositioningColumn frmPositioningColumn = new FrmPositioningColumn(columnInformation); if (frmPositioningColumn.ShowDialog() == DialogResult.OK) { string columnNameToFind = frmPositioningColumn.FindName; GridColumn column = this.gridView.Columns.ColumnByFieldName(columnNameToFind); if (column != null) { this.gridView.FocusedColumn = column; // 让指定列获得焦点 if (this.gridView.FocusedRowHandle >= 0) { this.gridView.MakeRowVisible(this.gridView.FocusedRowHandle); //this.gridView.ClearSelection(); //this.gridView.SelectCell(this.gridView.FocusedRowHandle, column); } this.gridView.MakeColumnVisible(column); this.gridView.Invalidate(); // 重绘视图 } } } /// /// 说明:根据显示值获取隐藏Value /// 创建人:龚宇超 /// 创建日期:2019-06-03 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The column edit. /// System.Object. protected virtual object GetValueByCaption(GridColumnModel model, RepositoryItem columnEdit, object text, out bool result) { DataTable table = new DataTable(); bool moduleReturnCheck = false;//模块选择框复选 if (string.IsNullOrEmpty(text + "")) { result = false; return text; } if (columnEdit is RepositoryItemLookUpEdit) { RepositoryItemLookUpEdit item = columnEdit as RepositoryItemLookUpEdit; table = item.DataSource as DataTable; } else if (columnEdit is RepositoryItemSearchLookUpEdit) { RepositoryItemSearchLookUpEdit item = columnEdit as RepositoryItemSearchLookUpEdit; table = item.DataSource as DataTable; } else if (columnEdit is RepositoryItemGridLookUpEdit) { RepositoryItemGridLookUpEdit item = columnEdit as RepositoryItemGridLookUpEdit; table = item.DataSource as DataTable; } else if (columnEdit is RepositoryItemCheckedComboBoxEdit) { RepositoryItemCheckedComboBoxEdit rccbe = columnEdit as RepositoryItemCheckedComboBoxEdit; FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; if (!modelLookUp.SingleChoiceMode) moduleReturnCheck = true; table = rccbe.DataSource as DataTable; } if (table != null && table.Rows.Count > 0 && table.Columns.Count > 0) { if ((model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam || moduleReturnCheck)) { string[] values = (text + "").Trim(',').Split(','); string textNew = string.Empty; foreach (string value in values) { DataRow rowItemNew = table.Select("1=1").FirstOrDefault(x => (value + "").Equals(x[model.TextMember] + "")); if (rowItemNew != null) { textNew += rowItemNew[model.ValueMember] + ","; } } result = !string.IsNullOrEmpty(textNew) ? textNew == text + "" : false; return !string.IsNullOrEmpty(textNew) ? textNew : text; } DataRow rowItem = table.Select("1=1").FirstOrDefault(x => (text + "").Equals(x[model.TextMember] + "")); result = rowItem != null ? rowItem[model.ValueMember] + "" == text + "" : false; return rowItem != null ? rowItem[model.ValueMember] + "" : text; } result = false; return text; } /// /// 模块返回框验证(外部粘贴时验证值是否正确) /// /// /// /// /// /// protected virtual object ModuleReturnVerify(GridColumnModel model, RepositoryItem columnEdit, object text, out bool result) { DataTable table = new DataTable(); bool moduleReturnCheck = false;//多选模式 if (string.IsNullOrEmpty(text + "")) { result = false; return text; } if (columnEdit is RepositoryItemCheckedComboBoxEdit) { RepositoryItemCheckedComboBoxEdit rccbe = columnEdit as RepositoryItemCheckedComboBoxEdit; if (rccbe.Buttons[1].Tag is FrmModelLookUp) { FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; if (!modelLookUp.SingleChoiceMode) moduleReturnCheck = true; table = rccbe.DataSource as DataTable; } if (rccbe.Buttons[1].Tag is FrmModelLookUp2) { FrmModelLookUp2 modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp2; if (!modelLookUp.SingleChoiceMode) moduleReturnCheck = true; table = rccbe.DataSource as DataTable; } } if (table != null && table.Rows.Count > 0 && table.Columns.Count > 0) { if (moduleReturnCheck) { string[] values = (text + "").Trim(',').Split(','); string textNew = string.Empty; foreach (string value in values) { DataRow rowItemNew = table.Select("1=1").FirstOrDefault(x => (value + "").Equals(x[model.TextMember] + "")); if (rowItemNew != null) { textNew += rowItemNew[model.ValueMember] + ","; } } result = !string.IsNullOrEmpty(textNew) ? textNew == text + "" : false; return !string.IsNullOrEmpty(textNew) ? textNew : text; } DataRow rowItem = table.Select("1=1").FirstOrDefault(x => (text + "").Equals(x[model.TextMember] + "")); result = rowItem != null ? rowItem[model.ValueMember] + "" == text + "" : false; return rowItem != null ? rowItem[model.ValueMember] + "" : text; } result = false; return text; } /// /// 去除多选框中的空格 /// private object ReplaceMultiSpace(object text) { if (string.IsNullOrEmpty(text + "")) { return text; } string[] keyValues = (text + "").Split(','); string returnText = ""; foreach (string keyValue in keyValues) { string newKeyValue = keyValue.Trim(); returnText += string.Format("{0},", newKeyValue); } returnText = returnText.TrimEnd(','); return returnText + ","; } /// /// 说明:创建DateTime控件 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. /// Type of the field. public void InitDateTimeEdit(GridColumn gridColumn, int fieldType) { RepositoryItemDateEdit dateEdit = new RepositoryItemDateEdit(); dateEdit.DisplayFormat.FormatString = dateEdit.EditFormat.FormatString = dateEdit.Mask.EditMask = DateFormat.Format(fieldType); dateEdit.DisplayFormat.FormatType = dateEdit.EditFormat.FormatType = DevExpress.Utils.FormatType.Custom; if (fieldType == ControlType.LabDateTime) { dateEdit.Properties.VistaDisplayMode = DevExpress.Utils.DefaultBoolean.True; dateEdit.Properties.VistaEditTime = DevExpress.Utils.DefaultBoolean.True; } if (fieldType == ControlType.LabShortDate) { dateEdit.Properties.Mask.UseMaskAsDisplayFormat = true;//掩码属性使用掩码作为显示格式 dateEdit.Properties.DisplayFormat.FormatType = dateEdit.Properties.EditFormat.FormatType = DevExpress.Utils.FormatType.Custom; dateEdit.Properties.VistaCalendarInitialViewStyle = DevExpress.XtraEditors.VistaCalendarInitialViewStyle.YearView; dateEdit.Properties.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearView; } //dateEdit.Closed += new ClosedEventHandler(dateEdit_Closed); gridControl.RepositoryItems.Add(dateEdit); gridColumn.ColumnEdit = dateEdit; } /// /// 初始化表格专用日期半天选择列,保存值格式为 yyyy-MM-dd 上午/下午。 /// private void InitSpecialDate(GridColumn gridColumn, GridColumnModel model) { SpecialDatePopup specialDatePopup = new SpecialDatePopup(); specialDatePopup.Dock = DockStyle.Fill; PopupContainerControl popupControl = new PopupContainerControl(); popupControl.Controls.Add(specialDatePopup); popupControl.Size = specialDatePopup.Size; // 通过 PopupControl.Tag 保存弹出层实例,QueryPopUp 时可取回并同步当前单元格值。 popupControl.Tag = specialDatePopup; RepositoryItemPopupContainerEdit dateEdit = new RepositoryItemPopupContainerEdit(); dateEdit.NullText = ""; dateEdit.Buttons.Clear(); dateEdit.Buttons.Add(new EditorButton(ButtonPredefines.Combo)); // 允许手工修改文本,同时保留下拉选择。 //dateEdit.TextEditStyle = TextEditStyles.Standard; // 只能下拉选择 dateEdit.TextEditStyle = TextEditStyles.DisableTextEditor; dateEdit.PopupControl = popupControl; // 下拉打开前,把当前单元格值回填到弹出层。 dateEdit.QueryPopUp += OnSpecialDateQueryPopUp; dateEdit.Tag = model; // 弹出层只抛出按钮动作,真正写入表格单元格由 GridControlEx 统一处理。 specialDatePopup.ConfirmClick += OnSpecialDateConfirmClick; specialDatePopup.ClearClick += OnSpecialDateClearClick; specialDatePopup.CancelClick += OnSpecialDateCancelClick; gridControl.RepositoryItems.Add(dateEdit); gridColumn.ColumnEdit = dateEdit; } /// /// 下拉框弹出前,同步当前编辑器和当前单元格值到 SpecialDatePopup。 /// private void OnSpecialDateQueryPopUp(object sender, CancelEventArgs e) { try { PopupContainerEdit popupEdit = sender as PopupContainerEdit; if (popupEdit == null) return; SpecialDatePopup specialDatePopup = popupEdit.Properties.PopupControl.Tag as SpecialDatePopup; if (specialDatePopup == null) return; popupEdit.Properties.PopupControl.Size = specialDatePopup.Size; // 记录本次正在编辑的 PopupContainerEdit,确定/清空/取消时需要回写或关闭它。 specialDatePopup.OwnerEdit = popupEdit; specialDatePopup.SetValue(popupEdit.EditValue + ""); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 用户点击确定,把弹出层选择的日期和上午/下午写回当前单元格。 /// private void OnSpecialDateConfirmClick(object sender, EventArgs e) { SpecialDatePopup specialDatePopup = sender as SpecialDatePopup; if (specialDatePopup == null) return; SpecialDateSetEditValue(sender, specialDatePopup.SelectedValue); } /// /// 用户点击清除,清空当前单元格值。 /// private void OnSpecialDateClearClick(object sender, EventArgs e) { SpecialDateSetEditValue(sender, string.Empty); } /// /// 用户点击取消,只关闭下拉框,不修改当前单元格值。 /// private void OnSpecialDateCancelClick(object sender, EventArgs e) { PopupContainerEdit popupEdit = GetSpecialDateOwnerEdit(sender); if (popupEdit != null) { popupEdit.ClosePopup(); } } /// /// 统一设置当前单元格值,并提交编辑器,让 GridView 后续保存流程能取到新值。 /// private void SpecialDateSetEditValue(object sender, string value) { PopupContainerEdit popupEdit = GetSpecialDateOwnerEdit(sender); if (popupEdit == null) return; popupEdit.EditValue = value; popupEdit.ClosePopup(); this.gridView.PostEditor(); } /// /// 从弹出层取回本次正在编辑的 PopupContainerEdit。 /// private PopupContainerEdit GetSpecialDateOwnerEdit(object sender) { SpecialDatePopup specialDatePopup = sender as SpecialDatePopup; return specialDatePopup == null ? null : specialDatePopup.OwnerEdit; } /// /// 说明:创建Time控件 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. /// Type of the field. public void InitTimeEdit(GridColumn gridColumn, int fieldType) { RepositoryItemTimeEdit timeEdit = new RepositoryItemTimeEdit(); timeEdit.DisplayFormat.FormatString = timeEdit.EditFormat.FormatString = timeEdit.Mask.EditMask = DateFormat.Format(fieldType); timeEdit.DisplayFormat.FormatType = timeEdit.EditFormat.FormatType = DevExpress.Utils.FormatType.Custom; gridControl.RepositoryItems.Add(timeEdit); gridColumn.ColumnEdit = timeEdit; } /// /// 说明:创建计算器控件 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitCalcEdit(GridColumn gridColumn) { RepositoryItemCalcEdit calcEdit = new RepositoryItemCalcEdit(); calcEdit.AllowMouseWheel = false; gridControl.RepositoryItems.Add(calcEdit); gridColumn.ColumnEdit = calcEdit; } /// /// 说明:创建备注框 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitMemoEdit(GridColumn gridColumn) { RepositoryItemMemoExEdit memoEdit = new RepositoryItemMemoExEdit(); memoEdit.WordWrap = true; memoEdit.ShowIcon = false; if (!gridColumn.OptionsColumn.AllowEdit) { gridColumn.OptionsColumn.AllowEdit = true; //设置只读 memoEdit.ReadOnly = true; //只读状态允许下拉列表 memoEdit.AllowDropDownWhenReadOnly = DefaultBoolean.True; } gridControl.RepositoryItems.Add(memoEdit); gridColumn.ColumnEdit = memoEdit; } /// /// 说明:创建备注框 /// 创建人:王一帆 /// 创建日期:2019-08-15 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitRemarkEdit(GridColumn gridColumn) { RepositoryItemMemoEdit memo = new RepositoryItemMemoEdit(); memo.Appearance.TextOptions.WordWrap = WordWrap.Wrap;//自动换行 gridControl.RepositoryItems.Add(memo); gridColumn.ColumnEdit = memo; } /// /// 说明:富文本编辑框 /// 创建人:龚宇超 /// 创建日期:2018-06-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. /// The model. public void InitRichEdit(GridColumn gridColumn) { //gridColumn.AppearanceCell.Options.UseFont = true; //gridColumn.AppearanceCell.Font = new Font("宋体", 15f); RepositoryItemRichTextEdit richEdit = new RepositoryItemRichTextEdit(); richEdit.Encoding = Encoding.UTF8;//乱码问题 //richEdit.Appearance.Font = new Font("宋体", 15f); gridControl.RepositoryItems.Add(richEdit); gridColumn.ColumnEdit = richEdit; } /// /// 说明:创建进度条控件 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitProgressEdit(GridColumn gridColumn) { RepositoryItemProgressBar progressEdit = new RepositoryItemProgressBar(); progressEdit.ShowTitle = true; //progressEdit.Maximum = 200; this.ProgressBarColumn.Add(gridColumn.FieldName); gridControl.RepositoryItems.Add(progressEdit); gridColumn.ColumnEdit = progressEdit; } /// /// 说明:创建CheckBoxEdit /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitCheckEdit(GridColumn gridColumn) { RepositoryItemCheckEdit checkEdit = new RepositoryItemCheckEdit(); checkEdit.ValueChecked = 1; checkEdit.ValueUnchecked = 0; gridControl.RepositoryItems.Add(checkEdit); gridColumn.ColumnEdit = checkEdit; } /// /// 说明:创建自动换行文本框 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitAutoLinefeedEdit(GridColumn gridColumn, GridColumnModel model) { DevExpress.XtraEditors.Repository.RepositoryItemMemoEdit AutoLinefeedEdit = new DevExpress.XtraEditors.Repository.RepositoryItemMemoEdit(); gridColumn.ColumnEdit = AutoLinefeedEdit; } /// /// 说明:创建下拉列表框 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitPasswordEdit(GridColumn gridColumn, GridColumnModel model) { RepositoryItemTextEdit passEdit = new RepositoryItemTextEdit(); passEdit.UseSystemPasswordChar = true; passEdit.PasswordChar = '*'; gridColumn.ColumnEdit = passEdit; } /// /// 说明:创建下拉列表框 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitComboxEdit(GridColumn gridColumn, GridColumnModel model) { RepositoryItemLookUpEdit comboxEdit = new RepositoryItemLookUpEdit(); if (model.FontSize > 0) comboxEdit.Appearance.Font = new Font("微软雅黑", model.FontSize); comboxEdit.SearchMode = SearchMode.AutoFilter; //comboxEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//允许编辑 comboxEdit.ShowHeader = false; comboxEdit.ImmediatePopup = false; comboxEdit.NullText = ""; comboxEdit.PopupBorderStyle = PopupBorderStyles.Flat; comboxEdit.AllowNullInput = DefaultBoolean.False; comboxEdit.DisplayMember = model.TextMember; comboxEdit.ValueMember = ControlType.LabComboxText == model.FieldType || ControlType.LabComboxTextParam == model.FieldType ? model.TextMember : model.ValueMember; //comboxEdit.DataSource = MainImpl.GetDataTableResult(model.SqlSource); comboxEdit.Tag = model; comboxEdit.QueryPopUp += ComboxEdit_QueryPopUp; LookUpColumnInfo valueColumn = new LookUpColumnInfo(); valueColumn.Caption = "编码"; valueColumn.FieldName = model.ValueMember; valueColumn.Visible = false; LookUpColumnInfo textColumn = new LookUpColumnInfo(); textColumn.Caption = "名称"; textColumn.FieldName = model.TextMember; comboxEdit.Columns.AddRange(new LookUpColumnInfo[] { valueColumn, textColumn }); if (model.SourceRow.Table.Columns.Contains("remark")) { LookUpColumnInfo remarkColumn = new LookUpColumnInfo(); remarkColumn.Caption = "备注"; remarkColumn.FieldName = "remark"; remarkColumn.Visible = false; comboxEdit.Columns.Add(remarkColumn); } gridControl.RepositoryItems.Add(comboxEdit); gridColumn.ColumnEdit = comboxEdit; this.mControlList.Add(model); } /// /// 说明:创建树节点自动搜索框 /// 创建人:王一帆 /// 创建日期:2021-03-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitAutoTreeSearchEdit(GridColumn gridColumn, GridColumnModel model, bool isMulitClick = true, bool isRootNode = true) { PubTreeLookUp _popup = new PubTreeLookUp(); //_popup.LookUp = gridColumn; //_popup.ValueMember = ControlType.LabTreeLookValue == model.FieldType || ControlType.LabCheckTreeLookValue == model.FieldType || ControlType.LabTreeLastlevelValue == model.FieldType || ControlType.LabCheckTreeLastlevelValue == model.FieldType ? model.ValueMember : model.TextMember; _popup.ValueMember = ControlType.LabMultiComTreeboxValueParam == model.FieldType || ControlType.LabMultiComTreeboxValue == model.FieldType || ControlType.LabMulitTreeValue == model.FieldType || ControlType.LabMulitTreeValueParam == model.FieldType || ControlType.LabTreeLookValue == model.FieldType || ControlType.LabCheckTreeLookValue == model.FieldType || ControlType.LabTreeLastlevelValue == model.FieldType || ControlType.LabCheckTreeLastlevelValue == model.FieldType ? model.ValueMember : model.TextMember; _popup.ValueField = model.ValueMember; _popup.TextMember = model.TextMember; _popup.SourceSQL = model.SqlSource; _popup.TreeViewObj.CheckBoxes = _popup.isMultiClick = isMulitClick; DataTable table = MainImpl.GetDataTableResult(model.SqlSource); _popup.SetDataSource(table); _popup.Dock = DockStyle.Fill; _popup.model = model; _popup.TreeViewExObj.TreeCheckModel = model.TreeCheckModel; _popup.isRootNode = isRootNode; RepositoryItemPopupContainerEdit btnEdit = new RepositoryItemPopupContainerEdit(); btnEdit.NullText = ""; btnEdit.Buttons.Clear(); btnEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//文本框可输入 btnEdit.MouseDown += new MouseEventHandler(OnAutoGridLookUpGotFocus); btnEdit.KeyUp += new KeyEventHandler(OnAutoGridLookUpKeyUp); btnEdit.PopupControl = new PopupContainerControl(); btnEdit.PopupControl.AllowDrop = true; btnEdit.PopupControl.Controls.Add(_popup); if (isMulitClick) _popup.TreeViewExObj.OnGridViewEnter += OnPopupGridViewEnter; if (!isMulitClick) _popup.TreeViewExObj.OnTreeNodeMouseClick += OnPopupGridMouseClick; btnEdit.PopupControl.Tag = _popup; btnEdit.QueryPopUp += OnQueryPopUp; if (ControlType.LabMultiComTreeboxValueParam == model.FieldType || ControlType.LabMultiComTreeboxValue == model.FieldType || ControlType.LabMulitTreeValue == model.FieldType || ControlType.LabMulitTreeValueParam == model.FieldType || model.FieldType == ControlType.LabTreeLookValue || model.FieldType == ControlType.LabCheckTreeLookValue || ControlType.LabTreeLastlevelValue == model.FieldType || ControlType.LabCheckTreeLastlevelValue == model.FieldType) { btnEdit.QueryDisplayText += OnQueryDisplayText; } btnEdit.Tag = model; gridControl.RepositoryItems.Add(btnEdit); //gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明:自定义设置其弹出框宽度 /// 创建人:王一帆 /// 创建日期:2021-03-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. private void OnQueryPopUp(object sender, CancelEventArgs e) { try { PopupContainerEdit popupedit = (PopupContainerEdit)sender; PubTreeLookUp pubTreeLookUp = popupedit.Properties.PopupControl.Tag as PubTreeLookUp; if (pubTreeLookUp.isMultiClick) { popupedit.Properties.PopupControl.Height = 200; } else { popupedit.Properties.PopupControl.Height = 150; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:自定义设置其显示值 /// 创建人:王一帆 /// 创建日期:2021-03-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. private void OnQueryDisplayText(object sender, QueryDisplayTextEventArgs e) { try { RepositoryItemPopupContainerEdit PopupEdit = sender as RepositoryItemPopupContainerEdit; if (PopupEdit != null) { PubTreeLookUp popup = (PopupEdit.PopupControl.Tag) as PubTreeLookUp; if (e.EditValue == null) return; string[] values = e.EditValue.ToString().Trim(',').Split(','); string text = string.Empty; foreach (string item in values) { //if (e.Node.Nodes.Count > 0 && !popup.isRootNode) //{ // return; //} DataRow rowItem = popup.DataSourceTable.Rows.Cast().FirstOrDefault(x => x[popup.ValueMember] + "" == item); if (rowItem != null) { text += rowItem[popup.TextMember] + ","; } } e.DisplayText = text.Trim(','); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:创建自动搜索框 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitAutoSearchEdit(GridColumn gridColumn, GridColumnModel model) { int popWidth = 0; //DataTable table = MainImpl.GetDataTableResult(ReplaceHelper.ReplaceWhereCond(model.SqlSource) + " and 1<>1"); RepositoryItemGridLookUpEdit searchEdit = new RepositoryItemGridLookUpEdit(); if (model.FontSize > 0) searchEdit.View.Appearance.Row.Font = new Font("微软雅黑", model.FontSize); searchEdit.View.OptionsView.ShowIndicator = false; searchEdit.View.OptionsView.ColumnAutoWidth = false; searchEdit.PopupSizeable = true; searchEdit.PopupResizeMode = ResizeMode.Default; searchEdit.AllowFocused = true; searchEdit.ImmediatePopup = true; searchEdit.ShowFooter = false; searchEdit.NullText = ""; searchEdit.TextEditStyle = TextEditStyles.Standard; searchEdit.PopupBorderStyle = PopupBorderStyles.Flat; searchEdit.AllowNullInput = DefaultBoolean.False; searchEdit.ShowPopupShadow = true; searchEdit.DisplayMember = model.TextMember; searchEdit.ValueMember = ControlType.LabAutoCompleteText == model.FieldType || ControlType.LabAutoCompleteTextParam == model.FieldType || ControlType.LabAutoGridText == model.FieldType || ControlType.LabAutoGridTextParam == model.FieldType ? model.TextMember : model.ValueMember; //searchEdit.DataSource = table; searchEdit.Tag = model; searchEdit.View.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center; searchEdit.View.PopupMenuShowing += new PopupMenuShowingEventHandler(OnAutoSearchEditPopupMenuShowing); searchEdit.KeyDown += OnsearchEditKeyDown; searchEdit.QueryPopUp += new CancelEventHandler(OnSearchEditQueryPopUp); DataTable cusTable = new DataTable(); GridColumn valueColumn = new GridColumn(); valueColumn.Name = valueColumn.FieldName = model.ValueMember; valueColumn.Caption = "编码"; valueColumn.Visible = model.ValueMember.Substring(0, 1) != "_"; GridColumn textColumn = new GridColumn(); textColumn.Name = textColumn.FieldName = model.TextMember; textColumn.Caption = "名称"; textColumn.Visible = model.TextMember.Substring(0, 1) != "_"; searchEdit.View.Columns.AddRange(new GridColumn[] { valueColumn, textColumn }); searchEdit.PopupFormSize = new System.Drawing.Size(popWidth, searchEdit.PopupFormSize.Height); gridControl.RepositoryItems.Add(searchEdit); gridColumn.ColumnEdit = searchEdit; searchEdit.View.Tag = searchEdit; if (model.SearchBoxAddition && (ControlType.LabAutoCompleteText == model.FieldType || ControlType.LabAutoCompleteTextParam == model.FieldType || ControlType.LabAutoGridText == model.FieldType || ControlType.LabAutoGridTextParam == model.FieldType)) { searchEdit.ProcessNewValue += SearchEdit_ProcessNewValue; searchEdit.CustomDisplayText += SearchEdit_CustomDisplayText; } searchEdit.EditValueChanging += gridLookUpEdit1_EditValueChanging; //if ((ControlType.LabAutoCompleteText == model.FieldType || ControlType.LabAutoGridText == model.FieldType || ControlType.LabAutoGridTextParam == model.FieldType)) //{ // searchEdit.EditValueChanging += gridLookUpEdit1_EditValueChangingAdd; //} //else //{ // searchEdit.EditValueChanging += gridLookUpEdit1_EditValueChanging; //} searchEdit.View.CustomDrawFilterPanel += OnCustomDrawFilterPanel; searchEdit.View.Click += new EventHandler(View_Click); this.mControlList.Add(model); } /// /// 搜索框允许新增时,将用户输入的文本临时加入下拉数据源。 /// 这里只处理“显示文本、保存文本”的控件类型,避免给保存ID的控件自动生成不存在的ID。 /// /// /// private void SearchEdit_ProcessNewValue(object sender, ProcessNewValueEventArgs e) { try { GridLookUpEdit edit = sender as GridLookUpEdit; if (edit == null) return; GridColumnModel model = edit.Properties.Tag as GridColumnModel; if (model == null || !model.SearchBoxAddition) return; if (!(ControlType.LabAutoCompleteText == model.FieldType || ControlType.LabAutoCompleteTextParam == model.FieldType || ControlType.LabAutoGridText == model.FieldType || ControlType.LabAutoGridTextParam == model.FieldType)) return; string displayValue = e.DisplayValue + ""; if (string.IsNullOrWhiteSpace(displayValue)) return; BeginInvoke(new MethodInvoker(delegate () { FilterLookup(sender, displayValue); })); RepositoryItemGridLookUpEdit searchEdit = GridView.Columns[model.FieldName].ColumnEdit as RepositoryItemGridLookUpEdit; if (searchEdit == null) return; DataTable dt = searchEdit.DataSource as DataTable; if (dt == null) return; string valueName = searchEdit.ValueMember; string textName = !string.IsNullOrWhiteSpace(searchEdit.DisplayMember) ? searchEdit.DisplayMember : model.TextMember; if (string.IsNullOrWhiteSpace(valueName) || !dt.Columns.Contains(valueName)) return; Type dataType = dt.Columns[valueName].DataType; if (dataType != typeof(string)) return; bool exists = dt.Rows.Cast().Any(x => (x[valueName] + "").Equals(displayValue) || (!string.IsNullOrWhiteSpace(textName) && dt.Columns.Contains(textName) && (x[textName] + "").Equals(displayValue))); if (exists) return; DataRow newRow = dt.NewRow(); newRow[valueName] = displayValue; if (!string.IsNullOrWhiteSpace(textName) && dt.Columns.Contains(textName)) { newRow[textName] = displayValue; } if (model.FieldType == ControlType.LabAutoGridTextParam || model.FieldType == ControlType.LabAutoCompleteTextParam) { if (this.ManuallyAddData.ContainsKey(model.FieldName)) { this.ManuallyAddData[model.FieldName].Add(newRow); } else { this.ManuallyAddData.Add(model.FieldName, new List() { newRow }); } } dt.Rows.Add(newRow.ItemArray); e.Handled = true; } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } finally { } } /// /// 搜索框新增值未持久化到下拉SQL数据源时,直接用单元格保存的文本作为显示值。 /// 这样重新打开模块后,即使下拉数据源查不到该文本,界面也不会显示为空白。 /// private void SearchEdit_CustomDisplayText(object sender, CustomDisplayTextEventArgs e) { if (e.Value == null) return; RepositoryItemGridLookUpEdit edit = sender as RepositoryItemGridLookUpEdit; if (edit == null) return; GridColumnModel model = edit.Tag as GridColumnModel; if (model == null || !model.SearchBoxAddition) return; if (!(model.FieldType == ControlType.LabAutoCompleteText || model.FieldType == ControlType.LabAutoCompleteTextParam || model.FieldType == ControlType.LabAutoGridText || model.FieldType == ControlType.LabAutoGridTextParam)) return; string value = e.Value + ""; if (string.IsNullOrWhiteSpace(value)) return; DataTable dt = edit.DataSource as DataTable; string valueName = edit.ValueMember; string textName = !string.IsNullOrWhiteSpace(edit.DisplayMember) ? edit.DisplayMember : model.TextMember; if (dt == null || (string.IsNullOrWhiteSpace(valueName) || !dt.Columns.Contains(valueName)) && (string.IsNullOrWhiteSpace(textName) || !dt.Columns.Contains(textName))) { e.DisplayText = value; return; } bool exists = dt.Rows.Cast().Any(x => (!string.IsNullOrWhiteSpace(valueName) && dt.Columns.Contains(valueName) && (x[valueName] + "") == value) || (!string.IsNullOrWhiteSpace(textName) && dt.Columns.Contains(textName) && (x[textName] + "") == value)); if (!exists) { e.DisplayText = value; } } /// /// 数据源中点击将数据源更新 /// /// /// private void View_Click(object sender, EventArgs e) { try { GridView gridView = sender as GridView; DataRow rt = gridView.GetFocusedDataRow(); RepositoryItemGridLookUpEdit searchEdit = gridView.Tag as RepositoryItemGridLookUpEdit; if (rt == null) return; DataTable dt = (searchEdit.DataSource as DataTable); if (dt.Rows.Cast().FirstOrDefault(x => x == rt) == null && dt != null && dt.Rows.Count > 0) { dt.Rows.Add(rt.ItemArray); gridView.UpdateCurrentRow(); gridView.ShowEditor(); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } private void FilterLookup(object sender, string NewValue) { try { GridLookUpEdit edit = sender as GridLookUpEdit; GridView gridView = edit.Properties.View as GridView; GridColumnModel model = edit.Properties.Tag as GridColumnModel; DataTable table = edit.Properties.DataSource as DataTable; FieldInfo fi = gridView.GetType().GetField("extraFilter", BindingFlags.NonPublic | BindingFlags.Instance); List strList = new List(); foreach (GridColumn colum in gridView.Columns) { string AutoSearchText = string.IsNullOrEmpty(edit.AutoSearchText) ? NewValue : edit.AutoSearchText; BinaryOperator op1 = new BinaryOperator(colum.FieldName, "%" + AutoSearchText + "%", BinaryOperatorType.Like); strList.Add(op1); } string isPopShow = edit.Tag + ""; if (isPopShow == "1") edit.ShowPopup(); string filterCondition = new GroupOperator(GroupOperatorType.Or, strList.ToArray()).ToString(); fi.SetValue(gridView, filterCondition); MethodInfo mi = gridView.GetType().GetMethod("ApplyColumnsFilterEx", BindingFlags.NonPublic | BindingFlags.Instance); edit.Tag = "0"; mi.Invoke(gridView, null); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } private void gridLookUpEdit1_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e) { try { GridLookUpEdit edit = sender as GridLookUpEdit; if (SystemInfo.Instance.DisableCellAutoFiltering && edit.Properties != null) edit.Properties.AutoComplete = false;//设置是否启用自动完成功能 RepositoryItemGridLookUpEdit searchEdit = edit.Properties; DataTable dt = (searchEdit.DataSource as DataTable); BeginInvoke(new MethodInvoker(delegate () { FilterLookup(sender, e.NewValue + ""); })); if (string.IsNullOrWhiteSpace(edit.AutoSearchText) && e.NewValue == "") { DataRow newRow = dt.NewRow(); if (dt.Rows.Cast().FirstOrDefault(x => x == newRow) == null) { dt.Rows.Add(newRow.ItemArray); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 把输入值添加到数据源中 /// /// /// private void gridLookUpEdit1_EditValueChangingAdd(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e) { try { GridLookUpEdit edit = sender as GridLookUpEdit; RepositoryItemGridLookUpEdit searchEdit = edit.Properties; DataTable dt = (searchEdit.DataSource as DataTable); BeginInvoke(new MethodInvoker(delegate () { FilterLookup(sender, e.NewValue + ""); })); //if (true) //{ // if (string.IsNullOrWhiteSpace(e.NewValue + "")) return; // string ValueName = searchEdit.View.Columns[0].FieldName; // string TextName = searchEdit.View.Columns[1].FieldName; // Type dataType = dt.Columns[ValueName].DataType; // DataRow newRow = dt.NewRow(); // if (dataType.Name == "Int32") // { // int maxdm = Convert.ToInt32(searchEdit.View.Columns[ValueName].Tag); // edit.Properties.View.ActiveFilterString = string.Format(ValueName + "< {0}", maxdm); // int maxdmIndex = dt.AsEnumerable().Select(t => t.Field(ValueName)).Max(); // newRow[ValueName] = maxdmIndex + 1; // newRow[TextName] = e.NewValue + ""; // if (dt.Rows.Cast().FirstOrDefault(x => (x[ValueName] + "").Equals(e.NewValue + "")) == null) // { // dt.Rows.Add(newRow.ItemArray); // } // } // else if (dataType.Name == "String") // { // newRow[ValueName] = e.NewValue + ""; // newRow[TextName] = e.NewValue + ""; // if (dt.Rows.Cast().FirstOrDefault(x => (x[TextName] + "").Equals(e.NewValue + "")) == null) // { // dt.Rows.Add(newRow.ItemArray); // } // } //} } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:创建多选框 /// 创建人:龚宇超 /// 创建日期:2017-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitMutilEdit(GridColumn gridColumn, GridColumnModel model) { FrmLookUp mutilLookUp = new FrmLookUp(); mutilLookUp.ValueField = model.ValueMember; mutilLookUp.TextField = model.TextMember; mutilLookUp.SourceSQL = model.SqlSource; mutilLookUp.IsType = model.FieldType; mutilLookUp.ValueMember = (model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew) || model.FieldType == ControlType.LabMultiSelectValueParam ? model.ValueMember : model.TextMember; mutilLookUp.Tag = model; RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); //btnEdit.CustomDisplayText += BtnEdit_CustomDisplayText;//返回id速度慢的根本原因是显示值筛选转换速度慢,可通过该事件实现自定义获取值进行改善,未实现 btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam ? model.ValueMember : model.TextMember; if (!(model.FieldType == ControlType.LabMultiSelectTextParam || model.FieldType == ControlType.LabMultiSelectText || model.FieldType == ControlType.LabMultiSelectTextNew)) { btnEdit.DataSource = MainImpl.GetDataTableResult(model.SqlSource); } btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = mutilLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnButtonEditClick); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明:创建sql生成组件 /// 创建人:曹屹峰 /// 创建日期:2021-09-219 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. public void InitSqlGenerate(GridColumn gridColumn, GridColumnModel model) { FrmAutoSqlLoad sqlGenerator = new FrmAutoSqlLoad(); RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; // btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; //btnEdit.ValueMember = model.TextMember; btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = sqlGenerator; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnSqlGenerate); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明:创建 打开高拍仪 /// 创建人:曹屹峰 /// 创建日期:2021-12-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitHighShotMeterEdit(GridColumn gridColumn, GridColumnModel model) { FrmHighBeater highBeater = new FrmHighBeater(); RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; // btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; //btnEdit.ValueMember = model.TextMember; btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = highBeater; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnHighBeater); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 创建一维条码控件 /// private void InitBarCode128BEdit(GridColumn gridColumn, GridColumnModel model) { RepositoryItemPictureEdit ItemPictureEdit = new RepositoryItemPictureEdit(); ItemPictureEdit.FormatEditValue += new ConvertEditValueEventHandler(OnTextEdit_FormatEditValue); gridControl.RepositoryItems.Add(ItemPictureEdit); gridColumn.ColumnEdit = ItemPictureEdit; gridColumn.MinWidth = 400; gridColumn.Width = 400; //byte[] fontdata = global::Lskj.Control.Properties.Resources.code128; //unsafe //打开"允许不安全代码编译"开关,此句才不报错 //{ // fixed (byte* pFontData = fontdata) // { // customFont.AddMemoryFont((System.IntPtr)pFontData, fontdata.Length); // } //} //try //{ // if (!File.Exists("code128.ttf")) // { // FileStream pFileStream = new FileStream("code128.ttf", FileMode.Create); // pFileStream.Write(fontdata, 0, fontdata.Length); // pFileStream.Close(); // pFileStream.Dispose(); // } // Lskj.Util.FontHelper.InstallFont("code128.ttf"); //} //catch (Exception ex) //{ //} //Font font = new Font(customFont.Families[0], 36); //this.gridView.RowHeight = 30; //gridColumn.AppearanceCell.Font = font; //gridColumn.AppearanceCell.Options.UseFont = true; //RepositoryItemTextEdit textEdit = new RepositoryItemTextEdit(); ////textEdit.Appearance.Font = font; ////textEdit.Appearance.Options.UseFont = true; //textEdit.FormatEditValue += new ConvertEditValueEventHandler(OnTextEdit_FormatEditValue); //gridControl.RepositoryItems.Add(textEdit); //gridColumn.ColumnEdit = textEdit; //this.mControlList.Add(model); } /// /// 创建下拉列表框弹出框 /// /// /// public void InitComboxPopup(GridColumn gridColumn, GridColumnModel model) { FrmComboxPopup mutilLookUp = new FrmComboxPopup(model); mutilLookUp.Tag = model; RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabComboxPopupValue ? model.ValueMember : model.TextMember; if (model.FieldType == ControlType.LabComboxPopupValue) { btnEdit.DataSource = MainImpl.GetDataTableResult(model.SqlSource); } btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = mutilLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnComboxPopupClick); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 下拉列表框弹出框点击 /// /// /// private void OnComboxPopupClick(object sender, ButtonPressedEventArgs e) { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmComboxPopup comboxPopup = e.Button.Tag as FrmComboxPopup; GridColumnModel model = comboxPopup.Tag as GridColumnModel; string sql = ReplaceHelper.ReplaceRowParam(this.GridView.GetFocusedDataRow(), model.SqlSource); comboxPopup.OnLoadnew(sql); DialogResult result = comboxPopup.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = comboxPopup.ShowValue; } } /// /// 创建下拉表格框弹出框 /// /// /// public void InitGridPopup(GridColumn gridColumn, GridColumnModel model) { FrmGridSelectPopup mutilLookUp = new FrmGridSelectPopup(model); mutilLookUp.Tag = model; RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabGridPopupValue || model.FieldType == ControlType.LabGridPopupMutilValue ? model.ValueMember : model.TextMember; if (model.FieldType == ControlType.LabGridPopupValue || model.FieldType == ControlType.LabGridPopupMutilValue) { btnEdit.DataSource = MainImpl.GetDataTableResult(model.SqlSource); } btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = mutilLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnGridPopupClick); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 下拉列表表格点击 /// /// /// private void OnGridPopupClick(object sender, ButtonPressedEventArgs e) { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmGridSelectPopup frmGridSelectPopup = e.Button.Tag as FrmGridSelectPopup; GridColumnModel model = frmGridSelectPopup.Tag as GridColumnModel; string sql = ReplaceHelper.ReplaceRowParam(this.GridView.GetFocusedDataRow(), model.SqlSource); frmGridSelectPopup.InitNew(sql, btnEdit.Text, btnEdit.EditValue + ""); DialogResult result = frmGridSelectPopup.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = frmGridSelectPopup.ShowValue; } } /// /// 说明:超链接 /// 创建人:曹屹峰 /// 创建日期:2025-06-13 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitHyperlink(GridColumn gridColumn, GridColumnModel model) { // 创建超链接编辑器 RepositoryItemHyperLinkEdit hyperLinkEdit = new RepositoryItemHyperLinkEdit(); hyperLinkEdit.LinkColor = System.Drawing.Color.Blue; hyperLinkEdit.NullText = ""; hyperLinkEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; hyperLinkEdit.SingleClick = true; hyperLinkEdit.Tag = model; // 注册编辑器 gridControl.RepositoryItems.Add(hyperLinkEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = hyperLinkEdit; } /// /// 说明:超链接右键列 /// 创建人:王一帆 /// 创建日期:2025-06-13 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitRightlink(GridColumn gridColumn, GridColumnModel model) { // 创建超链接编辑器 RepositoryItemHyperLinkEdit hyperLinkEdit = new RepositoryItemHyperLinkEdit(); hyperLinkEdit.LinkColor = System.Drawing.Color.Blue; hyperLinkEdit.NullText = ""; hyperLinkEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; hyperLinkEdit.SingleClick = true; hyperLinkEdit.Tag = model; // 注册编辑器 gridControl.RepositoryItems.Add(hyperLinkEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = hyperLinkEdit; } /// /// 点击超链接右键 /// /// /// private void OnRightClick(object sender, EventArgs e) { string unionright = string.Empty; if (sender is RepositoryItemHyperLinkEdit repositoryItem) { if (repositoryItem != null) { GridColumnModel model = repositoryItem.Tag as GridColumnModel; unionright = model.ValueMember; } if (!string.IsNullOrWhiteSpace(unionright)) { // 获取当前选中的行和列 //int rowHandle = this.gridView.FocusedRowHandle; //string rightid = this.gridView.GetRowCellValue(rowHandle, unionright) + ""; if (!string.IsNullOrEmpty(unionright)) { if (OnAfterLinkCilk != null) { this.OnAfterLinkCilk(unionright, null);//直接调用新增行方法,添加关联数据 } } } } } /// /// 点击超链接 /// /// /// private void HyperLinkEdit_Click(object sender, EventArgs e) { string urlName = string.Empty; if (sender is RepositoryItemHyperLinkEdit repositoryItem) { if (repositoryItem != null) { GridColumnModel model = repositoryItem.Tag as GridColumnModel; urlName = model.ValueMember; } } if (string.IsNullOrWhiteSpace(urlName)) return; // 获取当前选中的行和列 int rowHandle = this.gridView.FocusedRowHandle; string url = this.gridView.GetRowCellValue(rowHandle, urlName) as string; if (!string.IsNullOrEmpty(url)) { // 打开默认浏览器访问URL System.Diagnostics.Process.Start(url); } } private void InitRightMenuBtnEdit() { GridColumn gridColumn = new GridColumn(); gridColumn.FieldName = "RightMenuBtnEdit"; gridColumn.Name = "RightMenuBtnEdit"; gridColumn.Caption = "操作列"; //gridColumn.OptionsColumn.ShowCaption = false; gridColumn.Visible = true; gridColumn.OptionsColumn.AllowEdit = true; RepositoryItemButtonEdit ItemButtonEdit = new RepositoryItemButtonEdit(); ItemButtonEdit.Buttons.Clear(); ItemButtonEdit.AppearanceDisabled.Options.UseTextOptions = true; ItemButtonEdit.AppearanceDisabled.TextOptions.HAlignment = HorzAlignment.Center; ItemButtonEdit.TextEditStyle = TextEditStyles.HideTextEditor; ItemButtonEdit.ButtonsStyle = BorderStyles.UltraFlat; ItemButtonEdit.BorderStyle = BorderStyles.NoBorder; ItemButtonEdit.ButtonClick += new ButtonPressedEventHandler(OnItemButtonEdit_ButtonClick); DataTable rightMenuTab = BaseModuleImpl.GetBaseGridRightMenus(this.Model.ModuleCode); int ColumnWidth = 0; if (rightMenuTab.Columns.Contains("IcoName")) { // 创建只显示图片的按钮 DataRow[] rightMenuBtns = rightMenuTab.Select().Where(n => !string.IsNullOrEmpty(n["IcoName"] + "")).ToArray(); int picWidth = 30; foreach (DataRow rightMenu in rightMenuBtns) { GridRightMenuModel menuModel = new GridRightMenuModel(rightMenu); if (!string.IsNullOrWhiteSpace(menuModel.MenuName)) { EditorButton editorButton = new EditorButton(); editorButton.Appearance.BackColor = Color.Transparent; if (!string.IsNullOrEmpty(menuModel.IcoName)) { Image image = null; try { image = Image.FromFile(Util.PubUtil.GridColumnIco + menuModel.IcoName); if (image.Width > 30) { picWidth = image.Width; } editorButton.Image = image; } catch (Exception) { } } editorButton.ToolTip = menuModel.MenuName; editorButton.Kind = ButtonPredefines.Glyph; editorButton.Width = picWidth; editorButton.Tag = menuModel; ItemButtonEdit.Buttons.Add(editorButton); } } ColumnWidth = rightMenuBtns.Length * picWidth; } if (rightMenuTab.Columns.Contains("showtoolbar")) { // 创建只显示文本的按钮 DataRow[] rightMenuBtnsText = rightMenuTab.Select().Where(n => "1".Equals(n["showtoolbar"] + "")).ToArray(); EditorButton textOnlyButton = new EditorButton(); foreach (DataRow rightMenu in rightMenuBtnsText) { GridRightMenuModel menuModel = new GridRightMenuModel(rightMenu); if (!string.IsNullOrWhiteSpace(menuModel.MenuName)) { EditorButton editorButton = new EditorButton(); editorButton.Caption = menuModel.MenuName + ""; //editorButton.GlyphAlignment = HorzAlignment.Center; editorButton.ToolTip = menuModel.MenuName; editorButton.Kind = ButtonPredefines.Glyph; editorButton.Width = this.CalculateTextWidth(editorButton.Caption, editorButton.Appearance.Font); editorButton.Tag = menuModel; editorButton.Appearance.BackColor = Color.FromArgb(240, 240, 240); // 浅灰背景 editorButton.Appearance.BorderColor = Color.FromArgb(180, 180, 180); // 边框色 editorButton.Appearance.ForeColor = Color.FromArgb(50, 50, 50); // 文本色 editorButton.Appearance.Options.UseBackColor = true; editorButton.Appearance.Options.UseBorderColor = true; editorButton.Appearance.Options.UseForeColor = true; ItemButtonEdit.Buttons.Add(editorButton); ColumnWidth += editorButton.Width; } } } gridColumn.ColumnEdit = ItemButtonEdit; this.gridView.Columns.Add(gridColumn); this.gridView.OptionsBehavior.EditorShowMode = EditorShowMode.MouseDown; gridColumn.MaxWidth = ColumnWidth; gridColumn.MinWidth = ColumnWidth; gridColumn.Width = ColumnWidth; } private void OnHighBeater(object sender, ButtonPressedEventArgs e) { FrmHighBeater highBeater = new FrmHighBeater(); DataTable dt = (this.GridView.GridControl.DataSource as DataTable).Clone(); DataRow dr = this.GridView.GetFocusedDataRow(); dt.Rows.Add(dr); highBeater.dataSource = dt; DialogResult result = highBeater.ShowDialog(); if (result == DialogResult.OK) { } } /// /// 说明:创建 模块返回ID /// 创建人:曹屹峰 /// 创建日期:2021-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitSelectReturnId(GridColumn gridColumn, GridColumnModel model) { FrmModelLookUp modelLookUp = new FrmModelLookUp(model.addModuleld, model.IsRadio); modelLookUp.ConfigureColumnMode = model.ConfigureColumnMode; modelLookUp.ValueField = model.ValueMember; modelLookUp.TextField = model.TextMember; modelLookUp.SourceSQL = model.SqlSource; modelLookUp.IsType = model.FieldType; modelLookUp.ValueMember = model.FieldType == ControlType.LabSelectReturnId ? model.ValueMember : model.TextMember; modelLookUp.Tag = model; RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabSelectReturnId ? model.ValueMember : model.TextMember; DataTable dataTable = MainImpl.GetDataTableResult(modelLookUp.SingleChoiceMode ? modelLookUp.SysModel.MenuSql : model.SqlSource); //ModuleEnclosure.Add(model.FieldName, dataTable); btnEdit.DataSource = dataTable; btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = modelLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnModuleChoice); btnEdit.KeyDown += BtnEdit_KeyDown; gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; gridColumn.FilterMode = ColumnFilterMode.DisplayText;//筛选行匹配文本值(模块返回ID不像下拉框,不进入弹出框,只能看到文本值。所以把筛选改成按文本筛选) this.mControlList.Add(model); } /// /// 说明:创建 模块返回ID 新版 /// 创建人:曹屹峰 /// 创建日期:2021-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitSelectReturnIdNew(GridColumn gridColumn, GridColumnModel model) { FrmModelLookUp2 modelLookUp = new FrmModelLookUp2(model.addModuleld, model.IsRadio); modelLookUp.ConfigureColumnMode = model.ConfigureColumnMode; modelLookUp.ValueField = model.ValueMember; modelLookUp.TextField = model.TextMember; modelLookUp.SourceSQL = model.SqlSource; modelLookUp.IsType = model.FieldType; modelLookUp.ValueMember = model.FieldType == ControlType.LabSelectReturnIdNew ? model.ValueMember : model.TextMember; modelLookUp.Tag = model; RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabSelectReturnIdNew ? model.ValueMember : model.TextMember; if (model.ModuleFrameDisplayText && model.FieldType == ControlType.LabSelectReturnIdNew) { DataTable dataTable = MainImpl.GetDataTableResult(modelLookUp.SysModel.MenuSql); btnEdit.DataSource = dataTable; } btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = modelLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnModuleChoiceNew); btnEdit.KeyDown += BtnEdit_KeyDown; gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明:创建 模块返回行 /// 创建人:曹屹峰 /// 创建日期:2021-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitModuleReturnLine(GridColumn gridColumn, GridColumnModel model) { FrmModelLookUp2 modelLookUp = new FrmModelLookUp2(model.addModuleld, false);//model.IsRadio 必定多选 modelLookUp.ReturnCollection = true; modelLookUp.ConfigureColumnMode = model.ConfigureColumnMode; modelLookUp.ValueField = model.ValueMember; modelLookUp.TextField = model.TextMember; modelLookUp.SourceSQL = model.SqlSource; modelLookUp.IsType = model.FieldType; modelLookUp.ValueMember = model.FieldType == ControlType.LabModuleAddRowsID ? model.ValueMember : model.TextMember; modelLookUp.Tag = model; RepositoryItemCheckedComboBoxEdit btnEdit = new RepositoryItemCheckedComboBoxEdit(); btnEdit.NullText = ""; btnEdit.PopupBorderStyle = PopupBorderStyles.Flat; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.DisplayMember = model.TextMember; btnEdit.SeparatorChar = ','; btnEdit.ValueMember = model.FieldType == ControlType.LabModuleAddRowsText ? model.ValueMember : model.TextMember; DataTable dataTable = MainImpl.GetDataTableResult(modelLookUp.SysModel.MenuSql); btnEdit.DataSource = dataTable; //if (model.ModuleFrameDisplayText) //{ // DataTable dataTable = MainImpl.GetDataTableResult(modelLookUp.SysModel.MenuSql); // btnEdit.DataSource = dataTable; //} btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = modelLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnModuleAddLine); btnEdit.KeyDown += BtnEdit_KeyDown; gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明:创建 模块返回行数据 /// 创建人:唐德馨 /// 创建日期:2022-10-4 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitSelectReturnRows(GridColumn gridColumn, GridColumnModel model) { FrmRowsModelLookUp modelLookUp = new FrmRowsModelLookUp(); modelLookUp.UnionModuleCodel = model.addModuleld; modelLookUp.gridColumnModel = model; modelLookUp.ValueField = model.ValueMember; modelLookUp.TextField = model.TextMember; modelLookUp.SourceSQL = model.SqlSource; modelLookUp.IsType = model.FieldType; modelLookUp.ValueMember = model.FieldType == ControlType.LabSelectReturnId ? model.ValueMember : model.TextMember; modelLookUp.selectField = gridColumn.FieldName; modelLookUp.Tag = model; RepositoryItemButtonEdit btnEdit = new RepositoryItemButtonEdit(); btnEdit.NullText = ""; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.Buttons[0].Visible = false; // 不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = modelLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnModuleRowsChoice); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明:创建模块返回行数据(优化) /// 创建人:唐德馨 /// 创建日期:2022-10-4 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void InitSelectReturnRowsNew(GridColumn gridColumn, GridColumnModel model) { FrmRowsModelLookUpNew modelLookUp = new FrmRowsModelLookUpNew(); modelLookUp.UnionModuleCodel = model.addModuleld; modelLookUp.SingleChoiceMode = model.IsRadio; modelLookUp.gridColumnModel = model; modelLookUp.ValueField = model.ValueMember; modelLookUp.TextField = model.TextMember; modelLookUp.SourceSQL = model.SqlSource; modelLookUp.IsType = model.FieldType; modelLookUp.ValueMember = model.FieldType == ControlType.LabSelectReturnId ? model.ValueMember : model.TextMember; modelLookUp.selectField = gridColumn.FieldName; modelLookUp.Tag = model; RepositoryItemButtonEdit btnEdit = new RepositoryItemButtonEdit(); btnEdit.NullText = ""; btnEdit.AllowNullInput = DefaultBoolean.False; btnEdit.Buttons[0].Visible = false; //不能移除,移除后事件不起作用. btnEdit.Buttons.AddRange(new EditorButton[] { new EditorButton(ButtonPredefines.Ellipsis) }); btnEdit.Tag = model; btnEdit.Buttons[1].Tag = modelLookUp; btnEdit.ButtonClick += new ButtonPressedEventHandler(OnModuleRowsChoiceNew); gridControl.RepositoryItems.Add(btnEdit); gridColumn.OptionsColumn.ReadOnly = true; gridColumn.ColumnEdit = btnEdit; this.mControlList.Add(model); } /// /// 说明: /// 创建人:龚宇超 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. /// The model. public void InitMutilComboxEdit(GridColumn gridColumn, GridColumnModel model) { RepositoryItemCheckedComboBoxEdit comboxEdit = new RepositoryItemCheckedComboBoxEdit(); comboxEdit.AllowFocused = true; comboxEdit.DataSource = MainImpl.GetDataTableResult(model.SqlSource); comboxEdit.DisplayMember = model.TextMember; comboxEdit.ValueMember = model.FieldType == ControlType.LabComboxCheckListValue ? model.ValueMember : model.TextMember; comboxEdit.NullText = ""; gridControl.RepositoryItems.Add(comboxEdit); gridColumn.ColumnEdit = comboxEdit; this.mControlList.Add(model); } /// /// 说明:表格图片 /// 创建人:龚宇超 /// 创建日期:2018-08-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void InitPicEdit(GridColumn gridColumn) { RepositoryItemPictureEdit picEdit = new RepositoryItemPictureEdit(); picEdit.AutoHeight = true; picEdit.SizeMode = PictureSizeMode.Zoom; picEdit.BestFitWidth = 16; picEdit.CustomHeight = 16; gridColumn.ColumnEdit = picEdit; } /// /// 说明:表格图片 /// 创建人:龚宇超 /// 创建日期:2018-08-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void InitPicEditUrl(GridColumn gridColumn, GridColumnModel model) { gridColumn.AppearanceCell.Options.UseTextOptions = true; gridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; gridColumn.OptionsColumn.AllowEdit = false; gridColumn.FieldName = $"{model.FieldName}{Guid.NewGuid()}"; RepositoryItemPictureEdit pictureEdit = new RepositoryItemPictureEdit(); pictureEdit.ShowMenu = false; pictureEdit.NullText = " "; pictureEdit.SizeMode = PictureSizeMode.Zoom; gridControl.RepositoryItems.Add(pictureEdit); gridColumn.UnboundType = UnboundColumnType.Object; gridColumn.ColumnEdit = pictureEdit; } /// /// 说明: /// 创建人:龚宇超 /// 创建日期:2019-06-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The d table. /// Name of the column. /// System.Int32. public int CalcMaxColumnWidth(DataTable dTable, string columnName) { int maxWidth = 0, maxRow = 50; for (int i = 0; i < dTable.Rows.Count; i++) { if (i < maxRow) { DataRow row = dTable.Rows[i]; int columnWidth = GraphicsText.GetTextWidth(row[columnName] + ""); if (columnWidth > maxWidth) { maxWidth = columnWidth; } } } return maxWidth; } /// /// 说明:获取焦点行数据 /// 创建人:龚宇超 /// 创建日期:2019-10-18 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// DataRow. public virtual DataRow GetViewFocusedDataRow() { return gridView.GetFocusedDataRow(); } /// /// 说明:获取选中行数据 /// 创建人:龚宇超 /// 创建日期:2019-10-18 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// DataRow[]. public virtual DataRow[] GetViewFocusedDataRows() { int[] rows = gridView.GetSelectedRows(); DataRow[] dataRows = new DataRow[rows.Length]; for (int i = 0; i < rows.Length; i++) { dataRows[i] = gridView.GetDataRow(rows[i]); } return dataRows; } /// /// 说明:设置表格颜色 /// 创建人:龚宇超 /// 创建日期:2017-12-12 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The table. public virtual void SetGridRowColors(DataTable table) { this.GridRowColorsTable = table; if (table != null && table.Rows.Count > 0) { DataRow rowItem = table.Select("1=1").FirstOrDefault(x => (x["condition"] + "").Contains("COLUMN_")); if (rowItem != null) { this.gridView.RowCellStyle -= new RowCellStyleEventHandler(OnGridViewRowCellStyle); this.gridView.RowCellStyle += new RowCellStyleEventHandler(OnGridViewRowCellStyle); } else { if (!SystemInfo.Instance.ConditionalStylePriority) { this.gridView.RowStyle -= new RowStyleEventHandler(OnGridViewRowStyle); this.gridView.RowStyle += new RowStyleEventHandler(OnGridViewRowStyle); } } } } /// /// 说明:生成序号 /// 创建人:龚宇超 /// 创建日期:2017-09-14 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected virtual void OnGridViewCustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e) { try { e.Appearance.TextOptions.HAlignment = HorzAlignment.Center; if (e.Info.IsRowIndicator) { if (e.RowHandle >= 0) { e.Info.DisplayText = (e.RowHandle + 1).ToString(); } } } catch (Exception) { } } /// /// 设置序号列宽度 /// public void AdjustIndicatorWidthSmart() { try { int rowCount = this.gridView.RowCount; if (rowCount == 0) return; // 获取网格实际使用的行字体 Font rowFont = this.gridView.Appearance.Row.Font ?? this.gridView.GridControl?.Font ?? SystemFonts.DefaultFont; // 用最大行号实测文本宽度(而非估算) string maxNumber = rowCount.ToString(); int textWidth = TextRenderer.MeasureText(maxNumber, rowFont).Width; // 附加宽度:行指示器图标(~12px) + 左右间距(~10px) + 边框 int indicatorWidth = textWidth + 14; // 限制范围 40-80px this.gridView.IndicatorWidth = Math.Max(40, Math.Min(80, indicatorWidth)); } catch (Exception ex) { // 这里可以加日志 } } /// /// 说明:拖拽列 /// 创建人:龚宇超 /// 创建日期:2018-02-06 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected virtual void OnGridViewDragObjectDrop(object sender, DragObjectDropEventArgs e) { try { if (e.DragObject is GridColumn) { GridColumn gridColumn = e.DragObject as GridColumn; GridColumnModel gridModel = gridColumn.Tag as GridColumnModel; if (gridModel != null && !this.gridView.OptionsView.ShowGroupPanel) { if (gridColumn.Visible && gridModel.Width == 0) { MessageUtil.Show(ResourceKeys.DefaultForHide); gridColumn.Visible = false; } else { if (!gridColumn.Visible && gridModel.OnlyCanNull) { MessageUtil.Show(ResourceKeys.NotNullForDelete); gridColumn.Visible = true; } } } if (BaseImpl.HasExistsTable(ResourceKeys.SettingGrouprptab)) { this.ChartTable = new DataTable(); ChartTable.Columns.Add("key"); ChartTable.Columns.Add("value"); string sqlValue = string.Format("DELETE FROM {0} WHERE operatorid = '{1}' ", ResourceKeys.SettingGrouprptab, ERPInfo.Instance.UserId); SqlHelper.ExecuteNonQuery(sqlValue); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:分组列获取数据 /// 创建人:王一帆 /// 创建日期:2020-07-27 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. private void OnGridCustomDrawGroupRow(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e) { try { GridGroupRowInfo GridGroupRowInfo = e.Info as GridGroupRowInfo; GridColumn gridColumn = GridGroupRowInfo.Column as GridColumn; if (gridColumn.Tag == null) { //动态列没有设置tag string ColumnSiftValue = string.Empty; int startindex = GridGroupRowInfo.GroupText.LastIndexOf(":"); string[] GroupText = GridGroupRowInfo.GroupText.Substring(startindex + 1).Trim().Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries); string newGroupText = GroupText[0] + ", "; GridGroupRowInfo.GroupText = GridGroupRowInfo.GroupText.Substring(0, startindex + 1) + newGroupText.TrimEnd(' ').TrimEnd(','); } else { GridColumnModel model = gridColumn.Tag as GridColumnModel; string ColumnSiftValue = string.Empty; string editValue = ControlType.IsValue(model.FieldType) ? GridGroupRowInfo.GroupValueText : GridGroupRowInfo.EditValue + ""; int startindex = GridGroupRowInfo.GroupText.LastIndexOf(":"); string[] GroupText = GridGroupRowInfo.GroupText.Substring(startindex + 1).Trim().Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries); int i = 0; string newGroupText = GroupText[0] + ", "; foreach (GridColumn newColumn in this.gridView.Columns) { GridColumnModel Newmodel = newColumn.Tag as GridColumnModel; if (Newmodel.Visible && Newmodel.CanSum && !SystemInfo.Instance.GroupSpecialMode) { if (i != GroupText.Count() - 1) i++; string newGroupValue = GroupText[i].Replace(newColumn.Caption, ""); if (newColumn == HeaderColumnSift) { ColumnSiftValue = newGroupValue.Replace(",", ""); } newGroupText += newColumn.Caption + newGroupValue + ", "; } } GridGroupRowInfo.GroupText = GridGroupRowInfo.GroupText.Substring(0, startindex + 1) + newGroupText.TrimEnd(' ').TrimEnd(','); if (!string.IsNullOrWhiteSpace(editValue) && ChartTable.Columns.Count > 0) { string groupText = GridGroupRowInfo.GroupText; int endindex = groupText.LastIndexOf("行"); if (!SystemInfo.Instance.GroupSpecialMode) groupText = groupText.Substring(startindex + 1, endindex - startindex - 1).Trim(); if (!(this.ChartTable.Rows.Cast().FirstOrDefault(x => x["key"] == GridGroupRowInfo.EditValue + "") != null)) { if (BaseImpl.HasExistsTable(ResourceKeys.SettingGrouprptab)) { float vsNum = 0; bool isNum = float.TryParse(ColumnSiftValue, out vsNum); ChartTable.Rows.Add(GridGroupRowInfo.EditValue + "", groupText); if (isNum) { if (SiftEnumObj == HeaderSiftEnum.Sum) { groupText = vsNum.ToString(); } if (SiftEnumObj == HeaderSiftEnum.Avg) { groupText = (vsNum / float.Parse(groupText)) + ""; } if (SiftEnumObj == HeaderSiftEnum.Max) { //gridView.GroupSummary.Add(DevExpress.Data.SummaryItemType.Max, "数据", HeaderColumnSift, "组计:{0}"); } if (SiftEnumObj == HeaderSiftEnum.Min) { } } string tempSql = string.Format(@"insert into {3}(GroupName,GroupAmount,OperAtorId) values('{0}','{1}','{2}');", editValue, groupText, ERPInfo.Instance.UserId, ResourceKeys.SettingGrouprptab); SqlHelper.ExecuteNonQuery(tempSql); } } } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:监听键盘事件 /// 创建人:龚宇超 /// 创建日期:2018-05-31 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected virtual void OnGridViewKeyDown(object sender, KeyEventArgs e) { try { // 替换本列下所有数据为当前单元格数据 if (e.KeyCode == Keys.F6 || e.KeyCode == Keys.F7) { GridColumn column = this.gridView.FocusedColumn; GridColumnModel model = column.Tag as GridColumnModel; if (column != null && column.OptionsColumn.AllowEdit && this.gridView.RowCount > 0 && this.gridView.OptionsBehavior.Editable) { // 允许操作 int focusedRowHandle = this.gridView.FocusedRowHandle; //int totalRowCount = this.gridView.RowCount; DataTable FilteredTable = this.gridView.GetGridViewFilteredAndSortedDataToDataTable(); int totalRowCount = FilteredTable.Rows.Count; //GridCell[] cells = this.gridView.GetSelectedCells(); int[] SelectRows = this.gridView.GetSelectedRows();//之前根据选中单元格判断是否选中多行,选中改成根据选中行数量判断 if (((SelectRows.Length == 1 || gridView.OptionsView.AllowCellMerge) || this.gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect) && focusedRowHandle + 1 < totalRowCount) { if (MessageUtil.Show(e.KeyCode == Keys.F6 ? ResourceKeys.IsReplaceAllEmptyColumn : ResourceKeys.IsReplaceAllColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) { WaitForm.ShowForm("数据填充中"); object obj = this.gridView.GetFocusedRowCellValue(column); bool isFilterContain = gridView.ActiveFilter.Cast().Where(n => n.Column.FieldName.Equals(column.FieldName)).Count() > 0 ? true : false; isFilterContain = isFilterContain && FilteredTable.AsEnumerable().Where(n => !n[column.FieldName].Equals(obj)).Count() > 0 ? true : false; if (obj != null) { Dictionary updateDatas = new Dictionary(); for (int i = focusedRowHandle; i < totalRowCount; i++) { int dataSourceIndex = this.gridView.GetDataSourceRowIndex(i); //如果有修改提交就验证,不合的就不会改变值 if (!string.IsNullOrWhiteSpace(ModifyCond)) { DataRow dr = this.gridView.GetDataRow(i); // 检查条件 if (!ValidateCond(ModifyCond, dr)) continue; } updateDatas.Add(dataSourceIndex, this.gridView.GetDataRow(i)); ; } foreach (int index in updateDatas.Keys) { DataRow row = updateDatas[index]; if (e.KeyCode == Keys.F6) { object obj2 = row[column.FieldName]; // F6 覆盖当前列下所有为空的列 if (string.IsNullOrEmpty(obj2 + "")) { row[column.FieldName] = obj; if (!string.IsNullOrEmpty(model.UnionFields)) { this.SetUnionValue(model, obj + "", index); } //计算规则配置在结果字段上,所以无需验证当前操作控件 this.SetCalcValue(model, obj + "", index); } } else { // F7 覆盖当前列下所有列 row[column.FieldName] = obj; if (!string.IsNullOrEmpty(model.UnionFields)) { this.SetUnionValue(model, obj + "", index); } //计算规则配置在结果字段上,所以无需验证当前操作控件 this.SetCalcValue(model, obj + "", index); } } gridView.PostEditor(); if (isFilterContain) { gridView.FocusedRowHandle = gridView.FocusedRowHandle - 1; } e.Handled = true; } WaitForm.HideForm(); } } else { e.Handled = true; } } } // 已当前列为基准,按顺序生成本列数据 if (e.KeyCode == Keys.F8) { GridColumn column = this.gridView.FocusedColumn; if (column != null && column.OptionsColumn.AllowEdit && this.gridView.RowCount > 0 && this.gridView.OptionsBehavior.Editable) { // 允许操作 int focusedRowHandle = this.gridView.FocusedRowHandle; int totalRowCount = this.gridView.RowCount; // GridCell[] cells = this.gridView.GetSelectedCells(); int[] SelectRows = this.gridView.GetSelectedRows(); if ((SelectRows.Length == 1 || this.gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect) && focusedRowHandle + 1 < totalRowCount) { if (MessageUtil.Show(ResourceKeys.IsGenerateAllColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) { bool isExec = false; long value = 0; int valueNum = 0; object obj = this.gridView.GetFocusedRowCellValue(column); if (!string.IsNullOrEmpty(obj + "")) { //isExec = Int64.TryParse(obj + "", out value); Regex regex = new Regex(@"\D", RegexOptions.RightToLeft); Regex regexNum = new Regex(@"\d", RegexOptions.RightToLeft); int lastIndex = regex.Match(obj.ToString()).Index; string leftString = string.Empty; string rightString = string.Empty; if (lastIndex == 0 && regex.Match(obj.ToString()).Success == false) { leftString = ""; rightString = obj.ToString(); } else { leftString = obj.ToString().Substring(0, lastIndex + 1); rightString = obj.ToString().Substring(lastIndex + 1, obj.ToString().Length - lastIndex - 1); } if (regexNum.Match(rightString).Success == false) { if (MessageUtil.Show(ResourceKeys.SelectColumnValueNotNumber, MessageBoxButtons.YesNo) == DialogResult.Yes) { rightString = "1"; } } valueNum = rightString.Length; value = Convert.ToInt64(rightString); this.gridView.BeginUpdate(); this.gridView.BeginDataUpdate(); for (int i = focusedRowHandle; i < totalRowCount; i++) { gridView.SetRowCellValue(i, column, leftString + value.ToString().PadLeft(valueNum, '0')); //gridView.PostEditor() value++; } this.gridView.EndDataUpdate(); this.gridView.EndUpdate(); gridView.FocusedRowHandle = totalRowCount - 1; e.Handled = true; } else { if (MessageUtil.Show(ResourceKeys.SelectColumnValueTypeNotNumber, MessageBoxButtons.YesNo) == DialogResult.Yes) { value = 1; this.gridView.BeginUpdate(); this.gridView.BeginDataUpdate(); for (int i = focusedRowHandle; i <= totalRowCount; i++) { //gridView.FocusedRowHandle = i; gridView.SetRowCellValue(i, column, value); //gridView.PostEditor(); value++; } this.gridView.EndDataUpdate(); this.gridView.EndUpdate(); gridView.FocusedRowHandle = totalRowCount - 1; e.Handled = true; } } } } else { e.Handled = true; } } } if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.V) { // 清除排序 if (!SystemInfo.Instance.CancelPasteClearSort) { this.gridView.Columns.ClearAllSort(); } //if (this.gridView.IsFindPanelVisible) //{ // MessageUtil.Show("搜索模式下无法粘贴行."); // return; //} object _objData = null; IDataObject dataObj = Clipboard.GetDataObject(); bool IsNewPost = SysModel != null ? SysModel.IsNewPost : false; if (dataObj.GetDataPresent(DataFormats.Text)) _objData = dataObj.GetData(DataFormats.Text); if ((!IsNewPost && SystemInfo.Instance.IsOldPost) || (this.Tag != null && this.Tag.ToString() == "IsOldPost")) { OldPasteMethod(e, _objData); } else { //OldPasteMethod(e, _objData); NewPasteMethod(e, _objData); } if (OnAllAfterParseCallBack != null) { OnAllAfterParseCallBack(null, null); } } // 向下复制整行 if (e.Control && e.Shift && e.KeyCode == Keys.C) { DataRow rt = this.gridView.GetDataRow(gridView.FocusedRowHandle); if (rt != null) { DataTable dt = (DataTable)this.GridControl.DataSource; //dt.Rows.Add(rt.ItemArray); DataRow newRow = dt.NewRow(); newRow.ItemArray = rt.ItemArray; dt.Rows.InsertAt(newRow, gridView.FocusedRowHandle + 1); GridControl.DataSource = dt; } } // 复制单元格 if (e.Control && e.KeyCode == Keys.C) { GridCell[] cells; //复选框状态 if (gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect && gridView.OptionsSelection.EnableAppearanceFocusedCell == false && this.gridView.GetSelectedRows().Length == 0) { //GridViewInfo info = gridView.GetViewInfo() as GridViewInfo; //GridCellInfo cellInfo = info.GetGridCellInfo(gridView.FocusedRowHandle, gridView.FocusedColumn); GridCell cell = new GridCell(gridView.FocusedRowHandle, gridView.FocusedColumn); cells = new GridCell[] { cell }; } else cells = this.gridView.GetSelectedCells(); if (cells.Length == 1 || gridView.OptionsView.AllowCellMerge) { //object obj = gridView.GetFocusedRowCellValue(gridView.FocusedColumn); object obj = gridView.GetFocusedRowCellDisplayText(gridView.FocusedColumn); if (obj != null) { Clipboard.SetDataObject(obj + ""); e.Handled = true; } } else { if (!ExportPermission) { //没有导出权限,不能多格复制 Clipboard.SetData(DataFormats.Text, ""); e.Handled = true; return; } gridView.CopyToClipboard(); e.Handled = true; } } //if (e.Control && e.KeyCode == Keys.F) //{ // //this.gridView.OptionsFind.AlwaysVisible = false; //} } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:新版版粘贴功能(速度快不会触发关联计算等方法) /// 创建人:王一帆 /// 创建日期:2021-03-16 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. private void NewPasteMethod(KeyEventArgs e, object _objData) { if (_objData != null) { string _tempStr = _objData.ToString(); _tempStr = Regex.Replace(_tempStr, "\"[^\"]*(?:\"\"[^\"]*)*\"", m => m.Value.Replace("\r\n", "{lskj}").Replace("\"", "")); int _rowNumber = 1; int _pasteRowCount = 1; string[] _split = { "\r\n" }; string[] _arrayRowStr = _tempStr.Split(_split, StringSplitOptions.None); if (_arrayRowStr.Length < 1) return; GridColumn focColumn = this.gridView.FocusedColumn; focColumn = focColumn == null ? this.gridView.Columns[0] : focColumn; if (focColumn != null) { DataTable table = gridView.GridControl.DataSourceTable(); int beforeNumber = table.Rows.Count; _rowNumber = this.gridView.FocusedRowHandle; if (_rowNumber < 0) { // _rowNumber = 0; //小于0就是焦点不在数据源存在的行中,默认新增 _rowNumber = table.Rows.Count; } if (_arrayRowStr.Length != gridView.SelectedRowsCount) { //选择区域与粘贴行数不匹配 } _pasteRowCount = _arrayRowStr.Length; for (int i = 0; i < _pasteRowCount; i++) { string[] _arrayStr2 = _arrayRowStr[i].Split('\t'); if (IgnoreTab) { _arrayStr2 = new string[] { _arrayRowStr[i] }; } if ((i == _pasteRowCount - 1 && _arrayRowStr[_pasteRowCount - 1].Replace("\r\n", "").Trim() == "")) continue; DataRow newRow = null; if (_rowNumber + 1 > table.Rows.Count) { newRow = table.NewRow(); //table.Rows.Add(newRow); GridColumnCollection gridColumns = this.GridView.Columns; this.gridView.FocusedRowHandle = _rowNumber; foreach (GridColumn col in gridColumns) { GridColumnModel model = col.Tag as GridColumnModel; string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); if (model.DefaultValue != null && model.DefaultValue.Contains("{#") && this.ParentControl != null) { fieldValue = this.ParentControl.ReplaceParentControlValue(model.DefaultValue); if (!string.IsNullOrEmpty(fieldValue)) { newRow[col.FieldName] = fieldValue; } } else if (!string.IsNullOrEmpty(model.DefaultValue) && !model.DefaultValue.Contains("{ROW_")) { newRow[col.FieldName] = fieldValue; } } } this.gridView.FocusedRowHandle = _rowNumber; if (_arrayStr2.Length == 0) _arrayStr2[0] = _arrayRowStr[i]; //int _colNumber = beforeNumber == 0 ? 0 : focColumn.VisibleIndex; //如果设置了最后有空白行,这以空白行选中的列为准 int _colNumber = beforeNumber == 0 && this.GridView.OptionsView.NewItemRowPosition != NewItemRowPosition.Bottom ? 0 : focColumn.VisibleIndex; for (int j = 0; j < _arrayStr2.Length; j++)//j = _colNumber { GridColumn col = gridView.VisibleColumns[_colNumber]; GridColumnModel model = col.Tag as GridColumnModel; if (!string.IsNullOrWhiteSpace(model.DisableCond)) { DataRow FocusedRow = newRow == null ? this.gridView.GetFocusedDataRow() : newRow; string UpdateCond = model.DisableCond; if (this.ParentControl != null) UpdateCond = this.ParentControl.ReplaceParentControlValue(model.DisableCond); UpdateCond = ReplaceHelper.ReplaceRowParam(FocusedRow, UpdateCond); if (!ReplaceHelper.EvalCond(UpdateCond)) { _colNumber += 1; continue; } } if (model != null && !model.ProhibitPaste && (model.CanCopy || ((gridView.OptionsBehavior.Editable) && (gridView.VisibleColumns[_colNumber].OptionsColumn.AllowEdit)))) { // 返回ID类型特殊处理 string cellValue = _arrayStr2[j]; if (!string.IsNullOrEmpty(cellValue)) cellValue = cellValue.Replace("{lskj}", "\n"); bool IsTextEqualValue = false; object value = model != null && ControlType.IsValue(model.FieldType) ? GetValueByCaption(model, col.ColumnEdit, cellValue, out IsTextEqualValue) : cellValue; value = model != null && model.FieldType == 14 ? ReplaceMultiSpace(value) : value; if (model != null && model.FieldType == 17) { value = value.Equals("非校验") ? 0 : value.Equals("校验") ? 1 : value; if (value.Equals("不确定")) { _colNumber += 1; continue; } } if (model.FieldType == 116 || model.FieldType == 117) { RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); //// 避免下拉框值替换失败提示错误 if (model != null && !IsTextEqualValue && cellValue == value + "") { _colNumber += 1; continue; } } if (model.FieldType == 160 || model.FieldType == 161) { RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; FrmModelLookUp2 modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp2; value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); //// 避免下拉框值替换失败提示错误 if (model != null && !IsTextEqualValue && cellValue == value + "") { _colNumber += 1; continue; } } DateTime dateValue = new DateTime(); // 避免下拉框值替换失败提示错误 if (model != null && !IsTextEqualValue && ((ControlType.IsValue(model.FieldType) && cellValue == value + "") || (ControlType.LabTextInt == model.FieldType && (value + "").IsChinese()) || (ControlType.IsDate(model.FieldType) && !DateTime.TryParse(value + "", out dateValue)))) { _colNumber += 1; continue; } if (newRow == null) { gridView.SetRowCellValue(_rowNumber, col, value); } else { if (string.IsNullOrEmpty(value + "")) { if (string.IsNullOrWhiteSpace(newRow[col.FieldName] + "")) { if (col.ColumnType.Name.ToLower() == "string") newRow[col.FieldName] = ""; if (col.ColumnType.Name.ToLower().IndexOf("char") >= 0) newRow[col.FieldName] = ""; if (col.ColumnType.Name.ToLower().IndexOf("int") >= 0) newRow[col.FieldName] = 0; if (col.ColumnType.Name.ToLower() == "decimal") newRow[col.FieldName] = 0; //if (dc.DataType.Name.ToLower().IndexOf("date") >= 0) // tmpRow[dc] = DateTime.Now; } } else { newRow[col.FieldName] = value; } } //gridView.SetRowCellValue(_rowNumber, col, value); } _colNumber += 1; } _rowNumber += 1; if (newRow != null) { // 其它处理(如绑定左侧树结构数据) if (OnParseGridDataCallBack != null) this.OnParseGridDataCallBack(newRow); for (int j = 0; j < gridView.Columns.Count; j++) { if (this.gridView.Columns[j].Tag == null) continue; if ((this.gridView.Columns[j].Tag as GridColumnModel).LimitLength > 0) { int MaxInputLength = System.Text.Encoding.Default.GetBytes(newRow[gridView.Columns[j].FieldName].ToString()).Length; if (MaxInputLength > (this.gridView.Columns[j].Tag as GridColumnModel).LimitLength) { newRow.SetColumnError(newRow.Table.Columns[gridView.Columns[j].FieldName], "当前输入文本超过设定长度!");//不满足条件设置错误信息 } } } table.Rows.Add(newRow); //this.gridView.FocusedRowHandle = _rowNumber - 1; } else { gridView.UpdateCurrentRow(); } } this.gridView.ShowEditor(); e.Handled = true; //SendKeys.Send("{Esc}"); } } } /// /// 说明:老版粘贴功能(会影响复制粘贴速度) /// 创建人:王一帆 /// 创建日期:2021-03-16 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. private void OldPasteMethod(KeyEventArgs e, object _objData) { if (_objData != null) { string _tempStr = _objData.ToString(); _tempStr = Regex.Replace(_tempStr, "\"[^\"]*(?:\"\"[^\"]*)*\"", m => m.Value.Replace("\r\n", "{lskj}").Replace("\"", "")); int _rowNumber = 1; int _pasteRowCount = 1; string[] _split = { "\r\n" }; string[] _arrayRowStr = _tempStr.Split(_split, StringSplitOptions.None); if (_arrayRowStr.Length < 1) return; GridColumn focColumn = this.gridView.FocusedColumn; focColumn = focColumn == null ? this.gridView.Columns[0] : focColumn; if (focColumn != null) { DataTable table = gridView.GridControl.DataSourceTable(); int beforeNumber = table.Rows.Count; _rowNumber = this.gridView.FocusedRowHandle; if (_rowNumber < 0) { //_rowNumber = 0; //小于0就是焦点不在数据源存在的行中,默认新增 _rowNumber = table.Rows.Count; } if (_arrayRowStr.Length != gridView.SelectedRowsCount) { //选择区域与粘贴行数不匹配 } _pasteRowCount = _arrayRowStr.Length; for (int i = 0; i < _pasteRowCount; i++) { string[] _arrayStr2 = _arrayRowStr[i].Split('\t'); if (IgnoreTab) { _arrayStr2 = new string[] { _arrayRowStr[i] }; } if ((i == _pasteRowCount - 1 && _arrayRowStr[_pasteRowCount - 1].Replace("\r\n", "").Trim() == "")) continue; if (_rowNumber + 1 > table.Rows.Count) { if (OnAfterPasting != null) { this.OnAfterPasting(null, null);//直接调用新增行方法,添加关联数据 } else { DataRow newRow = table.NewRow(); table.Rows.Add(newRow); GridColumnCollection gridColumns = this.GridView.Columns; this.gridView.FocusedRowHandle = _rowNumber; foreach (GridColumn col in gridColumns) { GridColumnModel model = col.Tag as GridColumnModel; string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); if (model.DefaultValue.Contains("{#") && this.ParentControl != null) { fieldValue = this.ParentControl.ReplaceParentControlValue(model.DefaultValue); if (!string.IsNullOrEmpty(fieldValue)) { newRow[col.FieldName] = fieldValue; this.gridView.SetFocusedRowCellValue(col, fieldValue); } } else if (!string.IsNullOrEmpty(model.DefaultValue) && !model.DefaultValue.Contains("{ROW_")) { newRow[col.FieldName] = fieldValue; this.gridView.SetFocusedRowCellValue(col, fieldValue); } } //其它处理(如绑定左侧树结构数据) if (OnParseGridDataCallBack != null) this.OnParseGridDataCallBack(newRow); } } this.gridView.FocusedRowHandle = _rowNumber; if (_arrayStr2.Length == 0) _arrayStr2[0] = _arrayRowStr[i]; //int _colNumber = beforeNumber == 0 ? 0 : focColumn.VisibleIndex; //如果设置了最后有空白行,这以空白行选中的列为准 int _colNumber = beforeNumber == 0 && this.GridView.OptionsView.NewItemRowPosition != NewItemRowPosition.Bottom ? 0 : focColumn.VisibleIndex; for (int j = 0; j < _arrayStr2.Length; j++) { GridColumn col = gridView.VisibleColumns[_colNumber]; GridColumnModel model = col.Tag as GridColumnModel; if (!string.IsNullOrWhiteSpace(model.DisableCond)) { DataRow FocusedRow = this.gridView.GetFocusedDataRow(); string UpdateCond = model.DisableCond; if (this.ParentControl != null) UpdateCond = this.ParentControl.ReplaceParentControlValue(model.DisableCond); UpdateCond = ReplaceHelper.ReplaceRowParam(FocusedRow, UpdateCond); if (!ReplaceHelper.EvalCond(UpdateCond)) { _colNumber += 1; continue; } } if (model != null && !model.ProhibitPaste && (model.CanCopy || ((gridView.OptionsBehavior.Editable) && (gridView.VisibleColumns[_colNumber].OptionsColumn.AllowEdit)))) //if ((gridView.OptionsBehavior.Editable) && (gridView.VisibleColumns[_colNumber].OptionsColumn.AllowEdit)) { // 返回ID类型特殊处理 string cellValue = _arrayStr2[j]; if (!string.IsNullOrEmpty(cellValue)) cellValue = cellValue.Replace("{lskj}", "\n"); bool IsTextEqualValue = false; object value = model != null && ControlType.IsValue(model.FieldType) ? GetValueByCaption(model, col.ColumnEdit, cellValue, out IsTextEqualValue) : cellValue; if (model != null && model.FieldType == 17) { value = value.Equals("非校验") ? 0 : value.Equals("校验") ? 1 : value; if (value.Equals("不确定")) { _colNumber += 1; continue; } } if (model.FieldType == 116 || model.FieldType == 117) { RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; FrmModelLookUp modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp; value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); //// 避免下拉框值替换失败提示错误 if (model != null && !IsTextEqualValue && cellValue == value + "") { _colNumber += 1; continue; } } if (model.FieldType == 160 || model.FieldType == 161) { RepositoryItemCheckedComboBoxEdit rccbe = col.ColumnEdit as RepositoryItemCheckedComboBoxEdit; FrmModelLookUp2 modelLookUp = rccbe.Buttons[1].Tag as FrmModelLookUp2; value = ModuleReturnVerify(model, col.ColumnEdit, cellValue, out IsTextEqualValue); //// 避免下拉框值替换失败提示错误 if (model != null && !IsTextEqualValue && cellValue == value + "") { _colNumber += 1; continue; } } DateTime dateValue = new DateTime(); // 避免下拉框值替换失败提示错误 if (model != null && !IsTextEqualValue && ((ControlType.IsValue(model.FieldType) && cellValue == value + "") || (ControlType.LabTextInt == model.FieldType && (value + "").IsChinese()) || (ControlType.IsDate(model.FieldType) && !DateTime.TryParse(value + "", out dateValue)))) { _colNumber += 1; continue; } gridView.SetRowCellValue(_rowNumber, col, value); } _colNumber += 1; } _rowNumber += 1; gridView.UpdateCurrentRow(); } this.gridView.ShowEditor(); e.Handled = true; //SendKeys.Send("{Esc}"); } } } /// /// 说明:自动搜索框弹出时 /// 创建人:龚宇超 /// 创建日期:2019-06-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnAutoSearchEditPopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { try { if (e.MenuType == GridMenuType.Column) { CurrentOperGridView = e.HitInfo.View; GridViewColumnMenu columnMenu = e.Menu as GridViewColumnMenu; //Model.ModuleCode+ e.HitInfo.Column.FieldName DXMenuItem itemSaveColumn = new DXMenuItem("保存表格属性", SaveItemClick2); DXMenuItem itemResetColumn = new DXMenuItem("重置表格属性", ResetItemClick2); itemSaveColumn.BeginGroup = true; itemSaveColumn.Tag = itemResetColumn.Tag = e.HitInfo.Column; columnMenu.Items.AddRange(new DXMenuItem[] { itemSaveColumn, itemResetColumn }); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:自动搜索框弹出时 /// 创建人:龚宇超 /// 创建日期:2019-06-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnsearchEditKeyDown(object sender, KeyEventArgs e) { try { if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.V) { GridLookUpEdit edit = sender as GridLookUpEdit; edit.Tag = "1"; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:设置表格单元格颜色 /// 创建人:龚宇超 /// 创建日期:2017-10-27 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. /// protected void OnGridViewRowCellStyle(object sender, RowCellStyleEventArgs e) { if (e.RowHandle >= 0 && this.GridRowColorsTable != null && this.GridRowColorsTable.Rows.Count > 0 && (!string.IsNullOrEmpty(e.CellValue + "") || SystemInfo.Instance.isBlankCellColor)) { // 渲染界面数据量过多界面刷新会很慢 //DataTable table = this.gridControl.DataSourceTable(); //DataRow gridRow = table.Rows[e.RowHandle]; DataRow gridRow = this.gridView.GetDataRow(e.RowHandle); foreach (DataRow item in this.GridRowColorsTable.Rows) { // string cond = ReplaceHelper.ReplaceRowParam(gridRow, item["condition"] + "").ReplaceColumnParam(e.Column.Name, e.Column.Caption, e.CellValue + ""); string cond = ReplaceHelper.ReplaceRowParamEmptyWrapQuote(gridRow, item["condition"] + "").ReplaceColumnParam(e.Column.Name, e.Column.Caption, e.CellValue + ""); try { if (!string.IsNullOrWhiteSpace(cond) && ReplaceHelper.EvalCond(cond)) { GridRowColorModel model = new GridRowColorModel(item); // 判断单元格是否被选中 bool isCellSelected = gridView.IsCellSelected(e.RowHandle, e.Column); if (!isCellSelected) { if (!string.IsNullOrWhiteSpace(model.BackColor)) { e.Appearance.BackColor = ColorTranslator.FromHtml(model.BackColor); } if (!string.IsNullOrWhiteSpace(model.ForceColor)) { e.Appearance.ForeColor = ColorTranslator.FromHtml(model.ForceColor); } } FontStyle fontStyle = FontStyle.Regular; if (model.IsBold) fontStyle |= FontStyle.Bold; if (model.IsItalic) fontStyle |= FontStyle.Italic; if (model.IsStrickOut) fontStyle |= FontStyle.Strikeout; if (model.IsUnderLine) fontStyle |= FontStyle.Underline; e.Appearance.FontStyleDelta = fontStyle; } } catch (Exception) { //LogHelper.Instance.WriteLog("GridView RowCellStyle Error. Condition:" + model.Condition + ";EvalCondtion:" + cond); } } } } /// /// 说明:设置表格行颜色 /// 创建人:龚宇超 /// 创建日期:2019-06-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewRowStyle(object sender, RowStyleEventArgs e) { if (e.RowHandle >= 0 && this.GridRowColorsTable != null && this.GridRowColorsTable.Rows.Count > 0) { // 渲染界面数据量过多界面刷新会很慢 DataRow gridRow = this.gridView.GetDataRow(e.RowHandle); foreach (DataRow item in this.GridRowColorsTable.Rows) { //string cond = ReplaceHelper.ReplaceRowParam(gridRow, item["condition"] + ""); string cond = ReplaceHelper.ReplaceRowParamEmptyWrapQuote(gridRow, item["condition"] + ""); try { if (!string.IsNullOrWhiteSpace(cond) && ReplaceHelper.EvalCond(cond)) { GridRowColorModel model = new GridRowColorModel(item); if (!string.IsNullOrWhiteSpace(model.BackColor)) { e.Appearance.BackColor = ColorTranslator.FromHtml(model.BackColor); } if (!string.IsNullOrWhiteSpace(model.ForceColor)) { e.Appearance.ForeColor = ColorTranslator.FromHtml(model.ForceColor); } FontStyle fontStyle = FontStyle.Regular; if (model.IsBold) fontStyle |= FontStyle.Bold; if (model.IsItalic) fontStyle |= FontStyle.Italic; if (model.IsStrickOut) fontStyle |= FontStyle.Strikeout; if (model.IsUnderLine) fontStyle |= FontStyle.Underline; e.Appearance.FontStyleDelta = fontStyle; } } catch (Exception) { //LogHelper.Instance.WriteLog("GridView RowCellStyle Error. Condition:" + model.Condition + ";EvalCondtion:" + cond); } } } } /// /// 说明:选中单元格颜色突出显示 /// 创建人:曹屹峰 /// 创建日期:2024-03-05 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void GridView_RowCellStyle(object sender, RowCellStyleEventArgs e) { GridCell[] gridCells = this.GridView.GetSelectedCells(); foreach (GridCell cell in gridCells) { if (e.Column.Name == cell.Column.Name && e.RowHandle == cell.RowHandle) { e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); } } } /// /// 说明:Enables data cells to be painted manually. /// 创建人:龚宇超 /// 创建日期:2017-12-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected virtual void OnGridViewCustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { try { //DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo gridViewInfo = gridView.GetViewInfo() as DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo; //DevExpress.XtraGrid.Views.Grid.ViewInfo.GridCellInfo cellInfo = gridViewInfo.GetGridCellInfo(gridView.FocusedRowHandle, gridView.FocusedColumn); //List mergedRowHandle = new List(); //if (cellInfo.IsMerged && cellInfo.MergedCell != null) //{ // DevExpress.XtraGrid.Views.Grid.ViewInfo.GridMergedCellInfo gridMergedCellInfo = cellInfo.MergedCell as DevExpress.XtraGrid.Views.Grid.ViewInfo.GridMergedCellInfo; // foreach (var item in gridMergedCellInfo.MergedCells) // { // mergedRowHandle.Add(item.RowHandle); // } //} if (gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect) { int[] selectRows = gridView.GetSelectedRows(); foreach (int selectRow in selectRows) {//#9feb6a if (e.RowHandle == selectRow) { e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); if (!string.IsNullOrWhiteSpace(SystemInfo.Instance.SelectRowForeColor)) { e.Appearance.ForeColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowForeColor); } } } } else if (e.RowHandle == gridView.FocusedRowHandle)//|| mergedRowHandle.Contains(e.RowHandle) { e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); if (!string.IsNullOrWhiteSpace(SystemInfo.Instance.SelectRowForeColor)) { e.Appearance.ForeColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowForeColor); } //// 如果当前单元格被选中 → 画虚线 //if (gridView.IsCellSelected(e.RowHandle, e.Column)) //{ // // 先绘制默认内容(文字、背景、行颜色不变) // e.DefaultDraw(); // // 创建虚线笔 // using (Pen pen = new Pen(Color.Black, 1)) // { // pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; // 虚线样式 // // 在单元格内部画一圈虚线边框 // Rectangle rect = e.Bounds; // rect.Width -= 1; // rect.Height -= 1; // e.Graphics.DrawRectangle(pen, rect); // } // // 标记已处理,防止被覆盖 // e.Handled = true; //} } //选中行不改变颜色条件设置的颜色 if (SystemInfo.Instance.ConditionalStylePriority) { if (e.RowHandle >= 0 && this.GridRowColorsTable != null && this.GridRowColorsTable.Rows.Count > 0) { // 渲染界面数据量过多界面刷新会很慢 DataRow gridRow = this.gridView.GetDataRow(e.RowHandle); foreach (DataRow item in this.GridRowColorsTable.Rows) { string cond = ReplaceHelper.ReplaceRowParam(gridRow, item["condition"] + ""); try { if (!string.IsNullOrWhiteSpace(cond) && ReplaceHelper.EvalCond(cond)) { GridRowColorModel model = new GridRowColorModel(item); if (!string.IsNullOrWhiteSpace(model.BackColor) && !this.gridView.GetSelectedRows().Contains(e.RowHandle)) { e.Appearance.BackColor = ColorTranslator.FromHtml(model.BackColor); } if (!string.IsNullOrWhiteSpace(model.ForceColor)) { e.Appearance.ForeColor = ColorTranslator.FromHtml(model.ForceColor); } FontStyle fontStyle = FontStyle.Regular; if (model.IsBold) fontStyle |= FontStyle.Bold; if (model.IsItalic) fontStyle |= FontStyle.Italic; if (model.IsStrickOut) fontStyle |= FontStyle.Strikeout; if (model.IsUnderLine) fontStyle |= FontStyle.Underline; e.Appearance.FontStyleDelta = fontStyle; } } catch (Exception) { //LogHelper.Instance.WriteLog("GridView RowCellStyle Error. Condition:" + model.Condition + ";EvalCondtion:" + cond); } } } if (gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect) { int[] selectRows = gridView.GetSelectedRows(); foreach (int selectRow in selectRows) {//#9feb6a if (e.RowHandle == selectRow) e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); } } else if (e.RowHandle == gridView.FocusedRowHandle) { e.Appearance.BackColor = ColorTranslator.FromHtml(SystemInfo.Instance.SelectRowBackColor); } } string PromptText = string.Empty; // 判断单元格值是否为 null 或空 if ((e.CellValue == null || string.IsNullOrEmpty(e.CellValue.ToString())) && PromptMessage.TryGetValue(e.Column.FieldName, out PromptText)) { // 绘制默认单元格背景 e.DefaultDraw(); // 绘制提示文本(灰色、斜体) var appearance = e.Appearance; appearance.ForeColor = Color.Gray; appearance.FontStyleDelta = FontStyle.Italic; e.Graphics.DrawString(PromptText, appearance.Font, new SolidBrush(appearance.ForeColor), e.Bounds, new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center }); // 标记事件已处理,避免默认绘制覆盖 e.Handled = true; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:表格值改变时,处理关联字段和计算公式 /// 创建人:龚宇超 /// 创建日期:2017-12-15 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. public void OnGridViewCellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { try { if (e.Column.Tag == null) return; GridColumnModel model = e.Column.Tag as GridColumnModel; if (model == null) return; DataRow rowHandleRow = this.GridView.GetDataRow(e.RowHandle); //值改变时,如果是验证是否重复的列报错就清除 if (RepeatedVerificationNames.Count > 0) { DataColumn[] datas = this.GridView.GetDataRow(e.RowHandle).GetColumnsInError(); foreach (DataColumn item in datas) { if (rowHandleRow.GetColumnError(item.ColumnName).Equals("数据重复")) { rowHandleRow.ClearErrors(); break; } } } //计算列 if (model.FieldType == 158) { string result = EvalHelper.Eval2(ReplaceHelper.ReplaceEvalCond(e.Value + "")) + ""; this.gridView.SetRowCellValue(e.RowHandle, e.Column, result); } GridView gridView = this.gridControl.MainView as GridView; DataTable dataTable = this.gridControl.DataSourceTable(); //根据某一列的值自动填充对应值 if (this.AutoPadDataReleColList.Count > 0) { foreach (GridColumnModel selectColumnModel in AutoPadDataReleColList) { if (!string.IsNullOrEmpty(selectColumnModel.AutoPadDataReleColName)) { string value = rowHandleRow[selectColumnModel.FieldName] + ""; string[] dataReleColNames = selectColumnModel.AutoPadDataReleColName.TrimEnd(',').Split(','); if (dataReleColNames.Contains(e.Column.FieldName)) { DataRow[] selectRows = dataTable.Select().Where(n => (n[selectColumnModel.FieldName] + "").Equals(value)).ToArray(); foreach (DataRow selectRow in selectRows) { int dataSourceIndex = dataTable.Rows.IndexOf(selectRow); int index = this.gridView.GetRowHandle(dataSourceIndex); selectRow[e.Column.FieldName] = e.Value; //关联 if (!string.IsNullOrEmpty(model.UnionFields)) { this.SetUnionValue(model, e.Value + "", index); } //计算规则配置在结果字段上,所以无需验证当前操作控件 this.SetCalcValue(model, e.Value + "", index); } } } } } //关联 if (!string.IsNullOrEmpty(model.UnionFields)) { this.SetUnionValue(model, e.Value + "", e.RowHandle); } //计算规则配置在结果字段上,所以无需验证当前操作控件 this.SetCalcValue(model, e.Value + "", e.RowHandle); this.SetUpperValue(model, e.RowHandle, e.Value + ""); this.SetDisableColumn(model, e.RowHandle, e.Value + ""); //验证数据长度 if (model.LimitLength > 0 && e.Value != null) { int MaxInputLength = System.Text.Encoding.Default.GetBytes(e.Value.ToString()).Length; if (model.LimitLength < MaxInputLength) rowHandleRow.SetColumnError(rowHandleRow.Table.Columns[e.Column.ColumnHandle], "当前输入文本超过设定长度!");//满足条件设置错误信息 else rowHandleRow.ClearErrors();//清除错误信息 } //var rows = this.gridControl.DataSourceTable().Select().ToList().Where(n => n[e.Column.FieldName].Equals(Convert.ChangeType(e.Value, e.Column.ColumnType))); //if (!string.IsNullOrEmpty(e.Value.ToString()) && rows.Count() > 0) //{ // MessageUtil.Show("不能输入重复值!"); // this.gridView.SetRowCellValue(e.RowHandle, e.Column, string.Empty); // this.gridView.FocusedRowHandle = e.RowHandle; // this.gridView.FocusedColumn = e.Column; //} if (RefreshTotal) this.gridView.UpdateSummary();//合计列值改变后更新合计计算 } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:取上一行值改变时 /// 创建人:王一帆 /// 创建日期:2020-10-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. public void OnGridViewtUpperValueChanged(GridColumn Newcolumn, string value, int rowhandle, GridColumnModel gridModel) { if (Newcolumn == null) return; GridColumnModel model = Newcolumn.Tag as GridColumnModel; if (!string.IsNullOrEmpty(model.UnionFields)) { this.SetUnionValue(model, value, rowhandle); } // 计算规则配置在结果字段上,所以无需验证当前操作控件 this.SetCalcValue(model, value, rowhandle); this.UpperChange(model, gridModel, rowhandle); this.SetDisableColumn(model, rowhandle, value); } /// /// 说明:单元格 /// 创建人:龚宇超 /// 创建日期:2018-03-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnGridViewSelectionChanged(object sender, SelectionChangedEventArgs e) { try { GridCell[] cells = this.gridView.GetSelectedCells(); int[] rows = this.gridView.GetSelectedRows(); this.pl_buttom.Visible = cells.Length > 1 && rows.Length > 1; if (this.pl_buttom.Visible) { // 分别计算求和、平均值、最大值、最小值、计数 double sum = 0, avg = 0, max = 0, min = 0; int count = 0; string dataFormat = string.Empty; foreach (GridCell cell in cells) { if (count == 0 && !string.IsNullOrWhiteSpace(cell.Column.DisplayFormat.FormatString)) dataFormat = cell.Column.DisplayFormat.FormatString; double cellNumber = 0; string cellValue = this.gridView.GetRowCellValue(cell.RowHandle, cell.Column) + ""; if (double.TryParse(cellValue, out cellNumber)) { cellNumber = Convert.ToDouble(cellValue); if (max < cellNumber) max = cellNumber; if (min == 0 || min > cellNumber) min = cellNumber; count++; sum += cellNumber; } } avg = count == 0 || count == 0 ? 0 : sum / count; this.lblTotal.Text = string.Format(ResourceKeys.GridTotalDisplayText, count, Math.Round(sum, 2), Math.Round(avg, 2), Math.Round(max, 2), Math.Round(min, 2)); if (!string.IsNullOrWhiteSpace(dataFormat)) { if (dataFormat.StartsWith("{0:")) { this.lblTotal.Text = string.Format(ResourceKeys.GridTotalDisplayText, count, string.Format(dataFormat, Convert.ToDecimal(sum)), string.Format(dataFormat, Convert.ToDecimal(avg)), string.Format(dataFormat, Convert.ToDecimal(max)), string.Format(dataFormat, Convert.ToDecimal(min))); } else { this.lblTotal.Text = string.Format(ResourceKeys.GridTotalDisplayText, count, string.Format("{0:" + dataFormat + "}", Convert.ToDecimal(sum)), string.Format("{0:" + dataFormat + "}", Convert.ToDecimal(avg)), string.Format("{0:" + dataFormat + "}", Convert.ToDecimal(max)), string.Format("{0:" + dataFormat + "}", Convert.ToDecimal(min))); } } if (this.TotalQuantity) this.lblTotal.Text = string.Format("已选中 {0} 行", rows.Length); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } this.SelectedRows = this.gridView.GetSelectedRows(); if (gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect && gridView.OptionsSelection.EnableAppearanceFocusedCell == false) this.gridView.UpdateSummary(); if (SystemInfo.Instance.DisplayCheckboxSelection && !string.IsNullOrWhiteSpace(this.MultiplePrimary) && gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect && gridView.OptionsSelection.EnableAppearanceFocusedCell == false) { SelectedDataSource.Clear(); DataRow[] dataRows = this.GetViewFocusedDataRows(); if (dataRows.Length > 0 && dataRows[0].Table.Columns.Contains(this.MultiplePrimary)) { // 遍历勾选的行索引,并获取它们在数据源中的索引 foreach (DataRow row in GetViewFocusedDataRows()) { SelectedDataSource.Add(row[this.MultiplePrimary] + ""); } } } } /// /// 说明:单元格选中计算 /// 创建人:龚宇超 /// 创建日期:2019-06-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewFocusedRowObjectChanged(object sender, FocusedRowObjectChangedEventArgs e) { try { GridCell[] cells = this.gridView.GetSelectedCells(); int[] rows = this.gridView.GetSelectedRows(); this.pl_buttom.Visible = cells.Length > 1 && rows.Length > 1; if (this.pl_buttom.Visible) { // 分别计算求和、平均值、最大值、最小值、计数 double sum = 0, avg = 0, max = 0, min = 0; int count = 0; foreach (GridCell cell in cells) { double cellNumber = 0; string cellValue = this.gridView.GetRowCellValue(cell.RowHandle, cell.Column) + ""; if (double.TryParse(cellValue, out cellNumber)) { cellNumber = Convert.ToDouble(cellValue); if (max < cellNumber) max = cellNumber; if (min == 0 || min > cellNumber) min = cellNumber; count++; sum += cellNumber; } } avg = count == 0 || count == 0 ? 0 : sum / count; this.lblTotal.Text = string.Format(ResourceKeys.GridTotalDisplayText, count, Math.Round(sum, 2), Math.Round(avg, 2), Math.Round(max, 2), Math.Round(min, 2)); if (this.TotalQuantity) this.lblTotal.Text = string.Format("已选中 {0} 行", rows.Length); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 单元格修改 /// /// /// //protected void OnCellValueChanged(object sender, CellValueChangedEventArgs e) //{ // int index = this.GridView.GetFocusedDataSourceRowIndex(); // string columnName =e.Column.FieldName; // if (!modifyThePosition.ContainsKey(index)) // { // modifyThePosition.Add(index, columnName); // } // else { // if (!modifyThePosition[index].Equals(columnName)) modifyThePosition[index] = modifyThePosition[index] + "," + columnName; // } //} /// /// 说明:列右键菜单扩展 /// 创建人:龚宇超 /// 创建日期:2018-02-01 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnGridViewPopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { try { //没有设置右键时,ContextMenuStrip为空。右键菜单可能会必须选中才能关闭,设置空ContextMenuStrip可用解决 if (this.gridControl.ContextMenuStrip == null) { ContextMenuStrip MenuStrip = new ContextMenuStrip(); this.gridControl.ContextMenuStrip = MenuStrip; } if (e.MenuType == GridMenuType.Column) { GridViewColumnMenu columnMenu = e.Menu as GridViewColumnMenu; DXMenuItem itemFixLeft = new DXMenuItem("冻结列", FixLeftItemClick); DXMenuItem itemFixLeftAll = new DXMenuItem("冻结列(所有列)", FixLeftAllItemClick); DXMenuItem itemUnFix = new DXMenuItem("清除冻结", UnFixItemClick); DXMenuItem itemUnFixAll = new DXMenuItem("清除冻结(所有列)", itemUnFixAllClick); DXMenuItem itemSaveColumn = new DXMenuItem("保存表格属性", SaveItemClick); DXMenuItem itemResetColumn = new DXMenuItem("重置表格属性", ResetItemClick); DXMenuItem itemSetExportColumn = new DXMenuItem("设置导出列", SetExportItemClick); DXMenuItem itemExportColumn = new DXMenuItem("导出表格数据", ExportItemClick); DXMenuItem itemPrintColumn = new DXMenuItem("打印表格数据", PrintItemClick); DXMenuItem itemSortColumn = new DXMenuItem("清除全部列排序", ClearSortItemClick); DXMenuItem itemMultifunction = new DXMenuItem("多功能设置分组", Multifunction); DXMenuItem itemLookUpColumn = new DXMenuItem("查找列", LookUpColumn); DXMenuItem itemColumnSift = new DXMenuItem("一键设置列筛选条件", InstColumnSift); DXMenuItem itemChartColumn = new DXMenuItem("一键图表展示", ChartShowClick); DXMenuItem itemBsChartColumn = new DXMenuItem("一键Bs图表展示", BsChartShowClick); DXMenuItem itemBsChartShowClick = new DXMenuItem("一键所有列属性设置", InstAllColumn); itemChartColumn.Visible = this.ChartTable.Rows.Count > 0; itemBsChartColumn.Visible = this.ChartTable.Rows.Count > 0; itemBsChartShowClick.Visible = ERPInfo.Instance.UserName == "管理员" && Model != null; itemSaveColumn.BeginGroup = itemFixLeft.BeginGroup = true; itemUnFixAll.Tag = itemFixLeft.Tag = itemFixLeftAll.Tag = itemUnFix.Tag = itemColumnSift.Tag = e.HitInfo.Column; itemSaveColumn.Tag = itemResetColumn.Tag = itemExportColumn.Tag = itemPrintColumn.Tag = itemSortColumn.Tag = itemChartColumn.Tag = itemBsChartColumn.Tag = itemBsChartShowClick.Tag = itemSetExportColumn.Tag = e.HitInfo.Column; columnMenu.Items.AddRange(new DXMenuItem[] { itemFixLeft, itemFixLeftAll, itemUnFix, itemUnFixAll, itemLookUpColumn }); if (!string.IsNullOrEmpty(CustomColumKey)) columnMenu.Items.AddRange(new DXMenuItem[] { itemSaveColumn, itemResetColumn, itemSetExportColumn }); if (ExportPermission) columnMenu.Items.Add(itemExportColumn); columnMenu.Items.AddRange(new DXMenuItem[] { itemPrintColumn, itemMultifunction, itemSortColumn, itemColumnSift, itemChartColumn, itemBsChartColumn, itemBsChartShowClick }); } else if (e.MenuType == GridMenuType.Summary) { GridHitInfo info; Point pt = this.gridView.GridControl.PointToClient(System.Windows.Forms.Control.MousePosition); info = this.gridView.CalcHitInfo(pt); if (e.Menu is DevExpress.XtraGrid.Menu.GridViewFooterMenu)//如果是Footer菜单则增加复制行选项 { DXMenuCheckItem menuItemCell = new DXMenuCheckItem(); menuItemCell.Tag = info; menuItemCell.Caption = "复制合计"; menuItemCell.Click += new EventHandler(OnMenuItem_Click); DXMenuCheckItem menuItemRow = new DXMenuCheckItem(); menuItemRow.Caption = "复制合计行"; menuItemRow.Tag = info; menuItemRow.Click += new EventHandler(OnMenuItem_Click); e.Menu.Items.AddRange(new DXMenuCheckItem[] { menuItemCell, menuItemRow }); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:带参数自动搜索框 /// 创建人:龚宇超 /// 创建日期:2018-04-28 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnSearchEditQueryPopUp(object sender, CancelEventArgs e) { if (sender is GridLookUpEdit) { try { int popWidth = 0; GridLookUpEdit edit = (sender as GridLookUpEdit); GridColumnModel model = edit.Properties.Tag as GridColumnModel; CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; CurrentOperModel = model; DataRow[] dataRows = this.GetViewFocusedDataRows(); DataRow rowItem = dataRows.Count() > 0 ? dataRows[0] : this.gridView.GetFocusedDataRow(); if (model.FieldType == ControlType.LabAutoGridValueParam || model.FieldType == ControlType.LabAutoGridTextParam || model.FieldType == ControlType.LabAutoCompleteTextParam || model.FieldType == ControlType.LabAutoCompleteValueParam) { if (model != null && (rowItem != null || this.ParentControl != null)) { string sqlValue = model.SqlSource; if (this.ParentControl != null) sqlValue = this.ParentControl.ReplaceParentControlValue(sqlValue); sqlValue = sqlValue.Replace("#", ""); if (rowItem != null) { sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); } DataTable table = MainImpl.GetDataTableResult(sqlValue); if (model.SearchBoxAddition && (model.FieldType == ControlType.LabAutoGridTextParam || model.FieldType == ControlType.LabAutoCompleteTextParam)) { if (this.ManuallyAddData.ContainsKey(model.FieldName)) { List DataRows = this.ManuallyAddData[model.FieldName]; foreach (DataRow row in DataRows) { DataRow newrow = table.NewRow(); newrow.ItemArray = row.ItemArray; table.Rows.Add(newrow); } } } edit.Properties.DataSource = table; string[] columnsWidth = model != null ? model.LookUpFieldsWidth.Trim().TrimEnd(',').Split(',') : null; if (model != null && !string.IsNullOrWhiteSpace(model.LookUpFieldsWidth) && columnsWidth.Length > 0) { int columnWidthIndex = 0; foreach (DataColumn dcol in table.Columns) { if ((dcol.ColumnName.Substring(0, 1) != "_")) { if (edit.Properties.View.Columns.FirstOrDefault(x => x.FieldName == dcol.ColumnName) != null) { GridColumn gCol = edit.Properties.View.Columns[dcol.ColumnName]; int width = 0; if (columnWidthIndex < columnsWidth.Length) { string widthStr = columnsWidth[columnWidthIndex]; width = int.TryParse(widthStr, out width) ? width : GraphicsText.GetTextWidth(gCol.Caption); } else { width = GraphicsText.GetTextWidth(gCol.Caption); int maxWidth = CalcMaxColumnWidth(table, gCol.Name); width = width > maxWidth ? width : maxWidth; } gCol.Width = width; popWidth += gCol.Width; } } columnWidthIndex++; } } else { foreach (DataColumn dcol in table.Columns) { int columnWidth = 0; if ((dcol.ColumnName.Substring(0, 1) != "_")) { if (edit.Properties.View.Columns.FirstOrDefault(x => x.FieldName == dcol.ColumnName) != null) { GridColumn gCol = edit.Properties.View.Columns[dcol.ColumnName]; columnWidth = GraphicsText.GetTextWidth(gCol.Caption); gCol.Width = CalcMaxColumnWidth(table, gCol.Name); gCol.Width = columnWidth > gCol.Width ? columnWidth : gCol.Width; popWidth += gCol.Width; } } } } if (model != null && model.LookUpWidth > 0) { popWidth = model.LookUpWidth + 5; } edit.Properties.PopupFormSize = new Size(popWidth, edit.Properties.PopupFormSize.Height); } } else { DataTable table = edit.Properties.DataSource != null ? (DataTable)edit.Properties.DataSource : new DataTable(); string[] columnsWidth = model != null ? model.LookUpFieldsWidth.Trim().TrimEnd(',').Split(',') : null; if (model != null && !string.IsNullOrWhiteSpace(model.LookUpFieldsWidth) && columnsWidth.Length > 0) { int columnWidthIndex = 0; foreach (GridColumn dcol in edit.Properties.View.Columns) { if ((dcol.FieldName.Substring(0, 1) != "_")) { int width = 0; if (columnWidthIndex < columnsWidth.Length) { string widthStr = columnsWidth[columnWidthIndex]; width = int.TryParse(widthStr, out width) ? width : GraphicsText.GetTextWidth(dcol.Caption); } else { width = GraphicsText.GetTextWidth(dcol.Caption); int maxWidth = CalcMaxColumnWidth(table, dcol.Name); width = width > maxWidth ? width : maxWidth; } dcol.Width = width; popWidth += dcol.Width; } columnWidthIndex++; } } else { foreach (GridColumn dcol in edit.Properties.View.Columns) { int columnWidth = 0; if ((dcol.FieldName.Substring(0, 1) != "_")) { columnWidth = GraphicsText.GetTextWidth(dcol.Caption); dcol.Width = CalcMaxColumnWidth(table, dcol.Name); dcol.Width = columnWidth > dcol.Width ? columnWidth : dcol.Width; popWidth += dcol.Width; } } } if (model != null && model.LookUpWidth > 0) { popWidth = model.LookUpWidth; } edit.Properties.PopupFormSize = new Size(popWidth, edit.Properties.PopupFormSize.Height); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } if (sender is SearchLookUpEdit) { try { SearchLookUpEdit edit = (sender as SearchLookUpEdit); GridColumnModel model = edit.Properties.Tag as GridColumnModel; CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; CurrentOperModel = model; DataRow[] dataRows = this.GetViewFocusedDataRows(); DataRow rowItem = dataRows != null ? dataRows[0] : null; //DataRow rowItem = this.gridView.GetFocusedDataRow(); if (model.FieldType == ControlType.LabAutoCompleteTextParam || model.FieldType == ControlType.LabAutoCompleteValueParam) { if (model != null && rowItem != null) { string sqlValue = model.SqlSource; if (this.ParentControl != null) sqlValue = this.ParentControl.ReplaceParentControlValue(sqlValue); sqlValue = sqlValue.Replace("#", ""); sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); edit.Properties.DataSource = MainImpl.GetDataTableResult(sqlValue); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } } /// /// 下拉列表框(带参数)。打开时更新下拉框数据 /// /// /// private void ComboxEdit_QueryPopUp(object sender, CancelEventArgs e) { if (sender is LookUpEdit) { try { int popWidth = 0; LookUpEdit edit = (sender as LookUpEdit); GridColumnModel model = edit.Properties.Tag as GridColumnModel; CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; CurrentOperModel = model; DataRow[] dataRows = this.GetViewFocusedDataRows(); DataRow rowItem = dataRows.Count() > 0 ? dataRows[0] : this.gridView.GetFocusedDataRow(); if (model.FieldType == ControlType.LabComboxValueParam || model.FieldType == ControlType.LabComboxTextParam) { if (model != null && (rowItem != null || this.ParentControl != null)) { string sqlValue = model.SqlSource; if (this.ParentControl != null) sqlValue = this.ParentControl.ReplaceParentControlValue(sqlValue); sqlValue = sqlValue.Replace("#", ""); if (rowItem != null) { sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); } DataTable table = MainImpl.GetDataTableResult(sqlValue); edit.Properties.DataSource = table; } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } } /// /// 说明:打开多选控件 /// 创建人:龚宇超 /// 创建日期:2018-03-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnButtonEditClick(object sender, ButtonPressedEventArgs e) { try { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmLookUp frmMain = e.Button.Tag as FrmLookUp; GridColumnModel model = frmMain.Tag as GridColumnModel; frmMain.EditText = btnEdit.Text; frmMain.CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; if (model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam) { frmMain.EditValue = btnEdit.EditValue + ""; frmMain.EditText = string.Empty; } else { frmMain.EditText = btnEdit.Text; frmMain.EditValue = string.Empty; } //多选关联单据头 frmMain.SourceSQL = model.SqlSource.Replace("#", ""); //单据头关联取值 if (this.ParentControl != null) { frmMain.SourceSQL = this.ParentControl.ReplaceControlValue(frmMain.SourceSQL); } frmMain.SourceSQL = ReplaceHelper.ReplaceRowParam(this.GridView.GetFocusedDataRow(), frmMain.SourceSQL); //frmMain.SourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), frmMain.SourceSQL); frmMain.DataSource = BaseImpl.GetDataTableResult(frmMain.SourceSQL); DialogResult result = frmMain.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = frmMain.EditValue; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:表格打开模块返回id /// 创建人:曹屹峰 /// 创建日期:2021-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void OnModuleChoice(object sender, ButtonPressedEventArgs e) { try { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmModelLookUp modelLookUp = e.Button.Tag as FrmModelLookUp; GridColumnModel model = modelLookUp.Tag as GridColumnModel; modelLookUp.EditText = btnEdit.Text; modelLookUp.CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; //if (model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueParam) //{ // modelLookUp.EditValue = btnEdit.EditValue + ""; // modelLookUp.EditText = string.Empty; //} //else //{ // modelLookUp.EditText = btnEdit.Text; // modelLookUp.EditValue = string.Empty; //} modelLookUp.EditText = btnEdit.Text; modelLookUp.EditValue = btnEdit.EditValue + ""; //多选关联单据头 modelLookUp.SourceSQL = model.SqlSource.Replace("#", ""); //单据头关联取值 if (this.ParentControl != null) { modelLookUp.SourceSQL = this.ParentControl.ReplaceControlValue(modelLookUp.SourceSQL); } modelLookUp.SourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), modelLookUp.SourceSQL); //modelLookUp.DataSource = BaseImpl.GetDataTableResult(modelLookUp.SourceSQL); modelLookUp.InitControls(modelLookUp.UnionModuleCodel); DialogResult result = modelLookUp.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = modelLookUp.EditValue; } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:表格打开模块返回id 新版 /// 创建人:曹屹峰 /// 创建日期:2021-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void OnModuleChoiceNew(object sender, ButtonPressedEventArgs e) { try { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmModelLookUp2 modelLookUp = e.Button.Tag as FrmModelLookUp2; GridColumnModel model = modelLookUp.Tag as GridColumnModel; modelLookUp.EditText = btnEdit.Text; modelLookUp.CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; modelLookUp.EditText = btnEdit.Text; modelLookUp.EditValue = btnEdit.EditValue + ""; //多选关联单据头 string SourceSQL = modelLookUp.SysModel.MenuSql.Replace("#", "") + model.SplicingConditions; //单据头关联取值 if (this.ParentControl != null) { SourceSQL = this.ParentControl.ReplaceControlValue(SourceSQL); } modelLookUp.NewSourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), SourceSQL); modelLookUp.AddModuleResult = model.addModuleResult; //modelLookUp.DataSource = BaseImpl.GetDataTableResult(modelLookUp.SourceSQL); modelLookUp.InitControls(modelLookUp.UnionModuleCodel); DialogResult result = modelLookUp.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = modelLookUp.EditValue; string[] resultFields = model.addModuleResult.Trim().Split(','); DataRow focusedRow = this.gridView.GetFocusedDataRow(); if (focusedRow != null) { foreach (string resultKey in modelLookUp.ModuleResultDic.Keys) { string resultValue = modelLookUp.ModuleResultDic[resultKey]; if (focusedRow.Table.Columns.Contains(resultKey)) { focusedRow[resultKey] = resultValue; } } } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:表格打开模块添加行 /// 创建人:曹屹峰 /// 创建日期:2021-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void OnModuleAddLine(object sender, ButtonPressedEventArgs e) { try { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmModelLookUp2 modelLookUp = e.Button.Tag as FrmModelLookUp2; GridColumnModel model = modelLookUp.Tag as GridColumnModel; modelLookUp.EditText = btnEdit.Text; modelLookUp.CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; modelLookUp.EditText = btnEdit.Text; modelLookUp.EditValue = btnEdit.EditValue + ""; //多选关联单据头 string SourceSQL = modelLookUp.SysModel.MenuSql.Replace("#", "") + model.SplicingConditions; //单据头关联取值 if (this.ParentControl != null) { SourceSQL = this.ParentControl.ReplaceControlValue(SourceSQL); } modelLookUp.NewSourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), SourceSQL); modelLookUp.AddModuleResult = model.addModuleResult; modelLookUp.InitControls(modelLookUp.UnionModuleCodel); DialogResult result = modelLookUp.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = modelLookUp.EditValue; this.GridView.SetFocusedRowCellValue(model.FieldName, modelLookUp.EditValue); if (OnNewLine != null && modelLookUp.EditValueList.Count > 0) { OnNewLine(model.FieldName, modelLookUp.EditValueList); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 模块返回框清空 /// /// /// private void BtnEdit_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Back) { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; btnEdit.EditValue = string.Empty; btnEdit.Text = string.Empty; } } /// /// 说明:表格打开模块返回数据源行 /// 创建人:唐德馨 /// 创建日期:2022-10-4 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void OnModuleRowsChoice(object sender, ButtonPressedEventArgs e) { try { ButtonEdit btnEdit = (ButtonEdit)sender; FrmRowsModelLookUp modelLookUp = e.Button.Tag as FrmRowsModelLookUp; GridColumnModel model = modelLookUp.Tag as GridColumnModel; modelLookUp.EditText = btnEdit.Text; modelLookUp.CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; if (model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam) { modelLookUp.EditValue = btnEdit.EditValue + ""; modelLookUp.EditText = string.Empty; } else { modelLookUp.EditText = btnEdit.Text; modelLookUp.EditValue = string.Empty; } ////多选关联单据头 //modelLookUp.SourceSQL = model.SqlSource.Replace("#", ""); ////单据头关联取值 //if (this.ParentControl != null) //{ // modelLookUp.SourceSQL = this.ParentControl.ReplaceControlValue(modelLookUp.SourceSQL); //} //modelLookUp.SourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), modelLookUp.SourceSQL); //modelLookUp.DataSource = BaseImpl.GetDataTableResult(modelLookUp.SourceSQL); string sourceSql = string.Empty; if (!string.IsNullOrEmpty(model.SqlSource)) { sourceSql = model.SqlSource; } else { DataRow modelRow = MainImpl.GetSystemdllTab(model.addModuleld);//获取单个模块信息 if (modelRow == null) { MessageUtil.Show("模块编号[" + model.addModuleld + "],配置错误!\r\n该模块信息未找到!"); return; } ModuleModel moduleModel = new ModuleModel(modelRow);// 系统模块实体对象 sourceSql = moduleModel.MenuSql; } //多选关联单据头 modelLookUp.SourceSQL = sourceSql.Replace("#", ""); //单据头关联取值 if (this.ParentControl != null) { modelLookUp.SourceSQL = this.ParentControl.ReplaceControlValue(modelLookUp.SourceSQL); } modelLookUp.SourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), modelLookUp.SourceSQL); //modelLookUp.DataSource = BaseImpl.GetDataTableResult(modelLookUp.SourceSQL); modelLookUp.InitControls(); DialogResult result = modelLookUp.ShowDialog(); modelLookUp.DataSource = null; if (result == DialogResult.OK) { //btnEdit.EditValue = modelLookUp.EditValue; DataRow returnRow = modelLookUp.selectRowsEditValue; DataRow dataRow = this.gridView.GetFocusedDataRow(); if (!string.IsNullOrEmpty(model.SqlSource)) { foreach (GridColumn gridColumn in this.gridView.Columns) { GridColumnModel colModel = gridColumn.Tag as GridColumnModel; if (!string.IsNullOrEmpty(colModel.unionCompare) && colModel.unionCompare.Trim().Split('^').Length == 2) { string[] fields = colModel.unionCompare.Trim().Split('^'); string inField = fields[0]; string outField = fields[1]; if (returnRow.Table.Columns.Contains(inField)) { dataRow[outField] = returnRow[inField] + ""; } } } } else { //btnEdit.EditValue = modelLookUp.EditValue; foreach (DataColumn col in returnRow.Table.Columns) { if (dataRow.Table.Columns.Contains(col.ColumnName)) { dataRow[col.ColumnName] = returnRow[col.ColumnName] + ""; } } } SendKeys.Send("{Esc}"); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:表格打开模块返回数据源行(优化) /// 创建人:唐德馨 /// 创建日期:2022-10-4 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void OnModuleRowsChoiceNew(object sender, ButtonPressedEventArgs e) { try { ButtonEdit btnEdit = (ButtonEdit)sender; FrmRowsModelLookUpNew modelLookUp = e.Button.Tag as FrmRowsModelLookUpNew; GridColumnModel model = modelLookUp.Tag as GridColumnModel; modelLookUp.EditText = btnEdit.Text; modelLookUp.CurrentOperColumnKey = Model.ModuleCode + "_" + model.FieldName; if (model.FieldType == ControlType.LabMultiSelectValue || model.FieldType == ControlType.LabMultiSelectValueNew || model.FieldType == ControlType.LabMultiSelectValueParam) { modelLookUp.EditValue = btnEdit.EditValue + ""; modelLookUp.EditText = string.Empty; } else { modelLookUp.EditText = btnEdit.Text; modelLookUp.EditValue = string.Empty; } string sourceSql = string.Empty; if (!string.IsNullOrEmpty(model.SqlSource)) { sourceSql = model.SqlSource; } else { DataRow modelRow = MainImpl.GetSystemdllTab(model.addModuleld);//获取单个模块信息 if (modelRow == null) { MessageUtil.Show("模块编号[" + model.addModuleld + "],配置错误!\r\n该模块信息未找到!"); return; } ModuleModel moduleModel = new ModuleModel(modelRow);// 系统模块实体对象 sourceSql = moduleModel.MenuSql; } //多选关联单据头 modelLookUp.SourceSQL = sourceSql.Replace("#", ""); //单据头关联取值 if (this.ParentControl != null) { modelLookUp.SourceSQL = this.ParentControl.ReplaceControlValue(modelLookUp.SourceSQL); } modelLookUp.SourceSQL = ReplaceHelper.ReplaceRowParam(this.gridView.GetFocusedDataRow(), modelLookUp.SourceSQL); modelLookUp.InitControls(); DialogResult result = modelLookUp.ShowDialog(); modelLookUp.DataSource = null; if (result == DialogResult.OK) { DataRow returnRow = modelLookUp.selectRowsEditValue; DataRow dataRow = this.gridView.GetFocusedDataRow(); if (!string.IsNullOrEmpty(model.SqlSource)) { foreach (GridColumn gridColumn in this.gridView.Columns) { GridColumnModel colModel = gridColumn.Tag as GridColumnModel; if (!string.IsNullOrEmpty(colModel.unionCompare) && colModel.unionCompare.Trim().Split('^').Length == 2) { string[] fields = colModel.unionCompare.Trim().Split('^'); string inField = fields[0]; string outField = fields[1]; if (returnRow.Table.Columns.Contains(inField)) { dataRow[outField] = returnRow[inField] + ""; } } } } else { foreach (DataColumn col in returnRow.Table.Columns) { if (dataRow.Table.Columns.Contains(col.ColumnName)) { dataRow[col.ColumnName] = returnRow[col.ColumnName] + ""; } } } SendKeys.Send("{Esc}"); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:打开sql生成组件 /// 创建人:曹屹峰 /// 创建日期:2021-09-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. private void OnSqlGenerate(object sender, ButtonPressedEventArgs e) { CheckedComboBoxEdit btnEdit = (CheckedComboBoxEdit)sender; FrmAutoSqlLoad sqlGenerator = new FrmAutoSqlLoad(); GridColumnModel model = sqlGenerator.Tag as GridColumnModel; sqlGenerator.EditText = btnEdit.Text; DialogResult result = sqlGenerator.ShowDialog(); if (result == DialogResult.OK) { btnEdit.EditValue = sqlGenerator.EditText; } } /// /// 说明:表格双击打开模块配置 /// 创建人:龚宇超 /// 创建日期:2018-08-13 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// protected void OnGridViewDoubleClick(object sender, EventArgs e) { try { DataRow mSelectRow = this.gridView.GetFocusedDataRow(); if (this.gridControl.ContextMenuStrip != null) { Dictionary DbClickItemDic = new Dictionary(); foreach (ToolStripItem cms in this.gridControl.ContextMenuStrip.Items) { GridRightMenuModel model = cms.Tag as GridRightMenuModel; if (model != null && model.DbClick) { DbClickItemDic.Add(cms, model); } } // 判断右键菜单是否可用 foreach (ToolStripItem cms in DbClickItemDic.Keys) { GridRightMenuModel model = DbClickItemDic[cms]; if (model != null && model.DbClick) { if (model.PrivilegeOper.Length > 1 && !model.PrivilegeOper.Contains(ERPInfo.Instance.UserName + ",")) { cms.Enabled = false; } else { if (!string.IsNullOrWhiteSpace(model.MenuCond)) { try { string cond = ReplaceHelper.ReplaceRowParam(mSelectRow, model.MenuCond); if (ParentControl != null) cond = ParentControl.ReplaceParentControlValue(cond); cms.Enabled = ReplaceHelper.EvalCond(cond); } catch (Exception) { MessageUtil.Show(ResourceKeys.SetRightMenuCondFault); } } } if (cms.Enabled) { cms.PerformClick(); } else { //MessageUtil.Show(ResourceKeys.CondtionNotSatisfiable); continue; } return; } } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 表格单击逻辑 /// /// /// protected void OnGridViewClick(object sender, EventArgs e) { try { Point gcPoint = gridControl.PointToScreen(gridControl.Location); Point pt = new Point(MousePosition.X - gcPoint.X, MousePosition.Y - gcPoint.Y); GridHitInfo _hitInfo = GridView.CalcHitInfo(pt); if (_hitInfo != null && _hitInfo.InRowCell && _hitInfo.Column.ColumnEdit is RepositoryItemHyperLinkEdit hyperLinkEdit) { if (_hitInfo.Column.Tag is GridColumnModel gridColumnModel) { if (gridColumnModel.FieldType == ControlType.LabHyperlink) { HyperLinkEdit_Click(hyperLinkEdit, null); } else if (gridColumnModel.FieldType == ControlType.LabRightlink) { OnRightClick(hyperLinkEdit, null); } } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明: /// 创建人:龚宇超 /// 创建日期:2019-06-10 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. protected void OnGridViewEndSorting(object sender, EventArgs e) { try { this.gridView.MoveFirst(); //this.gridView.SmoothScroll(0); } catch (Exception) { } //this.gridView.SelectRowHandler(0); } #region 表格数据源改变时进行字段长度判断 /// /// 说明:表格数据源改变时进行字段长度判断 /// 创建人:唐德馨 /// 创建日期:2021-10-09 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void OnGridDataSourceChanged(object sender, EventArgs e) { GridView gridView = (GridView)sender; foreach (GridColumn col in gridView.Columns) { if (col.Tag != null && col.Tag is GridColumnModel) { GridColumnModel model = col.Tag as GridColumnModel; if (model.LimitLength > 0) { for (int i = 0; i < gridView.DataRowCount; i++) { DataRow HandleRow = (gridView.GetRow(i) as DataRowView).Row; int MaxInputLength = System.Text.Encoding.Default.GetBytes(gridView.GetRowCellValue(i, col) + "").Length; if (model.LimitLength < MaxInputLength) HandleRow.SetColumnError(HandleRow.Table.Columns[col.ColumnHandle], "当前输入文本超过设定长度!");//满足条件设置错误信息 } } } } // 调用动态构建方法 if (CustomGroupBandEx != null || CustomGroupTreeBandEx != null) { DataTable currentDataSource = gridView.GridControl.DataSource as DataTable; if (CustomGroupBandEx != null && currentDataSource != null) { BuildDynamicGroupedColumns(CustomGroupBandEx, currentDataSource); } if (CustomGroupTreeBandEx != null && currentDataSource != null) { BuildDynamicGroupedColumns(CustomGroupTreeBandEx, currentDataSource); } } } /// /// 构建多表头格式 /// /// /// private void BuildDynamicGroupedColumns(BandedGridControlEx bandedGridControlEx, DataTable originalDataSource) { bandedGridControlEx.BandedView.BeginUpdate(); bandedGridControlEx.BandedView.OptionsView.ColumnAutoWidth = false; /* ========= 0. 取列定义 ========= */ GridColumnModel GroupPrimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupPrimary); GridColumnModel GroupFieldprimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupField == 1); List GroupField = ColumnList.Where(o => o.IsCustomGroupField == 2 || o.IsCustomGroupField == 4).ToList(); // 4 = 特殊字段 List sumField = ColumnList.Where(o => o.IsCustomGroupField == 3).ToList(); if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any()) return; /* ========= 1. 清空现有列 ========= */ bandedGridControlEx.BandedView.Bands.Clear(); bandedGridControlEx.BandedView.Columns.Clear(); bandedGridControlEx.BandedView.GroupSummary.Clear(); bandedGridControlEx.BandedView.OptionsView.ShowFooter = false; /* ========= 2. 创建“基本信息”Band ========= */ List normalColumns = ColumnList.Where(o => o.IsCustomGroupField == 0 || o.IsCustomGroupField == 3).ToList(); bool bandedFirstVisibleColumn = true; GridBand normalBand = new GridBand { Caption = "基本信息" }; if (this.AggregationFreeze) normalBand.Fixed = FixedStyle.Left; bandedGridControlEx.BandedView.Bands.Add(normalBand); foreach (var normalCol in normalColumns) { if (!originalDataSource.Columns.Contains(normalCol.FieldName)) continue; BandedGridColumn col = new BandedGridColumn { FieldName = normalCol.FieldName, Caption = normalCol.FieldText, Width = normalCol.Width, Visible = normalCol.Visible, Tag = normalCol, OptionsColumn = { AllowEdit = normalCol.Edit, FixedWidth = true } }; col.OptionsFilter.AutoFilterCondition = AutoFilterCondition.Contains; col.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; if (!normalCol.Edit) { col.AppearanceHeader.Options.UseForeColor = true; col.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } if (normalCol.CanNull) { col.AppearanceHeader.Options.UseForeColor = true; col.AppearanceHeader.ForeColor = RequiredForceColor; } bandedGridControlEx.SetColumnFormat(col, normalCol); SetDynamicBandedColumnSumming(bandedGridControlEx.BandedView, col, normalCol, ref bandedFirstVisibleColumn, false); normalBand.Columns.Add(col); bandedGridControlEx.BandedView.Columns.Add(col); } /* ========= 3. 生成动态表头列表 ========= */ var dynamicHeaders = originalDataSource.AsEnumerable() .Select(r => r[GroupFieldprimary.FieldName]) .Where(v => v != null && v != DBNull.Value) .Select(v => v is DateTime dt ? dt.ToString("yyyy-MM-dd") : v.ToString()) .Distinct() .ToList(); /* ========= 4. 生成动态 Band + 子列 ========= */ foreach (string headerName in dynamicHeaders) { GridBand dynamicBand = new GridBand { Caption = headerName }; bandedGridControlEx.BandedView.Bands.Add(dynamicBand); // 尝试把 headerName 解析成日期,以便下面用星期几 DateTime headerDate; bool isDateHeader = DateTime.TryParse(headerName, out headerDate); foreach (var subField in GroupField) { string dynamicFieldName = $"{headerName}_{subField.FieldName}"; /* —— 计算子列 Caption —— */ string subCaption = subField.FieldText; // 默认 if (subField.IsCustomGroupField == 4 && isDateHeader) { // 将星期几转成中文“日一二三四五六”,根据需要可自行改动 string[] cnWeek = { "日", "一", "二", "三", "四", "五", "六" }; subCaption = cnWeek[(int)headerDate.DayOfWeek]; // 0=Sunday } BandedGridColumn subColumn = new BandedGridColumn { Name = dynamicFieldName, FieldName = dynamicFieldName, Caption = subCaption, Width = subField.Width, Visible = subField.Visible, Tag = subField, MinWidth = subField.Width, MaxWidth = subField.Width, OptionsColumn = { AllowEdit = subField.Edit, FixedWidth = true } }; subColumn.OptionsFilter.AutoFilterCondition = AutoFilterCondition.Contains; subColumn.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; if (!subField.Edit) { subColumn.AppearanceHeader.Options.UseForeColor = true; subColumn.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } if (subField.CanNull) { subColumn.AppearanceHeader.Options.UseForeColor = true; subColumn.AppearanceHeader.ForeColor = RequiredForceColor; } bandedGridControlEx.SetColumnFormat(subColumn, subField); SetDynamicBandedColumnSumming(bandedGridControlEx.BandedView, subColumn, subField, ref bandedFirstVisibleColumn, true); dynamicBand.Columns.Add(subColumn); bandedGridControlEx.BandedView.Columns.Add(subColumn); } } bandedGridControlEx.BandedView.EndUpdate(); /* ========= 5. 构建最终数据源并绑定 ========= */ DataTable dynamicDataTable = BuildDynamicDataSource( originalDataSource, GroupPrimary, GroupFieldprimary, GroupField, normalColumns, sumField, dynamicHeaders); bandedGridControlEx.gridControl.DataSource = dynamicDataTable; if (OnBuildGroupedColumnCallBack != null) { OnBuildGroupedColumnCallBack(bandedGridControlEx.BandedView, null); } } /// /// 构建多表头格式 /// /// /// private void BuildDynamicGroupedColumns(TreeBandedGridControlEx TreeBandedGridControlEx, DataTable originalDataSource) { TreeBandedGridControlEx.TreeListObj.BeginUpdate(); TreeBandedGridControlEx.TreeListObj.OptionsView.AutoWidth = false; /* ========= 0. 取列定义 ========= */ GridColumnModel GroupPrimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupPrimary); GridColumnModel GroupFieldprimary = ColumnList.FirstOrDefault(o => o.IsCustomGroupField == 1); List GroupField = ColumnList.Where(o => o.IsCustomGroupField == 2 || o.IsCustomGroupField == 4).ToList(); // 4 = 特殊字段 List sumField = ColumnList.Where(o => o.IsCustomGroupField == 3).ToList(); if (GroupPrimary == null || GroupFieldprimary == null || !GroupField.Any()) return; /* ========= 1. 清空现有列 ========= */ TreeBandedGridControlEx.TreeListObj.Bands.Clear(); TreeBandedGridControlEx.TreeListObj.Columns.Clear(); TreeBandedGridControlEx.TreeListObj.OptionsView.ShowSummaryFooter = false; /* ========= 2. 创建“基本信息”Band ========= */ List normalColumns = ColumnList.Where(o => o.IsCustomGroupField == 0 || o.IsCustomGroupField == 3).ToList(); bool treeFirstVisibleColumn = true; DevExpress.XtraTreeList.Columns.TreeListBand normalBand = new DevExpress.XtraTreeList.Columns.TreeListBand { Caption = "基本信息" }; if (this.AggregationFreeze) normalBand.Fixed = DevExpress.XtraTreeList.Columns.FixedStyle.Left; normalBand.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; normalBand.AppearanceHeader.Options.UseTextOptions = true; TreeBandedGridControlEx.TreeListObj.Bands.Add(normalBand); foreach (var normalCol in normalColumns) { if (!originalDataSource.Columns.Contains(normalCol.FieldName)) continue; DevExpress.XtraTreeList.Columns.TreeListColumn col = new DevExpress.XtraTreeList.Columns.TreeListColumn { FieldName = normalCol.FieldName, Caption = normalCol.FieldText, Width = normalCol.Width, Visible = normalCol.Visible, Tag = normalCol, OptionsColumn = { AllowEdit = normalCol.Edit, FixedWidth = true } }; col.OptionsFilter.AutoFilterCondition = DevExpress.XtraTreeList.Columns.AutoFilterCondition.Contains; col.OptionsFilter.FilterPopupMode = DevExpress.XtraTreeList.FilterPopupMode.CheckedList; if (!normalCol.Edit) { col.AppearanceHeader.Options.UseForeColor = true; col.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } if (normalCol.CanNull) { col.AppearanceHeader.Options.UseForeColor = true; col.AppearanceHeader.ForeColor = RequiredForceColor; } col.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; col.AppearanceHeader.Options.UseTextOptions = true; TreeBandedGridControlEx.SetColumnFormat(col, normalCol); SetDynamicTreeColumnSumming(TreeBandedGridControlEx.TreeListObj, col, normalCol, ref treeFirstVisibleColumn); normalBand.Columns.Add(col); TreeBandedGridControlEx.TreeListObj.Columns.Add(col); } /* ========= 3. 生成动态表头列表 ========= */ var dynamicHeaders = originalDataSource.AsEnumerable() .Select(r => r[GroupFieldprimary.FieldName]) .Where(v => v != null && v != DBNull.Value) .Select(v => v is DateTime dt ? dt.ToString("yyyy-MM-dd") : v.ToString()) .Distinct() .ToList(); /* ========= 4. 生成动态 Band + 子列 ========= */ foreach (string headerName in dynamicHeaders) { DevExpress.XtraTreeList.Columns.TreeListBand dynamicBand = new DevExpress.XtraTreeList.Columns.TreeListBand { Caption = headerName }; dynamicBand.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; dynamicBand.AppearanceHeader.Options.UseTextOptions = true; TreeBandedGridControlEx.TreeListObj.Bands.Add(dynamicBand); // 尝试把 headerName 解析成日期,以便下面用星期几 DateTime headerDate; bool isDateHeader = DateTime.TryParse(headerName, out headerDate); foreach (var subField in GroupField) { string dynamicFieldName = $"{headerName}_{subField.FieldName}"; /* —— 计算子列 Caption —— */ string subCaption = subField.FieldText; // 默认 if (subField.IsCustomGroupField == 4 && isDateHeader) { // 将星期几转成中文“日一二三四五六”,根据需要可自行改动 string[] cnWeek = { "日", "一", "二", "三", "四", "五", "六" }; subCaption = cnWeek[(int)headerDate.DayOfWeek]; // 0=Sunday } DevExpress.XtraTreeList.Columns.TreeListColumn subColumn = new DevExpress.XtraTreeList.Columns.TreeListColumn { Name = dynamicFieldName, FieldName = dynamicFieldName, Caption = subCaption, Width = subField.Width, Visible = subField.Visible, Tag = subField, MinWidth = subField.Width, OptionsColumn = { AllowEdit = subField.Edit, FixedWidth = true } }; subColumn.OptionsFilter.AutoFilterCondition = DevExpress.XtraTreeList.Columns.AutoFilterCondition.Contains; subColumn.OptionsFilter.FilterPopupMode = DevExpress.XtraTreeList.FilterPopupMode.CheckedList; if (!subField.Edit) { subColumn.AppearanceHeader.Options.UseForeColor = true; subColumn.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } if (subField.CanNull) { subColumn.AppearanceHeader.Options.UseForeColor = true; subColumn.AppearanceHeader.ForeColor = RequiredForceColor; } subColumn.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; subColumn.AppearanceHeader.Options.UseTextOptions = true; TreeBandedGridControlEx.SetColumnFormat(subColumn, subField); SetDynamicTreeColumnSumming(TreeBandedGridControlEx.TreeListObj, subColumn, subField, ref treeFirstVisibleColumn); dynamicBand.Columns.Add(subColumn); TreeBandedGridControlEx.TreeListObj.Columns.Add(subColumn); } } TreeBandedGridControlEx.TreeListObj.EndUpdate(); /* ========= 5. 构建最终数据源并绑定 ========= */ DataTable dynamicDataTable = BuildDynamicDataSource( originalDataSource, GroupPrimary, GroupFieldprimary, GroupField, normalColumns, sumField, dynamicHeaders); TreeBandedGridControlEx.TreeListObj.DataSource = dynamicDataTable; if (OnBuildGroupedColumnCallBack != null) { OnBuildGroupedColumnCallBack(TreeBandedGridControlEx.TreeListObj, null); } } /// /// 构建数据源 /// /// /// /// /// /// /// /// /// /// 把行转列、动态列拼接,并对指定列做求和 /// /// /// 把行转列、动态列拼接,并对指定列做求和(兼容 DateTime 作为 Header 列) /// private DataTable BuildDynamicDataSource( DataTable original, // 原始数据 GridColumnModel keyCol, // 分组主键 GridColumnModel headerCol, // 动态列的“Header”列(可能是 DateTime) List subCols, // Header 后要展开的子列 List normalCols, // 普通列(取首行值) List sumColumns, // 需要求和的列 List headers) // Header 值集合(建议已格式化为 yyyy-MM-dd 等字符串) { // 统一把 Header 的原始值转成用于匹配/建列的键(string) string formatKey(object v) { if (v == null || v == DBNull.Value) return null; if (v is DateTime) return ((DateTime)v).ToString("yyyy-MM-dd"); // 如需其它格式,修改此处 return v.ToString(); } string keyOf(object v) => formatKey(v) ?? string.Empty; // 避免 null 键 var dt = new DataTable(); /* ============ 1. 建列 ============ */ // 主键列 dt.Columns.Add(keyCol.FieldName, original.Columns[keyCol.FieldName].DataType); // 辅助:原表已有列名 var exist = new HashSet(original.Columns.Cast().Select(c => c.ColumnName)); // 普通列:不重复、不覆盖主键 foreach (var col in normalCols) { if (col.FieldName == keyCol.FieldName) continue; if (!exist.Contains(col.FieldName)) continue; if (!dt.Columns.Contains(col.FieldName)) dt.Columns.Add(col.FieldName, original.Columns[col.FieldName].DataType); } // 求和列:类型沿用原列 foreach (var col in sumColumns) { if (!exist.Contains(col.FieldName)) continue; if (!dt.Columns.Contains(col.FieldName)) dt.Columns.Add(col.FieldName, original.Columns[col.FieldName].DataType); } // 动态列:以 headers × subCols 展开;类型沿用子列类型 foreach (var h in headers) { foreach (var s in subCols) { if (!exist.Contains(s.FieldName)) continue; string dyn = $"{h}_{s.FieldName}"; if (!dt.Columns.Contains(dyn)) dt.Columns.Add(dyn, original.Columns[s.FieldName].DataType); } } /* ============ 2. 分组聚合 ============ */ foreach (var grp in original.AsEnumerable().GroupBy(r => r[keyCol.FieldName])) { var newRow = dt.NewRow(); var first = grp.First(); // 主键值 newRow[keyCol.FieldName] = first[keyCol.FieldName]; // 普通列:取首行 foreach (var col in normalCols) { if (!exist.Contains(col.FieldName)) continue; if (!dt.Columns.Contains(col.FieldName)) continue; newRow[col.FieldName] = first[col.FieldName]; } // 求和列:以“当前分组中的第一个 Header 键”为准,仅汇总这一组 string firstHeader = grp.Select(r => keyOf(r[headerCol.FieldName])).FirstOrDefault(); foreach (var col in sumColumns) { if (!exist.Contains(col.FieldName)) continue; if (!dt.Columns.Contains(col.FieldName)) continue; decimal sum = 0m; foreach (var r in grp) { if (keyOf(r[headerCol.FieldName]) != firstHeader) continue; var v = r[col.FieldName]; if (v == null || v == DBNull.Value) continue; sum += Convert.ToDecimal(v); } // 把 decimal 结果转换成目标列的数据类型再写入 var targetType = dt.Columns[col.FieldName].DataType; object sumValue; if (targetType == typeof(decimal)) sumValue = sum; else if (targetType == typeof(int)) sumValue = Convert.ToInt32(sum); else if (targetType == typeof(long)) sumValue = Convert.ToInt64(sum); else if (targetType == typeof(double)) sumValue = Convert.ToDouble(sum); else if (targetType == typeof(float)) sumValue = Convert.ToSingle(sum); else sumValue = sum; // 兜底:直接写 decimal newRow[col.FieldName] = sumValue; } // 动态列:用统一的键做命中 var lookup = grp.ToLookup(r => keyOf(r[headerCol.FieldName])); foreach (var h in headers) { foreach (var s in subCols) { if (!exist.Contains(s.FieldName)) continue; string dyn = $"{h}_{s.FieldName}"; if (!dt.Columns.Contains(dyn)) continue; var hit = lookup[keyOf(h)].FirstOrDefault(); // headers 已是 string newRow[dyn] = hit == null ? DBNull.Value : hit[s.FieldName]; } } dt.Rows.Add(newRow); } return dt; } #endregion #region 绑定表格树结构弹出框 /// /// 说明:值为空时弹出搜索界面 /// 创建人:王一帆 /// 创建日期:2021-03-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnAutoGridLookUpGotFocus(object sender, MouseEventArgs e) { try { PopupContainerEdit btnEdit = sender as PopupContainerEdit; PubTreeLookUp popup = (btnEdit.Properties.PopupControl.Tag) as PubTreeLookUp; popup.popupContainerEdit = btnEdit; if (!btnEdit.IsPopupOpen) { btnEdit.ShowPopup(); btnEdit.Focus(); PopupEdit = btnEdit; //if (popup.model.FieldType == ControlType.LabCheckTreeLookText || popup.model.FieldType == ControlType.LabCheckTreeLookValue) //{ // if (model != null && rowItem != null) // { // string sqlValue = model.SqlSource; // if (this.ParentControl != null) // sqlValue = this.ParentControl.ReplaceParentControlValue(sqlValue); // sqlValue = sqlValue.Replace("#", ""); // sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); // DataTable table = MainImpl.GetDataTableResult(sqlValue); // edit.Properties.DataSource = table; // foreach (DataColumn dcol in table.Columns) // { // int columnWidth = 0; // if ((dcol.ColumnName.Substring(0, 1) != "_")) // { // if (edit.Properties.View.Columns.FirstOrDefault(x => x.FieldName == dcol.ColumnName) != null) // { // GridColumn gCol = edit.Properties.View.Columns[dcol.ColumnName]; // columnWidth = GraphicsText.GetTextWidth(gCol.Caption); // gCol.Width = CalcMaxColumnWidth(table, gCol.Name); // gCol.Width = columnWidth > gCol.Width ? columnWidth : gCol.Width; // popWidth += gCol.Width; // } // } // } // edit.Properties.PopupFormSize = new System.Drawing.Size(popWidth, edit.Properties.PopupFormSize.Height); // } //} this.RefreshPopupDataSource("", popup); popup.TreeViewExObj.UnCheckAllNodes(); if (!string.IsNullOrWhiteSpace(btnEdit.Properties.OwnerEdit.Text)) { GridColumnModel model = popup.model; string[] spilts = btnEdit.Properties.OwnerEdit.Text.Trim().Replace(", ", ",").TrimEnd(',').Split(','); for (int i = 0; i < spilts.Length; i++) { DataRow rowItem = rowItem = popup.TreeViewExObj.DataSource.Rows.Cast().FirstOrDefault(x => x[model.ValueMember] + "" == spilts[i].Trim()); if (rowItem != null) { string keyValue = rowItem[model.ValueMember] + ""; TreeNode[] nodes = popup.TreeViewObj.Nodes.Find(keyValue, true); nodes[0].Checked = true; popup.TreeViewExObj.tvMain_AfterCheck(popup.TreeViewExObj, new TreeViewEventArgs(nodes[0], TreeViewAction.ByMouse)); } } } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:鼠标弹起时刷新数据 /// 创建人:王一帆 /// 创建日期:2021-03-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnAutoGridLookUpKeyUp(object sender, KeyEventArgs e) { try { PopupContainerEdit btnEdit = sender as PopupContainerEdit; PubTreeLookUp popup = (btnEdit.Properties.PopupControl.Tag) as PubTreeLookUp; if (e.KeyCode == Keys.Enter) { btnEdit.Focus(); } else { this.RefreshPopupDataSource(btnEdit.Properties.OwnerEdit.Text, popup); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:刷新树节点的数据源 /// 创建人:王一帆 /// 创建日期:2018-03-21 /// 修改人: /// 修改日期: /// 修改备注:; /// 版本:1.0 /// private void RefreshPopupDataSource(string searchText, PubTreeLookUp popup) { if (string.IsNullOrEmpty(popup.SourceSQL)) { // 本地搜索 } else { // 数据库搜索 string sqlValue = string.Format("select * from ({0}) temp where {1} like '%{3}%' or {2} like '%{3}%' or dbo.P_getpy({2}) like '%{3}%'", popup.SourceSQL, popup.ValueField, popup.TextMember, searchText); popup.DataSource = MainImpl.GetDataTableResult(sqlValue); } } /// /// 说明: /// 创建人:龚宇超 /// 创建日期:2018-03-15 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. protected void OnPopupGridViewEnter(object sender, KeyEventArgs e) { try { PubTreeLookUp popup = (PopupEdit.Properties.PopupControl.Tag) as PubTreeLookUp; if (e.KeyCode == Keys.Enter) { GridColumnModel model = popup.model; // string ids = popup.TreeViewExObj.GetCheckValues(); string ids = popup.isRootNode ? popup.TreeViewExObj.GetCheckValues(true) : popup.TreeViewExObj.GetCheckValues(false); if (ids != null) { ids = ids.Replace("'", ""); if (model.FieldType == ControlType.LabTreeLookText || model.FieldType == ControlType.LabCheckTreeLookText) { string[] values = ids.Trim(',').Split(','); string text = string.Empty; foreach (string item in values) { DataRow rowItem = popup.TreeViewExObj.DataSource.Rows.Cast().FirstOrDefault(x => x[popup.ValueMember] + "" == item); if (rowItem != null) { text += rowItem[popup.TextMember] + ","; } } ids = text.Trim(','); } PopupEdit.Properties.OwnerEdit.EditValue = ids.Trim(','); this.Focus(); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:自定义设置其弹出框宽度 /// 创建人:王一帆 /// 创建日期:2021-03-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid column. private void OnPopupGridMouseClick(object sender, TreeNodeMouseClickEventArgs e) { try { PubTreeLookUp popup = (PopupEdit.Properties.PopupControl.Tag) as PubTreeLookUp; if (e.Node != null && e.Node.Bounds.Contains(e.Location)) { if (e.Node.Nodes.Count > 0 && !popup.isRootNode) { return; } PopupEdit.Properties.OwnerEdit.EditValue = (popup.model.FieldType == ControlType.LabTreeLookText || popup.model.FieldType == ControlType.LabCheckTreeLookText) ? e.Node.Text.ToString() : e.Node.Name.ToString(); this.Focus(); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:修复筛选列是第二级目录后点击会重绘条件 /// 创建人:唐德馨 /// 创建日期:2021-07-08 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid columnFilterPopupChecke. public virtual void OnShowFilterPopupCheckedListBox(object sender, FilterPopupCheckedListBoxEventArgs e) { try { GridView gridView = (GridView)sender; string actStr = this.gridView.ActiveFilterString;//获取筛选条件 string[] actStr_list = actStr.Split(new string[] { "And" }, StringSplitOptions.None); DataTable datatable = new DataTable(); if (actStr != "" && (!actStr_list[0].Contains(e.Column.FieldName) || (this.gridView.OptionsView.ShowAutoFilterRow && e.Column.FilterInfo.Type == ColumnFilterType.AutoFilter)))// { CriteriaOperator criteria_op = this.gridView.ActiveFilterCriteria; GroupOperator group_op = new GroupOperator(); InOperator in_op = new InOperator(); if (this.gridView.ActiveFilterString != "") { if (!actStr_list[0].Contains(e.Column.FieldName) && this.gridView.ActiveFilterCriteria.GetType() == typeof(InOperator)) { in_op = this.gridView.ActiveFilterCriteria as InOperator;//获取筛选规则信息 criteria_op = in_op as CriteriaOperator; for (int i = 0; i < in_op.Operands.Count; i++) { if (in_op.Operands[i].ToString().Contains(e.Column.FieldName)) { in_op.Operands.RemoveRange(i, in_op.Operands.Count - i); break; } else continue; } } else if (!actStr_list[0].Contains(e.Column.FieldName) && this.gridView.ActiveFilterCriteria.GetType() == typeof(GroupOperator)) { group_op = this.gridView.ActiveFilterCriteria as GroupOperator;//获取筛选规则信息 criteria_op = group_op as CriteriaOperator; for (int i = 0; i < group_op.Operands.Count; i++) { if (group_op.Operands[i].ToString().Contains(e.Column.FieldName)) { group_op.Operands.RemoveRange(i, group_op.Operands.Count - i); break; } else continue; } } DataView filteredDataView = this.gridView.DataSource as DataView; string RowFilter = string.Empty; try { datatable = filteredDataView.Table.Select(DevExpress.Data.Filtering.CriteriaToWhereClauseHelper.GetDataSetWhere(criteria_op)).CopyToDataTable(); } catch (Exception) { if (RowFilter.Split(new string[] { "And" }, StringSplitOptions.None)[0].Contains(" is null or ")) { if (RowFilter.Contains("And")) RowFilter = RowFilter.Substring(0, RowFilter.IndexOf(" or ")) + ")" + RowFilter.Substring(RowFilter.IndexOf(" And "), RowFilter.Length - RowFilter.IndexOf(" And ")); else if (actStr_list.Length == 1) RowFilter = RowFilter.Substring(0, RowFilter.IndexOf(" or ")) + ")"; else if (actStr_list.Length > 1) RowFilter = RowFilter.Substring(0, RowFilter.IndexOf(" or ")) + "))"; } datatable = filteredDataView.Table.Select(RowFilter).CopyToDataTable(); } //List list = datatable.AsEnumerable().Select(r => r[e.Column.FieldName]).ToList();//获取筛选后的值 List list = new List(); foreach (DataRow row in datatable.Rows) { if (row[e.Column.FieldName].GetType() == typeof(DateTime)) list.Add(((DateTime)row[e.Column.FieldName]).ToShortDateString()); else list.Add(row[e.Column.FieldName]); } CheckedListBoxItemCollection _Items = new CheckedListBoxItemCollection(); for (int i = 0; i < e.CheckedComboBox.Items.Count; i++) { var Item_value = e.CheckedComboBox.Items[i].Value as FilterItem; if (Item_value.Value != null) { if (Item_value.Value.GetType() == typeof(DateTime) && list.Contains(((DateTime)Item_value.Value).ToShortDateString())) _Items.Add(e.CheckedComboBox.Items[i]); else if (list.Contains(Item_value.Value)) _Items.Add(e.CheckedComboBox.Items[i]); } else if (Item_value.Value == null) { if (list.Contains(null) || list.Contains("") || list.Contains(DBNull.Value)) _Items.Add(e.CheckedComboBox.Items[i]); } //if (Item_value.Value != null && Item_value.Value.GetType() == typeof(DateTime)) //{ // if (list.Contains(((DateTime)Item_value.Value).ToShortDateString())) // { // _Items.Add(e.CheckedComboBox.Items[i]); // } //} //else if (list.Contains(Item_value.Value) && Item_value.Value != null) //{ // _Items.Add(e.CheckedComboBox.Items[i]); //} //else if (list.Contains(null) && Item_value.Value == null || list.Contains("") && Item_value.Value == null) //{ // _Items.Add(e.CheckedComboBox.Items[i]); //} } e.CheckedComboBox.Items.Clear(); for (int i = 0; i < _Items.Count; i++) { e.CheckedComboBox.Items.Add(_Items[i]); } e.CheckedComboBox.HighlightedItemStyle = HighlightStyle.Skinned; } } if (!SystemInfo.Instance.DisableFilteringQuantity) { DataTable filterTable = gridView.GetGridViewFilteredAndSortedDataToDataTable(); DataRow[] dataRowArray = filterTable.Select(); for (int i = 0; i < e.CheckedComboBox.Items.Count(); i++) { try { CheckedListBoxItem checkedListBoxItem = e.CheckedComboBox.Items[i]; if (checkedListBoxItem.Value is FilterItem) { FilterItem filterItem = (FilterItem)checkedListBoxItem.Value; string text = filterItem.Text; object value = filterItem.Value; int count = dataRowArray.Where(n => (n[e.Column.FieldName] + "").Equals(value + "")).Count(); checkedListBoxItem.Description = $"{text} ({count})"; } } finally { } } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:输入文本长度限制事件 /// 创建人:唐德馨 /// 创建日期:2021-07-08 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The grid columnFilterPopupChecke. private void OnGridView_ValidateRow(object sender, ValidateRowEventArgs e) { GridView gridView = (GridView)sender; DataRow row = gridView.GetDataRow(e.RowHandle); for (int i = 0; i < gridView.Columns.Count; i++) { if (this.gridView.Columns[i].Tag == null) continue; if ((this.gridView.Columns[i].Tag as GridColumnModel).LimitLength > 0) { int MaxInputLength = System.Text.Encoding.Default.GetBytes(row[gridView.Columns[i].FieldName].ToString()).Length; if (MaxInputLength > (this.gridView.Columns[i].Tag as GridColumnModel).LimitLength) { row.SetColumnError(row.Table.Columns[gridView.Columns[i].FieldName], "当前输入文本超过设定长度!");//满足条件设置错误信息 } } } } #endregion /// /// 操作列按钮点击事件 /// /// /// private void OnItemButtonEdit_ButtonClick(object sender, ButtonPressedEventArgs e) { EditorButton editorButton = e.Button as EditorButton; GridRightMenuModel menuModel = editorButton.Tag as GridRightMenuModel; ToolStripMenuItem toolStripMenuItem = this.gridViewRightMenu.RightMenuBtnEdits.ContainsKey(menuModel.Id) ? this.gridViewRightMenu.RightMenuBtnEdits[menuModel.Id] : null; if (toolStripMenuItem != null) { bool allowClick = true; int[] mSelectRows = this.gridView.GetSelectedRows(); DataRow mSelectRow = this.gridView.GetDataRow(mSelectRows[0]); if (menuModel != null) { if (menuModel.PrivilegeOper.Length > 1 && !menuModel.PrivilegeOper.Contains(ERPInfo.Instance.UserName + ",")) { allowClick = false; } else { if (!string.IsNullOrWhiteSpace(menuModel.MenuCond)) { try { string cond = string.Empty; if (this.gridViewRightMenu.ControlObj != null) cond = this.gridViewRightMenu.ControlObj.ReplaceParentControlValue(menuModel.MenuCond); cond = ReplaceHelper.ReplaceRowParam(mSelectRow, menuModel.MenuCond); if (this.gridView != null) { GridCell[] cells = this.gridView.GetSelectedCells(); if (cells != null && cells.Length > 0 && cond.Contains("{COLUMN_")) { GridCell cell = cells[0]; DataRow focusedRow = this.gridView.GetFocusedDataRow(); string colValue = focusedRow == null || !focusedRow.Table.Columns.Contains(cell.Column.Name) ? "" : focusedRow[cell.Column.Name] + ""; cond = cond.ReplaceColumnParam(cell.Column.Name, cell.Column.Caption, colValue); } } if (this.gridViewRightMenu.ControlObj != null) cond = this.gridViewRightMenu.ControlObj.ReplaceParentControlValue(cond); allowClick = ReplaceHelper.EvalCond(cond); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(ResourceKeys.SetRightMenuCondFault + "\r\n" + Message); } } } } if (allowClick) toolStripMenuItem.PerformClick(); } } /// /// 点击Footer单元格复制信息 /// 创建人:tdx /// 创建日期:2022/9/26 /// /// /// private void OnGridView_Click(object sender, EventArgs e) { GridHitInfo info; Point pt = this.gridView.GridControl.PointToClient(System.Windows.Forms.Control.MousePosition); info = this.gridView.CalcHitInfo(pt); if (info != null) { DevExpress.XtraGrid.Drawing.GridFooterCellInfoArgs footerCell = info.GetType().GetProperty("FooterCell").GetValue(info, null) as DevExpress.XtraGrid.Drawing.GridFooterCellInfoArgs; if (footerCell != null) { string value = footerCell.DisplayText; if (!string.IsNullOrWhiteSpace(value)) Clipboard.SetText(value); } } } /// /// 添加右键菜单选项 /// /// /// private void OnGridView_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { GridHitInfo info; Point pt = this.gridView.GridControl.PointToClient(System.Windows.Forms.Control.MousePosition); info = this.gridView.CalcHitInfo(pt); if (e.Menu is DevExpress.XtraGrid.Menu.GridViewFooterMenu)//如果是Footer菜单则增加复制行选项 { DXMenuCheckItem menuItemCell = new DXMenuCheckItem(); menuItemCell.Tag = info; menuItemCell.Caption = "复制合计"; menuItemCell.Click += new EventHandler(OnMenuItem_Click); DXMenuCheckItem menuItemRow = new DXMenuCheckItem(); menuItemRow.Caption = "复制合计行"; menuItemRow.Tag = info; menuItemRow.Click += new EventHandler(OnMenuItem_Click); e.Menu.Items.AddRange(new DXMenuCheckItem[] { menuItemCell, menuItemRow }); } } /// /// 合计行数据复制 /// /// /// private void OnMenuItem_Click(object sender, EventArgs e) { try { DXMenuCheckItem menuItemCell = (DXMenuCheckItem)sender; if (menuItemCell.Caption.Equals("复制合计行")) { string copyFooterRowStr = string.Empty; foreach (GridColumn col in this.gridView.VisibleColumns) { if (!string.IsNullOrWhiteSpace(copyFooterRowStr) && !string.IsNullOrWhiteSpace(col.SummaryText)) { copyFooterRowStr += string.Format("\t{0}", col.SummaryText); } else if (string.IsNullOrWhiteSpace(copyFooterRowStr) && !string.IsNullOrWhiteSpace(col.SummaryText)) { copyFooterRowStr += col.SummaryText; } } if (!string.IsNullOrWhiteSpace(copyFooterRowStr)) Clipboard.SetText(copyFooterRowStr); } else { GridHitInfo info = menuItemCell.Tag as GridHitInfo; if (info != null) { DevExpress.XtraGrid.Drawing.GridFooterCellInfoArgs footerCell = info.GetType().GetProperty("FooterCell").GetValue(info, null) as DevExpress.XtraGrid.Drawing.GridFooterCellInfoArgs; if (footerCell != null) { string value = footerCell.DisplayText; if (!string.IsNullOrWhiteSpace(value)) Clipboard.SetText(value); } } } } catch (Exception ex) { MessageUtil.Show(ex.Message); } } /// /// 说明:离开行事件,记录上次选中行 /// 创建人:唐德馨/para> /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. private void OnGridView_BeforeLeaveRow(object sender, RowAllowEventArgs e) { this.LastFocusedRowHandle = e.RowHandle; } /// /// 判断输入的字符串是否可以转换成数值类型 /// /// /// public static bool IsNumberic(string str) { double vsNum; bool isNum; isNum = double.TryParse(str, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out vsNum); return isNum; } /// /// 隐藏自动搜索框的过滤面板 /// /// /// private void OnCustomDrawFilterPanel(object sender, CustomDrawObjectEventArgs e) { GridFilterPanelInfoArgs info = e.Info as DevExpress.XtraGrid.Drawing.GridFilterPanelInfoArgs; info.ShowCloseButton = false; info.ShowCustomizeButton = false; info.ShowActiveButton = false; e.Handled = 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; cond = ReplaceHelper.ReplaceRowParam(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; } /// /// 条码文本改变为code128B /// /// /// public string ExCode128B(string barcode) { string result = ""; int checksum = 104; int j = 1; for (int ii = 0; ii < barcode.Length; ii++) { if (barcode[ii] >= 32) { checksum += (barcode[ii] - 32) * (ii + 1); } else { checksum += (barcode[ii] + 64) * (ii + 1); } } checksum = checksum % 103; if (checksum < 95) { checksum += 32; } else { checksum += 100; } result = Convert.ToChar(204) + barcode.ToString() + Convert.ToChar(checksum) + Convert.ToChar(206); return result; } /// /// 格式化条码文本 /// /// /// private void OnTextEdit_FormatEditValue(object sender, ConvertEditValueEventArgs e) { RepositoryItemPictureEdit ItemPictureEdit = sender as RepositoryItemPictureEdit; //ItemPictureEdit.NullText = " "; if (ItemPictureEdit != null && !string.IsNullOrWhiteSpace(e.Value + "")) { BarcodeSettings settings = new BarcodeSettings(); settings.X = 0.6f;//设置黑白条宽度 settings.ImageHeight = 40;//设置生成的条码图片高度 settings.ImageWidth = 100;//设置生成的条码图片宽度 settings.Type = BarCodeType.Code128; settings.Data = e.Value + "";//设置条码数据 settings.ShowTextOnBottom = true;//设置数据文本显示在条码底部*/ settings.ShowText = true;//设置数据文本显示 BarCodeGenerator bargenerator = new BarCodeGenerator(settings); Image barcodeimage = bargenerator.GenerateImage(); e.Value = barcodeimage; } // e.Value = e.Value + ""; e.Handled = true; } /// /// 说明:刷新数据源 /// 创建人:曹屹峰 /// 创建日期:2023-9-30 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// 判断是否只刷新UpdateColumn中配置的列的数据源 public void RefreshDataSource(bool UpdateColumnRefresh = false) { this.mLoading = false; mControlSourceDic.Clear(); ResetExtendedReturnState(); SetColumnsSource(UpdateColumnRefresh); } /// /// 触发 重复验证列 的验证 /// public bool VerifyDuplicateColumns() { DataTable dt = this.gridControl.DataSource as DataTable; // 使用HashSet来存储每一行指定列的值的组合 HashSet uniqueRows = new HashSet(); foreach (DataRow row in dt.Rows) { // 将指定列的值组合成一个字符串 string combinedRow = string.Join("-", RepeatedVerificationNames.Select(col => row[col].ToString()).ToArray()); // 如果HashSet中已经存在这个组合的字符串,说明有重复行 if (uniqueRows.Contains(combinedRow)) { foreach (string item in RepeatedVerificationNames) { row.SetColumnError(row.Table.Columns[item], "数据重复");//满足条件设置错误信息 } return true;// 发现重复行,直接返回true } else { uniqueRows.Add(combinedRow); // 没有重复,则添加到HashSet中 } } // 遍历完毕,没有重复行 return false; } /// /// 全部列设置为禁编状态 /// public virtual void SetReadOnlyAllColumn() { this.gridView.BeginUpdate(); GridColumnCollection gc = this.GridView.Columns; foreach (GridColumn item in gc) { GridColumnModel model = item.Tag as GridColumnModel; if (model == null) continue; item.OptionsColumn.AllowEdit = false; item.OptionsColumn.ReadOnly = !item.OptionsColumn.AllowEdit; if (!item.OptionsColumn.AllowEdit) { item.AppearanceHeader.Options.UseForeColor = true; item.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } else { item.AppearanceHeader.Options.UseForeColor = true; item.AppearanceHeader.ForeColor = ColorTranslator.FromHtml("#00000"); } if (model.FieldType == ControlType.LabMemoEdit) item.OptionsColumn.AllowEdit = true; } this.gridView.EndUpdate(); } /// /// 重新设置表格的字段属性 /// /// 修改字段 /// 必填字段 public virtual void SetFieldStatus(string modifyFields, string requiredFields, DataTable AuthorityTable = null) { this.ModifyFields = modifyFields; this.RequiredFields = requiredFields; GridColumnCollection gc = this.GridView.Columns; bool Modify = false; bool Required = false; Color RequiredForceColor = string.IsNullOrEmpty(SystemInfo.Instance.ControlRequiredColor) ? Color.Blue : ColorTranslator.FromHtml(SystemInfo.Instance.ControlRequiredColor); //修改字段 if (!string.IsNullOrEmpty(modifyFields) && modifyFields != "-1") { modifyFields = modifyFields + ","; Modify = true; modifyFields = modifyFields.ToLower(); } if (!string.IsNullOrEmpty(requiredFields) && requiredFields != "-1") { Required = true; requiredFields = requiredFields + ","; requiredFields = requiredFields.ToLower(); } this.gridView.BeginUpdate(); foreach (GridColumn item in gc) { GridColumnModel model = item.Tag as GridColumnModel; //修改 if (Modify && modifyFields.Split(',').Contains(item.FieldName.ToLower())) { if (!string.IsNullOrWhiteSpace(model.PrivilegeOper) && AuthorityTable != null) { List targetPrivTypeIds = new List(); foreach (string permission in model.PrivilegeOper.Split(',')) { if (!string.IsNullOrWhiteSpace(permission)) targetPrivTypeIds.Add(int.Parse(permission)); } //获取权限对应的人员名称 string userString = string.Join(",", AuthorityTable.AsEnumerable() .Where(row => targetPrivTypeIds.Contains(row.Field("privTypeId"))) .Select(row => row.Field("userList")) .Where(value => value != null) .ToList()); if (!userString.Split(',').Contains(ERPInfo.Instance.UserName)) continue; } item.OptionsColumn.AllowEdit = modifyFields.IndexOf(item.FieldName + ",", StringComparison.OrdinalIgnoreCase) != -1; item.OptionsColumn.ReadOnly = !item.OptionsColumn.AllowEdit; if (!item.OptionsColumn.AllowEdit) { item.AppearanceHeader.Options.UseForeColor = true; item.AppearanceHeader.ForeColor = ColorTranslator.FromHtml(HeaderColor); } else { item.AppearanceHeader.Options.UseForeColor = true; item.AppearanceHeader.ForeColor = ColorTranslator.FromHtml("#00000"); } if (model.FieldType == ControlType.LabMemoEdit) item.OptionsColumn.AllowEdit = true; } //必填 if (Required && requiredFields.Split(',').Contains(item.FieldName.ToLower())) { item.AppearanceHeader.Options.UseForeColor = true; item.AppearanceHeader.ForeColor = RequiredForceColor; } } this.gridView.EndUpdate(); } /// /// 设置动态列显示和隐藏 /// /// public void SetDisplayColumns(string ColumnName) { this.gridView.BeginUpdate(); string[] ColumnNames = ColumnName.Split(','); int i = 0; foreach (GridColumn item in gridView.Columns) { GridColumnModel model = item.Tag as GridColumnModel; item.VisibleIndex = i; if (model != null && model.isDynamic) { item.Visible = ColumnNames.Contains(model.FieldName) ? true : false; } i++; //if (item.Visible) //{ // item.VisibleIndex = i; // i++; //} } this.gridView.EndUpdate(); } /// /// 动态修改列名 /// public void SetColumnName(DataRow dataRow) { this.gridView.BeginUpdate(); foreach (GridColumn item in gridView.Columns) { GridColumnModel model = item.Tag as GridColumnModel; if (dataRow.Table.Columns.Contains(model.FieldName)) { item.Caption = dataRow[model.FieldName] + ""; item.Visible = !string.IsNullOrWhiteSpace(item.Caption); } } this.gridView.EndUpdate(); //this.gridView.RefreshData(); } /// /// 表格有复选框的情况下,勾选的行在筛选后默认显示 /// /// /// private void GridView_CustomRowFilter(object sender, RowFilterEventArgs e) { if (SystemInfo.Instance.DisplayCheckboxSelection && !string.IsNullOrWhiteSpace(this.MultiplePrimary) && gridView.OptionsSelection.MultiSelect == true && gridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect && gridView.OptionsSelection.EnableAppearanceFocusedCell == false) { DataRow dataRow = this.gridView.GetDataRow(e.ListSourceRow); if (dataRow != null && dataRow.Table.Columns.Contains(this.MultiplePrimary) && SelectedDataSource.Contains(dataRow[this.MultiplePrimary] + "")) { e.Handled = true; e.Visible = true; } } } /// /// 自定义表格数据 /// /// /// private void OnGridViewCustomUnboundColumnData(object sender, CustomColumnDataEventArgs e) { if (e.Column.Tag != null && e.Column.Tag is GridColumnModel columnModel) { if (columnModel.FieldType == ControlType.LabPicUrl && e.IsGetData) { string imageUrl = e.Row != null && e.Row is DataRowView dataRowView && dataRowView.Row.Table.Columns.Contains(columnModel.FieldName) ? dataRowView.Row[columnModel.FieldName] + "" : ""; if (!string.IsNullOrEmpty(imageUrl)) { if (!imageUrl.StartsWith("http")) { string oaUrl = SystemInfo.Instance.OAUrl.EndsWith("/") ? SystemInfo.Instance.OAUrl : $"{SystemInfo.Instance.OAUrl}/"; imageUrl = $"{oaUrl}{imageUrl}"; } if (columnModel.LabPicUrlImages == null) { columnModel.LabPicUrlImages = new Hashtable(); } // 检查缓存中是否已存在该图片 if (!columnModel.LabPicUrlImages.ContainsKey(imageUrl)) { Task.Factory.StartNew(() => { try { using (WebClient webClient = new WebClient()) { byte[] bytes = webClient.DownloadData(imageUrl); using (MemoryStream memoryStream = new MemoryStream(bytes)) { Bitmap bitmap = new Bitmap(memoryStream); int height = columnModel.LabPicUrlHeight <= 18 ? 30 : columnModel.LabPicUrlHeight; int newWidth = (int)((decimal)height / (decimal)bitmap.Height * (decimal)bitmap.Width); Bitmap zoomBitmap = new Bitmap(bitmap, new Size(newWidth, height)); columnModel.LabPicUrlImages[imageUrl] = new KeyValuePair(bitmap, zoomBitmap); BeginInvoke(new Action(() => { gridView.BeginUpdate(); e.Value = zoomBitmap; gridView.EndUpdate(); })); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }); } else { gridView.BeginUpdate(); e.Value = ((KeyValuePair)columnModel.LabPicUrlImages[imageUrl]).Value; gridView.EndUpdate(); } } } } } /// /// 点击单元格显示图片控件 /// /// /// private void OnShowImageDoubleClick(object sender, EventArgs e) { GridView gridView = sender as GridView; Point point = gridView.GridControl.PointToClient(MousePosition); GridHitInfo gridHitInfo = gridView.CalcHitInfo(point); if (gridHitInfo == null || !gridHitInfo.InRowCell || gridHitInfo.Column == null) { return; } GridColumn gridColumn = gridHitInfo.Column; if (gridColumn.Tag == null || !(gridColumn.Tag is GridColumnModel columnModel)) { return; } if (columnModel.FieldType == ControlType.LabPicUrl) { DataRow dataRow = gridView.GetDataRow(gridHitInfo.RowHandle); string imageUrl = dataRow.Table.Columns.Contains(columnModel.FieldName) ? dataRow[columnModel.FieldName] + "" : ""; if (string.IsNullOrEmpty(imageUrl)) { return; } if (!imageUrl.StartsWith("http")) { string oaUrl = SystemInfo.Instance.OAUrl.EndsWith("/") ? SystemInfo.Instance.OAUrl : $"{SystemInfo.Instance.OAUrl}/"; imageUrl = $"{oaUrl}{imageUrl}"; } if (columnModel.LabPicUrlImages.ContainsKey(imageUrl)) { using (FrmPicture frmPicture = new FrmPicture()) { frmPicture.PicUrlColumns = gridView.Columns.Where(n => n.Tag != null && n.Tag is GridColumnModel model && model.FieldType == ControlType.LabPicUrl).ToList(); frmPicture.FocusedRow = gridView.GetFocusedDataRow(); frmPicture.FocusedColumn = gridView.FocusedColumn; Image image = ((KeyValuePair)columnModel.LabPicUrlImages[imageUrl]).Key; frmPicture.Text = "预览"; frmPicture.Picture = image; frmPicture.WindowState = FormWindowState.Maximized; frmPicture.StartPosition = FormStartPosition.CenterScreen; frmPicture.ShowDialog(); } } } } /// /// 清空url图片列缓存 /// private void ClearImage() { GridColumnCollection gridColumns = this.GridView.Columns; foreach (GridColumn col in gridColumns) { GridColumnModel model = col.Tag as GridColumnModel; if (model != null && model.FieldType == ControlType.LabPicUrl) { model.LabPicUrlImages = new Hashtable(); } } } #region 当前表格的拖拽方法 /// /// 说明:自身表格的拖拽类 /// 创建人:王一帆 /// 创建日期:2017-09-05 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public class DragForm : DevExpress.Utils.Win.TopFormBase { Bitmap m_buff; Graphics m_buffG; /// /// 拖拽方法 /// /// public DragForm(Rectangle _bound) { this.Text = ""; this.FormBorderStyle = FormBorderStyle.None; this.ControlBox = false; this.Size = _bound.Size; this.ShowInTaskbar = false; this.StartPosition = FormStartPosition.Manual; this.Opacity = 0.0d; //TopFormBase已经有默认值了; this.BackColor = ColorTranslator.FromHtml("#0078D7"); this.Location = _bound.Location; } /// /// /// /// protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // e.Graphics.DrawImage(m_buff, 0, 0); } } /// /// 说明:判断是否需要绑定拖拽 /// 创建人:王一帆 /// 创建日期:2020-05-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void InitializedragState(string SortColumnName) { try { if (string.IsNullOrWhiteSpace(SortColumnName)) return; //判断是否可拖拽 if (this.gridView.Columns.Where(n => n.FieldName.Equals(SortColumnName)).Count() > 0) { this.DetailOrderField = SortColumnName; this.GridView.MouseDown += new MouseEventHandler(OnGridMouseDown); this.GridView.MouseMove += new MouseEventHandler(OnGridMouseMove); this.GridView.MouseUp += new MouseEventHandler(OnGridMouseUp); } } catch (Exception ex) { } } /// /// 说明:拖拽鼠标按下事件 /// 创建人:王一帆 /// 创建日期:2020-05-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void OnGridMouseDown(object sender, MouseEventArgs e) { try { if (e.Button == MouseButtons.Left) { isSortDrag = false; var _hit = this.GridView.CalcHitInfo(e.Location); if (_hit.RowHandle >= 0) { dragRowsIndex = this.GridView.GetSelectedRows(); m_dragHandle = _hit.RowHandle; m_mouseDownLocation = e.Location; } else { m_dragHandle = -1; } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 拖拽鼠标移动事件 /// /// private void OnGridMouseMove(object sender, MouseEventArgs e) { try { if (e.Button == MouseButtons.Left && m_dragHandle >= 0) { isSortDrag = true; if (m_dragRowShadow == null) { double _x2 = Math.Pow((e.Location.X - m_mouseDownLocation.X), 2); double _y2 = Math.Pow((e.Location.Y - m_mouseDownLocation.Y), 2); double _d2 = Math.Sqrt(_x2 + _y2); if (_d2 > 3) { //执行拖拽; this.BeginDrag(m_dragHandle); //var _info = (DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)gv22.GetViewInfo(); //_info.GetGridRowInfo(0).CalcRectangle } } else { m_dragRowShadow.Location = new Point(m_dragRowShadow.Location.X, this.PointToScreen(e.Location).Y); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 拖拽鼠标放开事件 /// /// private void OnGridMouseUp(object sender, MouseEventArgs e) { try { int startIndex = this.m_dragHandle; int endIndex = -1; int[] selectSourceIndex = null; if (m_dragRowShadow != null) { var _hit = this.GridView.CalcHitInfo(e.Location); this.EndDrag(_hit.RowHandle, out selectSourceIndex); endIndex = _hit.RowHandle; } if (!string.IsNullOrEmpty(DetailOrderField) && isSortDrag) { int sourceStartIndex = startIndex > 0 ? this.GridView.GetDataSourceRowIndex(startIndex) : startIndex; int sourceEndIndex = endIndex > 0 ? this.GridView.GetDataSourceRowIndex(endIndex) : endIndex; this.gridControl.DataSourceTable().OrderBy(this.DetailOrderField, sourceStartIndex, sourceEndIndex); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 绑定拖拽 /// /// private void BeginDrag(int _handle) { var _info = (DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)this.GridView.GetViewInfo(); //_info.GetGridRowInfo(0).CalcRectangle Rectangle _bound = _info.GetGridRowInfo(_handle).Bounds; _bound.Location = this.PointToScreen(_bound.Location); m_dragRowShadow = new DragForm(_bound); m_dragRowShadow.Show(); } /// /// 停止拖拽 /// /// private void EndDrag(int _handle, out int[] selectSourceIndex) { selectSourceIndex = null; if (m_dragRowShadow != null) { m_dragRowShadow.Close(); m_dragRowShadow.Dispose(); m_dragRowShadow = null; if (dragRowsIndex.Length > 1) { DataTable sourceTable = this.gridControl.DataSourceTable(); int _rowIndex = this.GridView.GetDataSourceRowIndex(_handle); int[] selectRowsIndex = dragRowsIndex; selectSourceIndex = new int[selectRowsIndex.Length]; List selectRows = new List(); List newRowSelectRows = new List(); for (int i = 0; i < selectRowsIndex.Length; i++) { int sourceIndex = this.GridView.GetDataSourceRowIndex(selectRowsIndex[i]); selectSourceIndex[i] = sourceIndex; selectRows.Add(sourceTable.Rows[sourceIndex]); } this.gridControl.BeginUpdate(); foreach (DataRow row in selectRows) { DataRow newRow = sourceTable.NewRow(); newRow.ItemArray = row.ItemArray; newRowSelectRows.Add(newRow); } //移除目标行; int IntermediateRow = 0; for (int i = selectSourceIndex.Length - 1; i >= 0; i--) { ((DataTable)this.gridControl.DataSource).Rows.RemoveAt(selectSourceIndex[i]); if (_handle > selectSourceIndex[i]) IntermediateRow++;//拖动行如果在目标行上面,拖动行在删除后,插入行要跟着删一行 } _handle = _handle - IntermediateRow; if (_handle >= 0) { foreach (DataRow row in newRowSelectRows) { sourceTable.Rows.InsertAt(row, _handle); //row.AcceptChanges(); //row.SetModified(); _handle += 1; } } else { foreach (DataRow row in newRowSelectRows) { sourceTable.Rows.Add(row); //row.AcceptChanges(); //row.SetModified(); } } } else { int _rowIndex = this.GridView.GetDataSourceRowIndex(m_dragHandle); DataRow _row = ((DataTable)this.gridControl.DataSource).Rows[_rowIndex]; DataRow insertRow = ((DataTable)this.gridControl.DataSource).NewRow(); insertRow.ItemArray = _row.ItemArray; this.gridControl.BeginUpdate(); ((DataTable)this.gridControl.DataSource).Rows.RemoveAt(_rowIndex); if (_handle > m_dragHandle) _handle = _handle - 1;//拖动行如果在目标行上面,拖动行在删除后,插入行要跟着删一行 if (_handle >= 0) { //插入指定位置; //((DataTable)this.gridControl.DataSource).Rows.InsertAt(insertRow, _handle); //this.GridView.FocusedRowHandle = _handle; DataTable screenTable = this.GridView.GetGridViewFilteredAndSortedDataToDataTable(); DataTable AllTable = this.gridControl.DataSourceTable(); //行数不同,为筛选状态。传入行的行号要设置为数据源中的行号 if (screenTable.Rows.Count != AllTable.Rows.Count) { DataRow dataRow = screenTable.Rows[_handle]; IEqualityComparer comparer = DataRowComparer.Default; DataRow dr = AllTable.Rows.Cast().Where(x => comparer.Equals(x, dataRow)).ToArray()[0]; int index = AllTable.Rows.IndexOf(dr); ((DataTable)this.gridControl.DataSource).Rows.InsertAt(insertRow, index); this.GridView.FocusedRowHandle = _handle; } else { //插入指定位置; ((DataTable)this.gridControl.DataSource).Rows.InsertAt(insertRow, _handle); this.GridView.FocusedRowHandle = _handle; } } else { //添加; ((DataTable)this.gridControl.DataSource).Rows.Add(insertRow); this.GridView.FocusedRowHandle = this.GridView.RowCount - 1; } //insertRow.AcceptChanges(); //insertRow.SetModified(); } this.gridControl.EndUpdate(); this.GridView.ClearSelection(); } } private int GetDragEndRowIndex(DataTable sourceTab, int dragEndRowIndex, List selectRows, out bool isContain) { int returnIndex = 0; isContain = false; DataRow dragEndRow = sourceTab.Rows[dragEndRowIndex]; if (selectRows.Contains(dragEndRow)) { isContain = true; dragEndRowIndex = dragEndRowIndex - 1; if (dragEndRowIndex >= 0) { dragEndRow = sourceTab.Rows[dragEndRowIndex]; if (selectRows.Contains(dragEndRow)) { bool iscontain = false; returnIndex = GetDragEndRowIndex(sourceTab, dragEndRowIndex, selectRows, out iscontain); } else { returnIndex = dragEndRowIndex; } } else { returnIndex = -1; } } else { returnIndex = dragEndRowIndex; } return returnIndex; } #endregion /// /// 新建汇总 /// /// public void AddHeadquarters(DataRow dataRow = null) { try { this.gridControl.BeginUpdate(); this.gridView.CellValueChanged -= onCellValueChanged;//生成计划颜色判断事件 foreach (GridColumn gridColumn in this.gridView.Columns) { if (gridColumn.Summary.ActiveCount > 0) { if (gridColumn.Summary.ActiveCount == 1 && dataRow == null) { jhrowitem = null; continue; } GridColumnSummaryItem sumItem = new GridColumnSummaryItem(); if (gridColumn.Summary.ActiveCount == 1) { sumItem = gridColumn.Summary[0]; } else { sumItem = gridColumn.Summary[1]; } //清空所有汇总 gridColumn.Summary.Clear(); //新建汇总 if (dataRow != null) { GridColumnSummaryItem sumItemNew = new GridColumnSummaryItem(); sumItemNew.SummaryType = DevExpress.Data.SummaryItemType.Max; //传进来的行有值就以插入的为准,否则为空 sumItemNew.DisplayFormat = dataRow.Table.Columns.Contains(gridColumn.FieldName) ? dataRow[gridColumn.FieldName] + "" : " "; //按顺序添加汇总 gridColumn.Summary.Add(sumItemNew); } gridColumn.Summary.Add(sumItem); } } jhrowitem = dataRow; if (jhrowitem != null) { this.gridView.CellValueChanged += onCellValueChanged;//生成计划颜色判断事件 } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex, Model.ModuleCode); MessageUtil.Show(Message, ex.Message); } finally { this.gridControl.EndUpdate(); } } /// /// 值改变事件 /// /// /// private void onCellValueChanged(object sender, CellValueChangedEventArgs e) { // 只关心日期列;否则就直接 return if (!DateTime.TryParse(e.Column.FieldName, out _)) return; // 更新标题颜色(只花几毫秒) RefreshHeaderColor(); // ---------- ① 重新计算本行合计 ---------- decimal rowSum = 0m; foreach (GridColumn col in gridView.Columns) { // 只累加日期列 if (!DateTime.TryParse(col.FieldName, out _)) continue; object valObj = gridView.GetRowCellValue(e.RowHandle, col); if (valObj != DBNull.Value && decimal.TryParse(Convert.ToString(valObj), out decimal amt)) { rowSum += amt; } } // 把合计写入 “heji” 列(如不存在则自动忽略) if (gridView.Columns.ColumnByFieldName("workingsum") != null) { gridView.SetRowCellValue(e.RowHandle, "workingsum", rowSum); } // ---------- ② 更新列标题颜色 ---------- RefreshHeaderColor(); // 若你需要参数,按之前定义调整即可 } /// /// 计划颜色变更操作: /// 只要【列合计 Sum】与计划值不相等,即把整列背景改为浅黄 /// /// 根据“列 Sum 与计划值是否相等”刷新列标题字体颜色 public void RefreshHeaderColor() { if (jhrowitem == null) return; // 更新 Summary,确保拿到最新合计 gridView.UpdateSummary(); foreach (GridColumn col in gridView.Columns) { // 只处理列名可解析成日期的列 if (!DateTime.TryParse(col.FieldName, out _)) continue; // 取 “Sum” 合计 var sumItem = col.Summary .OfType() .FirstOrDefault(s => s.SummaryType == SummaryItemType.Sum); bool needRed = false; if (sumItem?.SummaryValue != null && decimal.TryParse(sumItem.SummaryValue.ToString(), out var colSum) && jhrowitem.Table.Columns.Contains(col.FieldName) && decimal.TryParse(jhrowitem[col.FieldName].ToString(), out var planVal)) { needRed = (colSum != planVal); } // 只改表头文字颜色 col.AppearanceHeader.ForeColor = needRed ? Color.Red : Color.Black; col.AppearanceHeader.Options.UseForeColor = true; } // 立刻刷新表头 gridView.Invalidate(); } /// /// 分组后根据汇总排序 /// /// /// private void GridView_EndGrouping(object sender, EventArgs e) { int currentGroupCount = gridView.GroupedColumns.Count; // 仅在分组状态变化(新增分组)时执行 if (SystemInfo.Instance.GroupSpecialMode && +currentGroupCount != _lastGroupCount && currentGroupCount > 0 && Completed) { Completed = false; try { // 清除现有排序规则 gridView.GroupSummarySortInfo.Clear(); // 遍历多目标汇总列,按优先级添加排序 foreach (GridColumn gridColumn in gridView.Columns) { string summaryName = gridColumn.FieldName; // 查找当前目标列的汇总项(假设汇总类型为Sum,可根据实际修改) GridGroupSummaryItem summaryItem = gridView.GroupSummary .FirstOrDefault(item => item.FieldName.Equals(summaryName) && item.SummaryType == SummaryItemType.Sum) as GridGroupSummaryItem; if (summaryItem != null) { //根据汇总降序排序 gridView.GroupSummarySortInfo.Add(summaryItem, ColumnSortOrder.Descending); break; } } } finally { Completed = true; } } _lastGroupCount = currentGroupCount; } /// /// 设置数值的编辑格式 /// /// /// private void GridView_ShowingEditor(object sender, CancelEventArgs e) { GridColumn gridColumn = gridView.FocusedColumn; if (gridColumn != null && gridColumn.Tag != null && gridColumn.Tag is GridColumnModel) { GridColumnModel model = (GridColumnModel)gridColumn.Tag; EnsureSearchAdditionValueInDataSource(gridColumn, model); if (model.FormatEditBox && (model.FieldType == ControlType.LabTextInt || model.FieldType == ControlType.LabCalcText || model.FieldType == ControlType.LabAccount) && gridColumn.RealColumnEdit != null && !gridColumn.RealColumnEdit.EditFormat.FormatString.Equals(model.DataFormat)) { gridColumn.RealColumnEdit.EditFormat.FormatType = DevExpress.Utils.FormatType.Numeric; gridColumn.RealColumnEdit.EditFormat.FormatString = model.DataFormat; //编辑框输入的小数位数根据和格式一致 //if (gridColumn.RealColumnEdit is RepositoryItemTextEdit textEditItem) //{ // // 从格式字符串中提取小数位数 // int decimalPlaces = 0; // if (model.DataFormat.Contains(".")) // { // string decimalPart = model.DataFormat.Split('.')[1]; // decimalPlaces = decimalPart.Length; // } // // 设置输入掩码(例如n4表示4位小数) // if (decimalPlaces > 0) // { // textEditItem.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric; // textEditItem.Mask.EditMask = $"n{decimalPlaces}"; // textEditItem.Mask.UseMaskAsDisplayFormat = true; // } //} } } } /// /// SearchBoxAddition保存文本值时,编辑器显示前把当前单元格值补进下拉数据源。 /// 避免已保存文本不在下拉SQL结果中时,点击单元格进入编辑态显示为空。 /// private void EnsureSearchAdditionValueInDataSource(GridColumn gridColumn, GridColumnModel model) { if (gridColumn == null || model == null || !model.SearchBoxAddition) return; if (!(ControlType.LabAutoCompleteText == model.FieldType || ControlType.LabAutoCompleteTextParam == model.FieldType || ControlType.LabAutoGridText == model.FieldType || ControlType.LabAutoGridTextParam == model.FieldType)) return; RepositoryItemGridLookUpEdit searchEdit = gridColumn.ColumnEdit as RepositoryItemGridLookUpEdit; if (searchEdit == null) return; DataTable dt = searchEdit.DataSource as DataTable; if (dt == null) return; string valueName = searchEdit.ValueMember; string textName = !string.IsNullOrWhiteSpace(searchEdit.DisplayMember) ? searchEdit.DisplayMember : model.TextMember; if (string.IsNullOrWhiteSpace(valueName) || !dt.Columns.Contains(valueName)) return; Type dataType = dt.Columns[valueName].DataType; if (dataType != typeof(string)) return; string value = gridView.GetFocusedRowCellValue(gridColumn) + ""; if (string.IsNullOrWhiteSpace(value)) return; bool exists = dt.Rows.Cast().Any(x => (x[valueName] + "").Equals(value) || (!string.IsNullOrWhiteSpace(textName) && dt.Columns.Contains(textName) && (x[textName] + "").Equals(value))); if (exists) return; DataRow newRow = dt.NewRow(); newRow[valueName] = value; if (!string.IsNullOrWhiteSpace(textName) && dt.Columns.Contains(textName)) { newRow[textName] = value; } dt.Rows.Add(newRow.ItemArray); } /// 计算EditorButton文本所需的精确宽度 /// /// 按钮文本 /// 按钮字体 /// 额外边距(像素) /// 推荐的按钮宽度 public int CalculateTextWidth(string caption, Font font, int padding = 15) { if (string.IsNullOrEmpty(caption)) return 40; // 空文本默认宽度 using (Bitmap tempBitmap = new Bitmap(1, 1)) using (Graphics g = Graphics.FromImage(tempBitmap)) { // 测量文本尺寸 SizeF textSize = g.MeasureString(caption, font); // 计算总宽度 = 文本宽度 + 左右边距 int width = (int)textSize.Width + padding; // 确保宽度不小于最小值 return Math.Max(width, 40); // 最小宽度40像素 } } #region 表格在设置为禁编状态时,点击右键列中的右键按钮事件 /// /// 表格点击事件(处理表格禁编状态时的右键列点击逻辑) /// /// /// private void GridView_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; GridView view = sender as GridView; if (view.OptionsBehavior.Editable) return; GridHitInfo hitInfo = view.CalcHitInfo(e.Location); if (hitInfo.InRowCell && hitInfo.Column.ColumnEdit is RepositoryItemButtonEdit) { RepositoryItemButtonEdit repo = hitInfo.Column.ColumnEdit as RepositoryItemButtonEdit; if (!hitInfo.Column.FieldName.Equals("RightMenuBtnEdit")) return; int rowHandle = hitInfo.RowHandle; this.gridView.SelectRowHandler(rowHandle); int buttonIndex = this.GetClickedButtonIndex(repo, view, rowHandle, hitInfo.Column, e.Location, hitInfo.Column.Width); if (buttonIndex != -1) { // 成功获取按钮索引,触发原有逻辑 EditorButton clickedButton = repo.Buttons[buttonIndex]; if (clickedButton == null) return; this.RightButtonClick(clickedButton); } } } /// /// 执行点击的右键按钮 /// /// private void RightButtonClick(EditorButton editorButton) { GridRightMenuModel menuModel = editorButton.Tag as GridRightMenuModel; ToolStripMenuItem toolStripMenuItem = this.gridViewRightMenu.RightMenuBtnEdits.ContainsKey(menuModel.Id) ? this.gridViewRightMenu.RightMenuBtnEdits[menuModel.Id] : null; if (toolStripMenuItem != null) { bool allowClick = true; int[] mSelectRows = this.gridView.GetSelectedRows(); DataRow mSelectRow = this.gridView.GetDataRow(mSelectRows[0]); if (menuModel != null) { if (menuModel.PrivilegeOper.Length > 1 && !menuModel.PrivilegeOper.Contains(ERPInfo.Instance.UserName + ",")) { allowClick = false; } else { if (!string.IsNullOrWhiteSpace(menuModel.MenuCond)) { try { string cond = string.Empty; if (this.gridViewRightMenu.ControlObj != null) cond = this.gridViewRightMenu.ControlObj.ReplaceParentControlValue(menuModel.MenuCond); cond = ReplaceHelper.ReplaceRowParam(mSelectRow, menuModel.MenuCond); if (this.gridView != null) { GridCell[] cells = this.gridView.GetSelectedCells(); if (cells != null && cells.Length > 0 && cond.Contains("{COLUMN_")) { GridCell cell = cells[0]; DataRow focusedRow = this.gridView.GetFocusedDataRow(); string colValue = focusedRow == null || !focusedRow.Table.Columns.Contains(cell.Column.Name) ? "" : focusedRow[cell.Column.Name] + ""; cond = cond.ReplaceColumnParam(cell.Column.Name, cell.Column.Caption, colValue); } } if (this.gridViewRightMenu.ControlObj != null) cond = this.gridViewRightMenu.ControlObj.ReplaceParentControlValue(cond); allowClick = ReplaceHelper.EvalCond(cond); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(ResourceKeys.SetRightMenuCondFault + "\r\n" + Message); } } } } if (allowClick) toolStripMenuItem.PerformClick(); } } /// /// 计算点击是单元格中的第几个按钮 /// /// /// /// 点击行 /// 点击列 /// 点击位置 /// 单元格宽度 /// /// public int GetClickedButtonIndex(RepositoryItemButtonEdit repo, GridView view, int rowHandle, GridColumn column, Point clickPoint, int ColumnWidth, int buttonSpacing = 2) { // 1. 获取单元格在网格控件中的绝对区域(关键修正) Rectangle cellRect = GetCellAbsoluteRect(view, rowHandle, column); if (cellRect.IsEmpty) return -1; // 2. 验证点击是否在单元格范围内(首要检查) if (!cellRect.Contains(clickPoint)) return -1; // 3. 计算单元格内的相对坐标(修正坐标转换) Point relativePoint = new Point( clickPoint.X - cellRect.Left, clickPoint.Y - cellRect.Top ); // 4. 计算按钮布局(针对固定宽度) //int buttonWidth = repo.Buttons[0].Width; // 固定宽度 int buttonWidth = ColumnWidth / repo.Buttons.Count; int totalButtonsWidth = repo.Buttons.Count * buttonWidth + (repo.Buttons.Count - 1) * buttonSpacing; // 5. 确定按钮排列方式(默认靠右对齐,可根据IsLeft调整) int startX = GetButtonStartX(cellRect.Width, totalButtonsWidth, repo.Buttons[0].IsLeft); // 6. 精确匹配按钮区域(核心修正) for (int i = 0; i < repo.Buttons.Count; i++) { // 计算当前按钮的区域(相对单元格) Rectangle buttonRect = new Rectangle( startX + i * (buttonWidth + buttonSpacing), 0, buttonWidth, cellRect.Height ); // 扩大1-2像素检测范围,解决边界点击问题 Rectangle expandedRect = Rectangle.Inflate(buttonRect, 1, 1); if (expandedRect.Contains(relativePoint)) { return i; // 返回正确索引 } } return -1; } // 获取单元格在网格控件中的绝对坐标区域 private Rectangle GetCellAbsoluteRect(GridView view, int rowHandle, GridColumn column) { try { GridViewInfo viewInfo = view.GetViewInfo() as GridViewInfo; if (viewInfo == null) return Rectangle.Empty; GridDataRowInfo rowInfo = (GridDataRowInfo)viewInfo.RowsInfo.FindRow(rowHandle); if (rowInfo == null) return Rectangle.Empty; GridCellInfo cellInfo = rowInfo.Cells[column]; if (cellInfo == null) return Rectangle.Empty; // 转换为网格控件内的坐标(关键修正) Point cellLocation = view.GridControl.PointToClient( viewInfo.GridControl.PointToScreen(cellInfo.Bounds.Location) ); return new Rectangle( cellLocation.X, cellLocation.Y, cellInfo.Bounds.Width, cellInfo.Bounds.Height ); } catch { return Rectangle.Empty; } } // 计算按钮起始X坐标(支持左右对齐) private int GetButtonStartX(int cellWidth, int totalButtonsWidth, bool isLeftAligned) { if (isLeftAligned) { // 靠左对齐:从单元格左侧开始 return 0; } else { // 靠右对齐:从右侧减去总宽度 return cellWidth - totalButtonsWidth; } } /// /// 滚轮滚动事件 /// /// /// private void GridView_MouseWheel(object sender, MouseEventArgs e) { HandledMouseEventArgs handledArgs = e as HandledMouseEventArgs; if (handledArgs != null) { handledArgs.Handled = false; // 放行事件,允许系统处理Shift+滚轮 } if ((ModifierKeys & Keys.Shift) == Keys.Shift) { // 滚轮方向判断 int scrollStep = e.Delta > 0 ? -20 : 20; // 滚动步长,可调整(建议10-30) // 计算滚动条位置 int newLeftCoord = gridView.LeftCoord + scrollStep; newLeftCoord = Math.Max(0, newLeftCoord);//Math.Min(newLeftCoord, maxLeftCoord) // 移动滚动条位置 gridView.LeftCoord = newLeftCoord; if (handledArgs != null) { handledArgs.Handled = true;// 阻止默认垂直滚动 } } } #endregion } }