using DevExpress.Data;
using DevExpress.Utils;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraTab;
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Nodes;
using Lskj.Business;
using Lskj.Business.Impl;
using Lskj.Control;
using Lskj.Control.BrowserSetting;
using Lskj.Control.Model;
using Lskj.Core;
using Lskj.Data;
using Lskj.Model;
using Lskj.PubBill.Model;
using Lskj.Util;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Lskj.PubBill
{
public partial class BillModule : UserControl
{
///
/// 是否为初始化创建
///
private bool _isInitFinish;
///
/// 是否加载右侧控件数据
///
private bool _isLoadRightControlValue = true;
///
/// 是否手动选择了模版
///
private bool _isSelectedTemplete;
///
/// 是否直接打印
///
private bool _isExcPrint;
///
/// 是否选择关联下发
///
private bool _isCheck;
///
/// 主打印Sql
///
private string _mainPrintSql;
private string guidField = "xxxxx_guid";
///
/// 主键字段
///
private string mRecordPrimaryField;
///
/// 单据水印
///
private WaterMark _waterMark;
///
/// 导入单据明细数据、导入单据明细并更新
///
private BarButtonItem _itemImport, _itemImportUpdate;
///
/// 打印主sql中关联打印次数返回条件
///
private string _printModeCond;
///
/// 打印完成后添加数据用到的参数: 表名,列前缀,主键字段,主键值,模块编号,主打印Sql
///
private List _printSaveParams;
///
/// 单据明细列
///
private DataTable _detailColumns;
private bool IsCopying = false;
private bool _moduleResourcesReleased;
protected DataRow BillRowItem;
///
/// 主表控件
///
public MyControl ControlObj;
///
/// 入口参数
///
protected DynamicBillModel SysModel;
///
/// 是否为Brp模版
///
/// true if this instance is BRP templete; otherwise, false.
protected bool IsBrpTemplete { get { return SysModel is DynamicBillBrpModel; } }
///
///
///
public BillModel BillModel;
///
/// 快速扫码控件
///
/// The main bottom input object.
public PanelControl MainBottomInputObj { get { return this.pl_input; } }
///
/// Brp模版控件
///
/// The main bottom templete object.
public PanelControl MainBottomTempleteObj { get { return this.pl_templete; } }
///
/// 明细表格数据
///
/// The main bottom templete object.
public GridControlEx gcMainDetilObj { get { return this.gcMain; } }
///
/// Brp模版控件
///
/// 扫码框
public TextEdit txtinputobj { get { return this.txt_input; } }
///
/// 数量名称
///
public string NumberMc;
///
/// 红字单据的分配管理模块
///
public string rdRedUnionCode;
///
/// 蓝字单据的分配管理模块
///
public string rdBlueUnionCode;
///
/// 蓝字单据的分配管理模块
///
Dictionary pageNumKey = new Dictionary();
///
/// 是否拖拽换行展示
///
public bool isDragWrap = true;
///
/// 触发主表改变刷新来源限制
///
private bool IsBillMaster = true;
///
/// 是否执行了加载储存过程
///
//public bool ProcessExists = false;
///
/// 保存或修改时报错信息
///
public string SaveErrorMessage = string.Empty;
///
/// 单据明细删除的行
///
// private Dictionary ToWithdrawRows = new Dictionary();
private List> ToWithdrawRows = new List>();
///
///改变颜色行
///
private List ChangeColorRow = new List();
///
///
///
public string AssociatedField = string.Empty;
///
/// 注册设置公共事件私有类
///
private static PubEvenImpl _eventHandler;
///
/// 注册设置公共事件类
///
private static PubEvenImpl eventHandler;
///
/// 当前人员是否有导出权限
///
public bool ExportPermission;
///
/// 是否显示单据管理条数
///
public bool IsBillShowCount = false;
///
/// 来源明细的页面名字后缀(设置成全局变量,更好的处理语言翻译的情况)
///
public string DetailedSuffix = Business.Impl.LanguageTranslation.Translatable ? "-" + Business.Impl.LanguageTranslation.GetTranslatedText("明细") : "-明细";
///
/// 数量后缀
///
public string QuantitySuffix = Business.Impl.LanguageTranslation.Translatable ? Business.Impl.LanguageTranslation.GetTranslatedText("条") + ")" : "条)";
///
/// 新增
///
public string addText = Business.Impl.LanguageTranslation.Translatable ? "(" + Business.Impl.LanguageTranslation.GetTranslatedText("新增") + ")" : "(新增)";
///
/// 修改
///
public string updateText = Business.Impl.LanguageTranslation.Translatable ? "(" + Business.Impl.LanguageTranslation.GetTranslatedText("修改") + ")" : "(修改)";
///
/// 单据来源控件集合
///
public Dictionary BillModuleModelDic = new Dictionary();
///
/// 主表动态生成的日期列
///
public List DateColumnList = new List();
///
/// 主表动态生成的合计列
///
public GridColumn SumGridColumn = new GridColumn();
///
/// 附加右键菜单集合
///
public List itemCommonList = new List();
///
/// 是否已经添加了多行汇总
///
public bool MultiLineSummary;
///
/// 扫码框
///
public TextEdit ScanCodeTextEdit = null;
///
/// 初始化时选中的页签
///
public XtraTabPage InitialSelectionTab = null;
///
/// 当前操作的ImageEdit
///
private LabelImageEdit _imageEdit;
///
/// 当前来源明细中变色行
///
private HashSet ColorHandles = new HashSet();
///
/// 保存验证条件表
///
public DataTable SaveCondTab = new DataTable();
///
/// 明细对应字段(参数9中的明细sql对应的主表明细字段) Dictionary
///
public Dictionary DetailMappingField = new Dictionary();
public BillModule()
{
InitializeComponent();
}
///
/// Releases runtime objects created by the bill module. Cleanup is
/// idempotent and best-effort so it cannot change the close result.
///
public void ReleaseModuleResources()
{
if (_moduleResourcesReleased)
return;
_moduleResourcesReleased = true;
TryRelease(() => PrintUtil.OnAfterPrint -= new EventHandler(OnReportPrintAfter), "打印回调");
TryRelease(ReleaseModuleEvents, "模块事件");
TryRelease(ReleaseModuleDataSources, "模块数据源");
TryRelease(ReleaseRuntimeCollections, "运行时集合");
BillRowItem = null;
ControlObj = null;
BillModel = null;
SysModel = null;
SumGridColumn = null;
ScanCodeTextEdit = null;
InitialSelectionTab = null;
_imageEdit = null;
_waterMark = null;
_itemImport = null;
_itemImportUpdate = null;
}
private void ReleaseModuleEvents()
{
// BillModule 会给来源、明细以及明细的明细动态创建的 GridView 注册
// 实例方法。DevExpress 的事件委托保存在 View 的 EventHandlerList 中,
// 即使 View 已经脱离 GridControl,也会继续强引用 BillModule。关闭时
// 只解除本模块注册的处理器,不 Dispose 共享的 GridControl/GridView。
List moduleControls = new List();
try
{
moduleControls.AddRange(EnumerateChildControls(this).ToList());
}
catch (Exception exception)
{
Debug.WriteLine("收集单据模块控件失败:" + exception);
}
// Form.Close/Dispose 期间某些页签可能已经从 Controls 移除,
// BillModuleModelDic 和页签 Tag 仍然保留这些动态控件的引用,
// 因此一并加入快照,确保解绑覆盖所有来源表格。
try
{
foreach (BillModuleModel moduleModel in BillModuleModelDic.Values.ToList())
{
AddModuleControlSnapshot(moduleControls, moduleModel == null ? null : moduleModel.SourceControl as System.Windows.Forms.Control);
AddModuleControlSnapshot(moduleControls, moduleModel == null ? null : moduleModel.SourceDetailControl as System.Windows.Forms.Control);
AddModuleControlSnapshot(moduleControls, moduleModel == null ? null : moduleModel.SourceDetailDetailControl as System.Windows.Forms.Control);
}
}
catch (Exception exception)
{
Debug.WriteLine("收集单据来源控件失败:" + exception);
}
foreach (System.Windows.Forms.Control control in moduleControls.ToList())
{
try
{
GridControlEx grid = control as GridControlEx;
if (grid != null)
ReleaseBillModuleGridEvents(grid);
TreeViewEx treeView = control as TreeViewEx;
if (treeView != null)
treeView.TreeNodeSelectAfter -= OnTreeNodeSelectAfter;
SplitContainerControl splitContainer = control as SplitContainerControl;
if (splitContainer != null)
{
splitContainer.SplitterMoved -= OnTopSplitterMoved;
splitContainer.SplitterMoved -= OnMainSplitterMoved;
splitContainer.SplitterMoved -= OnDetailsSplitterMoved;
splitContainer.SplitterMoved -= OnSpecialMainSplitterMoved;
splitContainer.SplitterMoved -= OnSpecialLeftSplitterMoved;
}
SimpleButton commonButton = control as SimpleButton;
if (commonButton != null)
commonButton.Click -= itemCommon_Click;
LabelImageEdit imageEdit = control as LabelImageEdit;
if (imageEdit != null)
{
imageEdit.UploadEvent -= OnImageUploadEvent;
imageEdit.DeleteEvent -= OnImageDeleteEvent;
}
}
catch (Exception exception)
{
Debug.WriteLine("解除单据模块控件事件失败:" + exception);
}
}
ReleaseBillModuleSearchEvents(moduleControls);
ReleaseBillModuleBarEvents();
if (_imageEdit != null)
{
_imageEdit.UploadEvent -= OnImageUploadEvent;
_imageEdit.DeleteEvent -= OnImageDeleteEvent;
}
if (ScanCodeTextEdit != null)
ScanCodeTextEdit.KeyDown -= Text_KeyDown;
if (gcMain != null)
{
gcMain.OnAfterLinkCilk -= OnAfterLinkCilkCall;
gcMain.OnAllAfterParseCallBack -= OnAllAfterParseCallBack;
}
if (tb_buttom != null)
{
tb_buttom.OnDetailSaveGridCallBack -= Tab_OnDetailSaveGridCallBack;
tb_buttom.BillDetailRightGridCallBack -= Tab_OnDetailSaveGridCallBack;
tb_buttom.OnRightCallback -= OnButtomRightCallBack;
if (tb_buttom.TabControlObj != null)
tb_buttom.TabControlObj.SelectedPageChanged -= TabControlObj_SelectedPageChanged;
}
}
private static void AddModuleControlSnapshot(
List target,
System.Windows.Forms.Control control)
{
if (target == null || control == null)
return;
foreach (System.Windows.Forms.Control item in EnumerateChildControls(control))
{
if (!target.Contains(item))
target.Add(item);
}
}
private void ReleaseBillModuleGridEvents(GridControlEx grid)
{
if (grid == null)
return;
grid.OnAfterLinkCilk -= OnAfterLinkCilkCall;
grid.OnAllAfterParseCallBack -= OnAllAfterParseCallBack;
if (grid.GridControl != null)
{
grid.GridControl.DataSourceChanged -= OnGcMainDataSourceChanged;
grid.GridControl.ProcessGridKey -= OnGridControlKye;
}
GridView view = grid.GridView;
if (view != null)
{
view.DoubleClick -= OnGridViewDoubleClick;
view.DoubleClick -= OnSourceGridViewDoubleClick;
view.DoubleClick -= OnGridDetailDoubleClick;
view.DoubleClick -= OnGridDetailDetailDoubleClick;
view.RowCellClick -= OnGridViewRowCellClick;
view.RowCellClick -= OngcMainRowCellClick;
view.RowCellClick -= OnGridViewIsCheckClick;
view.FocusedRowObjectChanged -= GridView_FocusedRowObjectChanged;
view.FocusedRowChanged -= GridView_FocusedRowChanged;
view.KeyDown -= OnToWithdraw;
view.ShowingEditor -= OnGridViewShowingEditor;
view.MouseDown -= GridView_MouseDown;
view.InitNewRow -= OnGridViewInitNewRow;
view.CellValueChanged -= OnGridViewCellValueChanged;
view.CustomDrawCell -= GridView_CustomDrawCell;
}
TreeGridControlEx treeGrid = grid as TreeGridControlEx;
if (treeGrid != null && treeGrid.TreeListObj != null)
{
treeGrid.TreeListObj.FocusedNodeChanged -= OnTreeListObjFocusedNodeChanged;
treeGrid.TreeListObj.MouseClick -= TreeListObj_MouseClick;
treeGrid.TreeListObj.ShowingEditor -= OnGridViewShowingEditor;
}
if (grid.gridViewRightMenu != null)
{
grid.gridViewRightMenu.OnBeforeHandleParamsCallback -= OnBeforeHandleParamsCallback;
// SetGridRightMenus stores the module callback in the menu
// object (not on GridView), so clear only this menu's callback
// before the wrapper becomes unreachable.
grid.gridViewRightMenu.SetRightCallback(null);
}
}
private void ReleaseBillModuleSearchEvents(
IEnumerable moduleControls)
{
List searchControls = new List();
List ownedSearchControls = new List();
if (ControlObj != null)
{
searchControls.Add(ControlObj);
ownedSearchControls.Add(ControlObj);
}
try
{
IEnumerable controls = moduleControls == null
? EnumerateChildControls(this)
: moduleControls;
foreach (System.Windows.Forms.Control control in controls)
{
XtraTabPage page = control as XtraTabPage;
BillSourceUnionModel unionModel = page == null ? null : page.Tag as BillSourceUnionModel;
if (unionModel == null)
continue;
AddModuleSearchControl(searchControls, unionModel.SearchObj);
AddModuleSearchControl(ownedSearchControls, unionModel.SearchObj);
ModuleGridEx detailModule = unionModel.GridDetailModuleGridEx;
if (detailModule != null)
{
AddModuleSearchControl(searchControls, detailModule.SearchObj);
AddModuleSearchControl(ownedSearchControls, detailModule.SearchObj);
// ParentControlEx/ParentControlObj/_leftGridSearchObj can
// belong to another open module. They only need this
// module's callbacks removed; never Dispose them here.
AddModuleSearchControl(searchControls, detailModule.ParentControlEx);
AddModuleSearchControl(searchControls, detailModule.ParentControlObj);
AddModuleSearchControl(searchControls, detailModule._leftGridSearchObj);
}
}
}
catch (Exception exception)
{
Debug.WriteLine("收集单据查询控件失败:" + exception);
}
foreach (MyControl searchControl in searchControls.ToList())
{
if (searchControl == null)
continue;
try
{
searchControl.OnSearchBeforeCallBack -= OnSearchBefore;
searchControl.OnSearchAfterCallBack -= OnSearchAfterd;
searchControl.OnDataSourceBindCallBack -= OnFirstPageDataSourceBindCallBack;
searchControl.OnDataSourceBindCallBack -= SearchControl_OnDataSourceBindCallBack;
searchControl.OnDataSourceBindCallBack -= OnPageDataSourceBindCallBack;
searchControl.OpenDocumentSource -= OpenTheSourcePopup;
searchControl.OnSourceRefrshCallBack -= OnRefreshBillSource;
searchControl.OnDataFileRefrshCallBack -= OnDataFileRefrshFile;
searchControl.OnDataSourceBindCallBack -= OnInitializeHeaderCallBack;
}
catch (Exception exception)
{
Debug.WriteLine("解除单据查询事件失败:" + exception);
}
}
// MyControl 不是 WinForms Control,不会随页签自动进入 Dispose
// 链。它内部可能持有 WinForms Timer、弹出菜单和查询控件引用;
// 只释放本模块创建的对象,外部传入的父级查询控件保持不动。
foreach (MyControl searchControl in ownedSearchControls.ToList())
{
try
{
searchControl.Dispose();
}
catch (Exception exception)
{
Debug.WriteLine("释放单据查询控件失败:" + exception);
}
}
}
private static void AddModuleSearchControl(List target, MyControl control)
{
if (target != null && control != null && !target.Contains(control))
target.Add(control);
}
private void ReleaseBillModuleBarEvents()
{
if (itemCommonList != null)
{
foreach (SimpleButton button in itemCommonList.ToList())
if (button != null)
button.Click -= itemCommon_Click;
}
if (barManager1 == null || barManager1.Items == null)
return;
foreach (BarItem item in barManager1.Items)
{
BarButtonItem button = item as BarButtonItem;
if (button == null)
continue;
button.ItemClick -= OnCopyMasterItemClick;
button.ItemClick -= OnCopyAllItemClick;
button.ItemClick -= OnExportItemClick;
button.ItemClick -= OnBtnFPNewClick;
button.ItemClick -= OnImportItemClick;
button.ItemClick -= OnImportUpdateItemClick;
button.ItemClick -= OnPrintItemClick;
button.ItemClick -= OnCommonItemClick;
}
}
private void ReleaseModuleDataSources()
{
foreach (System.Windows.Forms.Control control in EnumerateChildControls(this).ToList())
{
GridControlEx grid = control as GridControlEx;
if (grid != null)
{
TreeGridControlEx treeGrid = grid as TreeGridControlEx;
if (treeGrid != null && treeGrid.TreeListObj != null)
treeGrid.TreeListObj.DataSource = null;
if (grid.GridControl != null)
grid.GridControl.DataSource = null;
}
XtraTabPage tabPage = control as XtraTabPage;
if (tabPage != null)
tabPage.Tag = null;
}
if (_imageEdit != null && _imageEdit.TextEdit != null)
_imageEdit.TextEdit.Image = null;
if (cb_input != null)
cb_input.Properties.Items.Clear();
if (cb_templete != null)
cb_templete.Properties.Items.Clear();
}
private static IEnumerable EnumerateChildControls(
System.Windows.Forms.Control root)
{
if (root == null)
yield break;
yield return root;
foreach (System.Windows.Forms.Control child in root.Controls)
foreach (System.Windows.Forms.Control nested in EnumerateChildControls(child))
yield return nested;
}
private void ReleaseRuntimeCollections()
{
foreach (BillModuleModel model in BillModuleModelDic.Values.ToList())
{
if (model == null)
continue;
model.SourceControl = null;
model.SourceDetailControl = null;
model.SourceDetailDetailControl = null;
model.SourceModel = null;
}
BillModuleModelDic.Clear();
pageNumKey.Clear();
foreach (Dictionary rows in ToWithdrawRows)
if (rows != null)
rows.Clear();
ToWithdrawRows.Clear();
ChangeColorRow.Clear();
DateColumnList.Clear();
itemCommonList.Clear();
ColorHandles.Clear();
if (DetailMappingField != null)
DetailMappingField.Clear();
if (_printSaveParams != null)
_printSaveParams.Clear();
if (_detailColumns != null)
{
_detailColumns.Dispose();
_detailColumns = null;
}
if (SaveCondTab != null)
{
SaveCondTab.Dispose();
SaveCondTab = null;
}
}
private static void TryRelease(Action release, string operation)
{
try
{
release();
}
catch (Exception exception)
{
Debug.WriteLine("释放单据模块资源失败[" + operation + "]:" + exception);
}
}
#region 初始化操作
///
/// 说明:窗口加载
/// 创建人:龚宇超
/// 创建日期:2017-11-23
/// 修改人:
/// 修改日期:
/// 修改备注:
/// 版本:1.0
///
/// The instance containing the event data.
public void OnLoad(DynamicBillModel Model)
{
try
{
this.SysModel = Model;// 单据动态链接库参数,入口参数
this._isInitFinish = false;// 是否为初始化创建
this.ssc_main.Visible = false; //获取或设置一个值,该值指示是否显示该控件及其所有子控件。
//this.ProcessExists = (Lskj.Data.Caches.CacheSYSConfig.Instance().JudgeProcessExists() && SystemInfo.Instance.isExecload);
if (true)//5.0控件样式
{
this.pl_main_bottom.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
this.pl_main_bottom.BackColor = Color.FromArgb(240, 240, 240);
this.pl_main_bottom.LookAndFeel.UseDefaultLookAndFeel = false;
this.pl_main_bottom.LookAndFeel.UseWindowsXPTheme = true;
}
Dictionary