#region using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Windows.Forms; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Language; using DevExpress.Utils; using DevExpress.XtraGrid.Views.Grid; #endregion ///*************************************************************************/ ///* ///* 文件名 :frmBaseDataForm.cs ///* 程序说明 : 支持数据操作功能的窗体基类 ///* 这个类很重要!定义数据操作的几个常用方法:增/删/改/查/保存/取消 ///* 实现IDataOperatable及IPrintableForm接口 ///* 原创作者 :www.csframework.com ///* ///* Copyright 2006-2021 C/S框架网 www.csframework.com ///* Creation: 2021-12-27 ///**************************************************************************/ namespace CSFrameworkV5.Library { /// /// 支持数据操作功能的窗体基类. /// public partial class frmBaseEditorQuery : frmBaseChild, IDataOperatableBase, IPrintableForm, IEditorQueryForm { public frmBaseEditorQuery() { InitializeComponent(); } /// /// 获取Summary表的数据源. /// protected DataTable SummaryTable { get { if (_SummaryView == null) return null; return (DataTable)_SummaryView.DataSource; } } /// /// 数据操作按钮组 /// /// public virtual IButtonInfo[] GetDataOperatableButtons() { var list = new List(); if (ButtonAuthorized(ButtonAuthority.ADD)) list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnAdd, LanLib.Get("新增"), ToolBarGroup.数据操作, Globals.LoadBitmap("32_Add.png"), new Size(57, 28), false, true, DoAdd)); if (ButtonAuthorized(ButtonAuthority.DELETE)) list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnDelete, LanLib.Get("删除"), ToolBarGroup.数据操作, Globals.LoadBitmap("32_Del.png"), new Size(57, 28), false, true, DoDelete)); if (ButtonAuthorized(ButtonAuthority.EDIT)) list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnEdit, LanLib.Get("修改"), ToolBarGroup.数据操作, Globals.LoadBitmap("32_Edit.png"), new Size(57, 28), false, true, DoEdit)); if (ButtonAuthorized(ButtonAuthority.VIEW)) list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnView, LanLib.Get("查看"), ToolBarGroup.数据操作, Globals.LoadBitmap("32_View.png"), new Size(57, 28), true, true, DoViewContent)); return list.ToArray(); } /// /// 更新当前操作的缓存记录(主表表格中当前记录) /// /// 查询表格中的当前记录 /// 操作状态 public virtual void UpdateSummaryRow(DataRow summary, UpdateType updateType) { try { if (summary == null) return; //容错性:若主表表格未初始化数据源,取当前修改的数据作为数据源 if (_SummaryView.DataSource == null) _SummaryView.DataSource = summary.Table.Clone(); var dt = (DataTable)_SummaryView.DataSource; //如果是新增后保存,在表格内插入一条记录. if (updateType == UpdateType.Add) { var newrow = dt.NewRow(); //表格的数据源增加一条记录 DataConverter.ReplaceDataRowChanges(summary, newrow); //替换数据 dt.Rows.Add(newrow); _SummaryView.RefreshDataSource(); //刷新数据源 //取记录的序号 if (_SummaryView.View is GridView) { //定位当前记录 var i = (_SummaryView.View as GridView).GetRowHandle( dt.Rows.IndexOf(newrow)); _SummaryView.FocusedRowHandle = i; } else //定位最后一条记录 { _SummaryView.FocusedRowHandle = dt.Rows.Count - 1; } dt.AcceptChanges(); } //如果是修改后保存,将最新数据替换当前记录的数据. if (updateType == UpdateType.Modify || updateType == UpdateType.None) { var focusedRowHandle = _SummaryView.FocusedRowHandle; var dr = _SummaryView.GetDataRow(focusedRowHandle); DataConverter.ReplaceDataRowChanges(summary, dr); //替换数据 dr.Table.AcceptChanges(); _SummaryView.RefreshRow( focusedRowHandle); //修改或新增要刷新Grid数据 } } catch (Exception ex) { LogUserOperate.Write(ex); Msg.ShowException(ex); } } /// /// 打印操作按钮组 /// /// public IButtonInfo[] GetPrintableButtons() { var list = new List(); //打印 if (ButtonAuthorized(ButtonAuthority.PRINT)) { var btnPrint = ToolbarRegister.CreateButton("btnPrint", LanLib.Get("打印"), ToolBarGroup.打印功能, Globals.LoadBitmap("32_Print.png"), new Size(57, 28), true, true, DoPrint); list.Add(btnPrint); } return list.ToArray(); } /// /// 检查是否有选择一条记录. /// protected void AssertFocusedRow() { var ret = _SummaryView == null || _SummaryView.IsValidRowHandle(_SummaryView .FocusedRowHandle) == false; if (ret) throw new Exception("您没有选择记录,操作取消!"); } /// /// 检查按钮的权限 /// /// 权限值 /// public override bool ButtonAuthorized(int authorityValue) { //超级用户拥有所有权限 //窗体可用权限=2^n= 1+2+4=7 //比如新增功能点是2,那么检查新增按钮的方法是: 2 & 7 = 2,表示有权限。 // var isAuth = Loginer.CurrentUser.IsAdmin() || (authorityValue & FormAuthorities) == authorityValue; return isAuth; } /// /// 删除表格内指定行号的记录 /// /// protected virtual void DeleteSummaryRow(int rowHandle) { if (rowHandle >= 0) if (_SummaryView.DataSource is DataTable) { var dt = (DataTable)_SummaryView.DataSource; dt.Rows.Remove(_SummaryView.GetDataRow(rowHandle)); } } /// /// 给表格绑定数据 /// /// protected void DoBindingSummaryGrid(DataTable dataSource) { if (_SummaryView != null) { _SummaryView.DataSource = null; _SummaryView.DataSource = dataSource; } } /// /// 关窗体中... /// /// /// private void frmBaseDataForm_FormClosing(object sender, FormClosingEventArgs e) { // } private void frmBaseDataForm_Load(object sender, EventArgs e) { // } /// /// 获取指定的资料行 /// protected DataRow GetDataRow(int rowIndex) { if (rowIndex < 0) return null; if (SummaryTable != null) return SummaryTable.Rows[rowIndex]; return null; } /// /// 获取当前光标所在的资料行. /// protected DataRow GetFocusedRow() { if (_SummaryView.FocusedRowHandle < 0) return null; if (_SummaryView.DataSource is DataTable) return _SummaryView.GetDataRow(_SummaryView.FocusedRowHandle); return null; } /// /// 表格是否有数据 /// /// public virtual bool HasData() { if (_SummaryView != null) return _SummaryView.RowCount > 0; return false; } protected void HidePageHeader(bool isHide = true) { if (isHide) tcBusiness.ShowTabHeader = DefaultBoolean.False; else tcBusiness.ShowTabHeader = DefaultBoolean.True; } /// /// 初始化数据窗体的按钮 /// public override void InitButtons() { base.InitButtons(); var dataButton = GetDataOperatableButtons(); //数据操作按钮 var printButton = GetPrintableButtons(); //打印按钮 Buttons.AddRange(dataButton); Buttons.AddRange(printButton); } /// /// 自定义初始化窗体操作, 窗体的Load事件必须调用此方法 /// protected virtual void InitializeForm() //此方法由基类的Load事件调用 { InitButtons(); //初始化本窗体的按钮 } /// /// 双击表格事件 /// protected virtual void OnGridViewDoubleClick(object sender, EventArgs e) { try { if (!HasData()) return; var btn = _buttons.GetButtonByName("btnEdit"); //双击表格进入修改状态 if (SystemSettings.Current.DoubleClickEditMode) { if (ButtonAuthorized(ButtonAuthority.EDIT)) //当前用户有修改权限 DoEdit(btn); //调用修改方法 } else //进入查看状态 { DoViewContent(btn); } } catch { } } /// /// 替换记录对应字段的数据。 /// /// 数据源 /// 需要替换的记录 protected void ReplaceDataRowChanges(DataRow sourceRow, DataRow destRow) { string fieldName; //循环处理当前记录的所有字段 for (var i = 0; i <= sourceRow.Table.Columns.Count - 1; i++) { fieldName = sourceRow.Table.Columns[i].ColumnName; //如果字段名相同,替换对应字段的数据。 if (destRow.Table.Columns.IndexOf(fieldName) >= 0) destRow[fieldName] = sourceRow[fieldName]; } } public override void SetLanguage() { base.SetLanguage(); Buttons.GetButtonByName("btnPrint").Caption = LanLib.Get("打印"); Buttons.GetButtonByName("btnPreview").Caption = LanLib.Get("预览"); Buttons.GetButtonByName("btnView").Caption = LanLib.Get("查看"); Buttons.GetButtonByName("btnAdd").Caption = LanLib.Get("新增"); Buttons.GetButtonByName("btnDelete").Caption = LanLib.Get("删除"); Buttons.GetButtonByName("btnEdit").Caption = LanLib.Get("修改"); Buttons.GetButtonByName("btnSave").Caption = LanLib.Get("保存"); Buttons.GetButtonByName("btnCancel").Caption = LanLib.Get("取消"); tpSummary.Text = LanLib.Get("数据查询"); } #region 成员变量 /// /// 主表的数据表格对象,必须由派生类指定表格类型。 /// 因Dev GridControl组件不可继承所以子类窗体Load的时候需要赋值. /// protected ISummaryView _SummaryView; public ISummaryView SummaryView => _SummaryView; /// /// 是否允许用户操作数据 /// protected bool _AllowDataOperate = true; #endregion #region DoXXX 成员 /// /// 打印报表 /// /// public virtual void DoPrint(IButtonInfo button) { //Msg.ShowInformation("没有实现打印功能!"); Msg.Warning("没有实现打印功能,请参考【销售订单】界面的打印功能!"); } /// /// 查看选中记录的数据 /// /// public virtual void DoViewContent(IButtonInfo sender) { // } /// /// 新增记录 /// /// public virtual void DoAdd(IButtonInfo sender) { // } /// /// 修改数据 /// /// public virtual void DoEdit(IButtonInfo sender) { // } /// /// 删除记录 /// /// public virtual void DoDelete(IButtonInfo sender) { } #endregion } }