#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
|
{
|
/// <summary>
|
/// 支持数据操作功能的窗体基类.
|
/// </summary>
|
public partial class frmBaseEditorQuery : frmBaseChild,
|
IDataOperatableBase,
|
IPrintableForm,
|
IEditorQueryForm
|
{
|
public frmBaseEditorQuery()
|
{
|
InitializeComponent();
|
}
|
|
/// <summary>
|
/// 获取Summary表的数据源.
|
/// </summary>
|
protected DataTable SummaryTable
|
{
|
get
|
{
|
if (_SummaryView == null) return null;
|
|
return (DataTable)_SummaryView.DataSource;
|
}
|
}
|
|
/// <summary>
|
/// 数据操作按钮组
|
/// </summary>
|
/// <returns></returns>
|
public virtual IButtonInfo[] GetDataOperatableButtons()
|
{
|
var list = new List<IButtonInfo>();
|
|
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();
|
}
|
|
/// <summary>
|
/// 更新当前操作的缓存记录(主表表格中当前记录)
|
/// </summary>
|
/// <param name="summary">查询表格中的当前记录</param>
|
/// <param name="updateType">操作状态</param>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 打印操作按钮组
|
/// </summary>
|
/// <returns></returns>
|
public IButtonInfo[] GetPrintableButtons()
|
{
|
var list = new List<IButtonInfo>();
|
|
//打印
|
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();
|
}
|
|
/// <summary>
|
/// 检查是否有选择一条记录.
|
/// </summary>
|
protected void AssertFocusedRow()
|
{
|
var ret = _SummaryView == null ||
|
_SummaryView.IsValidRowHandle(_SummaryView
|
.FocusedRowHandle) == false;
|
if (ret) throw new Exception("您没有选择记录,操作取消!");
|
}
|
|
/// <summary>
|
/// 检查按钮的权限
|
/// </summary>
|
/// <param name="authorityValue">权限值</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 删除表格内指定行号的记录
|
/// </summary>
|
/// <param name="rowHandle"></param>
|
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));
|
}
|
}
|
|
/// <summary>
|
/// 给表格绑定数据
|
/// </summary>
|
/// <param name="dataSource"></param>
|
protected void DoBindingSummaryGrid(DataTable dataSource)
|
{
|
if (_SummaryView != null)
|
{
|
_SummaryView.DataSource = null;
|
_SummaryView.DataSource = dataSource;
|
}
|
}
|
|
/// <summary>
|
/// 关窗体中...
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void frmBaseDataForm_FormClosing(object sender,
|
FormClosingEventArgs e)
|
{
|
//
|
}
|
|
private void frmBaseDataForm_Load(object sender, EventArgs e)
|
{
|
//
|
}
|
|
/// <summary>
|
/// 获取指定的资料行
|
/// </summary>
|
protected DataRow GetDataRow(int rowIndex)
|
{
|
if (rowIndex < 0) return null;
|
|
if (SummaryTable != null) return SummaryTable.Rows[rowIndex];
|
|
return null;
|
}
|
|
/// <summary>
|
/// 获取当前光标所在的资料行.
|
/// </summary>
|
protected DataRow GetFocusedRow()
|
{
|
if (_SummaryView.FocusedRowHandle < 0) return null;
|
|
if (_SummaryView.DataSource is DataTable)
|
return _SummaryView.GetDataRow(_SummaryView.FocusedRowHandle);
|
|
return null;
|
}
|
|
/// <summary>
|
/// 表格是否有数据
|
/// </summary>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 初始化数据窗体的按钮
|
/// </summary>
|
public override void InitButtons()
|
{
|
base.InitButtons();
|
|
var dataButton = GetDataOperatableButtons(); //数据操作按钮
|
var printButton = GetPrintableButtons(); //打印按钮
|
|
Buttons.AddRange(dataButton);
|
Buttons.AddRange(printButton);
|
}
|
|
/// <summary>
|
/// 自定义初始化窗体操作, 窗体的Load事件必须调用此方法
|
/// </summary>
|
protected virtual void InitializeForm() //此方法由基类的Load事件调用
|
{
|
InitButtons(); //初始化本窗体的按钮
|
}
|
|
/// <summary>
|
/// 双击表格事件
|
/// </summary>
|
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
|
{
|
}
|
}
|
|
/// <summary>
|
/// 替换记录对应字段的数据。
|
/// </summary>
|
/// <param name="sourceRow">数据源</param>
|
/// <param name="destRow">需要替换的记录</param>
|
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 成员变量
|
|
/// <summary>
|
/// 主表的数据表格对象,必须由派生类指定表格类型。
|
/// 因Dev GridControl组件不可继承所以子类窗体Load的时候需要赋值.
|
/// </summary>
|
protected ISummaryView _SummaryView;
|
|
public ISummaryView SummaryView => _SummaryView;
|
|
/// <summary>
|
/// 是否允许用户操作数据
|
/// </summary>
|
protected bool _AllowDataOperate = true;
|
|
#endregion
|
|
#region DoXXX 成员
|
|
/// <summary>
|
/// 打印报表
|
/// </summary>
|
/// <param name="button"></param>
|
public virtual void DoPrint(IButtonInfo button)
|
{
|
//Msg.ShowInformation("没有实现打印功能!");
|
Msg.Warning("没有实现打印功能,请参考【销售订单】界面的打印功能!");
|
}
|
|
/// <summary>
|
/// 查看选中记录的数据
|
/// </summary>
|
/// <param name="sender"></param>
|
public virtual void DoViewContent(IButtonInfo sender)
|
{
|
//
|
}
|
|
/// <summary>
|
/// 新增记录
|
/// </summary>
|
/// <param name="sender"></param>
|
public virtual void DoAdd(IButtonInfo sender)
|
{
|
//
|
}
|
|
/// <summary>
|
/// 修改数据
|
/// </summary>
|
/// <param name="sender"></param>
|
public virtual void DoEdit(IButtonInfo sender)
|
{
|
//
|
}
|
|
/// <summary>
|
/// 删除记录
|
/// </summary>
|
/// <param name="sender"></param>
|
public virtual void DoDelete(IButtonInfo sender)
|
{
|
}
|
|
#endregion
|
}
|
}
|