#region
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using CSFramework.DB;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
using CSFrameworkV5.Language;
using CSFrameworkV5.Library.CommonClass;
using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Grid;
#endregion
namespace CSFrameworkV5.Library
{
///
/// 支持数据操作功能的窗体基类.
///
public partial class frmBaseDataForm : frmBaseChild, IDataOperatable
{
public frmBaseDataForm()
{
InitializeComponent();
}
///
/// 是否修改了数据
///
public bool IsDataChanged => IsAddOrEditMode;
///
/// 明细编辑页是否隐藏
///
protected bool IsHideEditorPage { get; set; }
///
/// 获取Summary表的数据源.
///
protected DataTable SummaryTable
{
get
{
if (_SummaryView == null) return null;
return (DataTable)_SummaryView.DataSource;
}
}
public virtual string UpdateTypeName
{
get
{
if (UpdateType.Add == _UpdateType) return "(新增模式)";
if (UpdateType.Modify == _UpdateType) return "(修改模式)";
return "(查看模式)";
}
}
///
/// 是否允许用户操作数据(未使用)
///
public bool AllowDataOperate
{
get => _AllowDataOperate;
set
{
_AllowDataOperate = value;
SetViewMode();
}
}
///
/// 是否数据发生改变
///
public bool DataChanged => IsAddOrEditMode;
///
/// 数据操作按钮组
///
///
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));
//不需要权限控制
list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnSave,
LanLib.Get("保存"), ToolBarGroup.数据操作,
Globals.LoadBitmap("32_Save.png"), new Size(57, 28), false,
true, DoSave));
list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnCancel,
LanLib.Get("取消"), ToolBarGroup.数据操作,
Globals.LoadBitmap("32_Cancel.png"), new Size(57, 28), false,
true, DoCancel));
return list.ToArray();
}
///
/// 是否新增模式
///
public bool IsAddMode => _UpdateType == UpdateType.Add;
///
/// 是否新增/修改模式
///
public bool IsAddOrEditMode => _UpdateType == UpdateType.Add ||
_UpdateType == UpdateType.Modify;
///
/// 是否修改模式
///
public bool IsEditMode => _UpdateType == UpdateType.Modify;
///
/// 是否查看模式
///
public bool IsViewMode => _UpdateType == UpdateType.None;
///
/// 数据操作状态
///
public UpdateType UpdateType => _UpdateType;
///
/// 打印操作按钮组
///
///
//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();
//}
///
/// 绑定Summary的导航按钮.
///
protected virtual void BindingSummaryNavigator(
ControlNavigator navigator,
INavigatableControl navigatableControl)
{
navigator.NavigatableControl = navigatableControl;
navigator.ButtonClick += OnSummaryNavigatorButtonClick;
}
///
/// 检查按钮的权限
///
/// 权限值
///
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 ButtonStateChanged(UpdateType currentState)
{
//
}
///
/// 删除表格内指定行号的记录
///
///
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));
}
}
///
/// 自动绑定编辑区域的数据源。规则:txt+字段名,或者chk+字段名,其它类型可以扩展
///
/// Panel容器
/// 数据源
public void DoBindingEditorPanel(Control editorPanel,
DataTable dataSource, string ChilddataName)
{
//代码已分离到公共静态类
DataBinder.BindingEditorPanel(editorPanel, dataSource,
ChilddataName);
//BindingEditorPanel(editorPanel, dataSource, ChilddataName);
}
//private void BindingEditorPanel(Control editorPanel, DataTable dataSource, string childdataName)
//{
// string fieldName = "";
// try
// {
// for (int i = 0; i <= editorPanel.Controls.Count - 1; i++)
// {
// if (editorPanel.Controls[i] is BaseEdit)
// {
// BaseEdit edit = editorPanel.Controls[i] as BaseEdit;
// if (edit.Name.Substring(0, 3) == "txt")
// {
// fieldName = edit.Name.Substring(3, edit.Name.Length - 3);
// DataBinder.BindingTextEditBase(edit, dataSource, fieldName);
// }
// }
// if (editorPanel.Controls[i] is GridControl)
// {
// DataTable Childdata = null;
// string CdataColumnsName = childdataName.Substring(childdataName.Length - 3) + "001";//子表主建
// GridControl edit = editorPanel.Controls[i] as GridControl;
// foreach (DataRow dr in dataSource.Rows)
// {
// for (int j = 0; j < dataSource.Columns.Count; j++)
// {
// string str = dataSource.Columns[j].ColumnName.ToString();
// if (str.Substring(str.Length - 3) == "001")
// {
// string con = " Data Source=.;Initial Catalog=CSFrameworkV5_Normal;User ID=sa;Password =563593659liu;Persist Security Info=True;Connect Timeout=15;;Connection TimeOut=15;";
// mSSQL = new DatabaseMSSQL(con);
// string sql = string.Format(@" SELECT * FROM {0} WHERE {1}='{2}' ",
// childdataName, CdataColumnsName, dr[j]);
// Childdata = mSSQL.GetTable(sql, childdataName);
// }
// }
// }
// edit.DataSource = Childdata;
// }
// if (editorPanel.Controls[i] is AdvButtonText)
// {
// AdvButtonText ButtonText = editorPanel.Controls[i] as AdvButtonText;
// ButtonText.lbCaption.Text = ButtonText.CaptionT;//"到货单号";
// ButtonText.ButtonClick += ButtonText_ButtonClick;
// //ButtonText.textEdit.TextChanged -= new EventHandler(textEdit_TextChanged);
// //ButtonText.textEdit.TextChanged += new EventHandler(textEdit_TextChanged);
// }
// if (editorPanel.Controls[i] is CheckEdit)
// {
// CheckEdit edit = editorPanel.Controls[i] as CheckEdit;
// if (edit.Name.Substring(0, 3) == "chk")
// {
// fieldName = edit.Name.Substring(3, edit.Name.Length - 3);
// DataBinder.BindingCheckEdit(edit, dataSource, fieldName);
// }
// }
// }
// }
// catch (Exception ex)
// {
// LogUserOperate.Write(ex);
// Msg.Warning("字段:" + fieldName + "\r\n" + ex.Message);
// }
//}
//private void ButtonText_ButtonClick(object sender, EventArgs e)
//{
// AdvButtonText ButtonText = sender as AdvButtonText;
// DataRow datarow = null;
// if (_UpdateType == UpdateType.None)
// {
// Msg.Warning("请先打开新增或修改状态!");
// return;
// }
// try
// {
// SelectQueryDlg SelectItemDlg = new SelectQueryDlg(ButtonText.DatacatalogID, ButtonText.Filter);
// if (SelectItemDlg.ShowDialog() == DialogResult.OK)
// datarow = (SelectItemDlg.ReturnRow == null) ? null : SelectItemDlg.ReturnRow;
// else
// datarow = null;
// ButtonText.textEdit.EditValue = datarow[ButtonText.TextField];
// return;
// }
// catch (Exception ex)
// {
// return;
// }
// ////若行为空则返回.
// //if (datarow == null)
// //{
// // return ;
// //}
// ////对查询出来结果进行赋值
// ////ControlHelper.SetValueControlProperty(this, ButtonText.Name, "EditValue", datarow[ButtonText.TextField].ToString());
// ////对备注字段进行赋值,若备注字段为空、文本模式为BeRemark,且数据表中存在字段才执行
// //if (ButtonText.TextType == ShowStyle.BeRemark && ButtonText.RemarkField.Length > 0 &&
// // datarow.Table.Columns.Contains(ButtonText.RemarkField))
// //{
// // ButtonText.lbRemark.Text = datarow[ButtonText.RemarkField].ToString();
// // //ControlHelper.SetValueControlProperty(this, ButtonText.Name, "Remark", datarow[ButtonText.RemarkField].ToString());
// //}
// //#region 点选结果返回变更
// //ButtonText.Tag = datarow;
// ////ButtonText.FireButtonDataChanged(sender, e);
// //#endregion
//}
///
/// 自动绑定编辑区域的数据源。规则:txt+字段名,或者chk+字段名,其它类型可以扩展
///
/// Panel容器
/// 数据源
public void DoBindingEditorPanel(Control editorPanel,
DataTable dataSource)
{
//代码已分离到公共静态类
DataBinder.BindingEditorPanel(editorPanel, dataSource);
}
///
/// 给表格绑定数据
///
///
protected void DoBindingSummaryGrid(DataTable dataSource)
{
if (_SummaryView != null)
{
_SummaryView.DataSource = null;
_SummaryView.DataSource = dataSource;
}
}
///
/// 第一个编辑控件设置焦点.
///
protected void FocusEditor()
{
if (_ActiveEditor != null)
{
if (_ActiveEditor.CanFocus)
_ActiveEditor.Focus();
else
SendKeys.Send("{Tab}"); //发送Tab键
}
}
///
/// 关窗体中...
///
///
///
private void frmBaseDataForm_FormClosing(object sender,
FormClosingEventArgs e)
{
if (DataChanged) e.Cancel = !Msg.AskQuestion("您修改了数据没有保存,确定要退出吗?");
}
private void frmBaseDataForm_Load(object sender, EventArgs e)
{
gcNavigator.Visible = false;
}
///
/// 获取指定的资料行
///
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 IButtonInfo[] GetNavigatorButtonButtons()
{
var list = new List();
list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnMoveFirst,
LanLib.Get("最前"), ToolBarGroup.导航功能,
Globals.LoadBitmap("16_First.png"), new Size(57, 28), true,
false, DoMoveFirst));
list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnMoveLast,
LanLib.Get("最后"), ToolBarGroup.导航功能,
Globals.LoadBitmap("16_Last.png"), new Size(57, 28), false,
false, DoMoveLast));
list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnMovePrior,
LanLib.Get("上条"), ToolBarGroup.导航功能1,
Globals.LoadBitmap("16_Prior.png"), new Size(57, 28), false,
false, DoMovePrior));
list.Add(ToolbarRegister.CreateButton(ButtonNameList.btnMoveNext,
LanLib.Get("下条"), ToolBarGroup.导航功能1,
Globals.LoadBitmap("16_Next.png"), new Size(57, 28), false,
false, DoMoveNext));
return list.ToArray();
}
///
/// 表格是否有数据
///
///
public virtual bool HasData()
{
if (_SummaryView != null) return _SummaryView.RowCount > 0;
return false;
}
///
/// 隐藏明细编辑页【数据编辑】页
///
/// 隐藏页面标签按钮
protected void HideEditorPage(bool hideTabHeader = true)
{
if (hideTabHeader)
{
tcBusiness.ShowTabHeader = DefaultBoolean.False; //隐藏页面标签按钮
tcBusiness.SelectedTabPage = tpSummary; //仅显示【数据查询】页
}
else
{
tpDetail.PageVisible = false; //隐藏【数据编辑】页
}
IsHideEditorPage = true;
}
///
/// 初始化数据窗体的按钮
///
public override void InitButtons()
{
base.InitButtons();
var navigatorButton = GetNavigatorButtonButtons(); //4个导航按钮
var dataButton = GetDataOperatableButtons(); //数据操作按钮
//var printButton = GetPrintableButtons(); //打印按钮
Buttons.AddRange(navigatorButton);
Buttons.AddRange(dataButton);
// Buttons.AddRange(printButton);
}
///
/// 自定义初始化窗体操作, 窗体的Load事件必须调用此方法
///
protected virtual void InitializeForm() //此方法由基类的Load事件调用
{
InitButtons(); //初始化本窗体的按钮
SetViewMode(); //预设为数据查看模式
//无操作状态下不可输入数据
SetDetailEditorsAccessable(_DetailGroupControl, false);
}
///
/// 双击表格事件
///
protected virtual void OnGridViewDoubleClick(object sender, EventArgs e)
{
try
{
if (IsHideEditorPage) return;
if (!HasData()) return;
var btn = _buttons.GetButtonByName("btnEdit");
//双击表格进入修改状态
if (SystemSettings.Current.DoubleClickEditMode)
{
if (ButtonAuthorized(ButtonAuthority.EDIT)) //当前用户有修改权限
DoEdit(btn); //调用修改方法
}
else //进入查看状态
{
DoViewContent(btn);
SetDetailEditorsAccessable(_DetailGroupControl, false);
}
}
catch
{
}
}
///
/// 主表格导航按钮的事件
///
///
///
private void OnSummaryNavigatorButtonClick(object sender,
NavigatorButtonClickEventArgs e)
{
try
{
CCursor.ShowWaitCursor();
var btn = (NavigatorButton)e.Button;
var buttons = ((ControlNavigator)sender).Buttons;
if (e.Button == buttons.First) DoMoveFirst(null);
if (e.Button == buttons.Prev) DoMovePrior(null);
if (e.Button == buttons.Next) DoMoveNext(null);
if (e.Button == buttons.Last) DoMoveLast(null);
}
finally
{
e.Handled = true;
CCursor.ShowDefaultCursor();
}
}
///
/// 替换记录对应字段的数据。
///
/// 数据源
/// 需要替换的记录
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];
}
}
///
/// 设置为编辑模式
/// 数据操作两种状态.1:数据修改状态 2:查看数据状态
///
protected virtual void SetEditMode()
{
_buttons.GetButtonByName(ButtonNameList.btnFilter).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnPrint).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnPreview).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnAdd).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnDelete).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnEdit).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnView).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnSave).Enable = true;
_buttons.GetButtonByName(ButtonNameList.btnCancel).Enable = true;
_buttons.GetButtonByName(ButtonNameList.btnMoveFirst).Enable =
false;
_buttons.GetButtonByName(ButtonNameList.btnMovePrior).Enable =
false;
_buttons.GetButtonByName(ButtonNameList.btnMoveNext).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnMoveLast).Enable = false;
}
///
/// 给绑定数据源的输入控件赋值
///
protected void SetEditorBindingValue(Control bindingControl,
object value)
{
SetEditorBindingValue(bindingControl, value, true);
}
///
/// 给绑定数据源的输入控件赋值
///
/// 绑定数据源的组件
/// 值
/// 给控件赋值
protected void SetEditorBindingValue(Control bindingControl,
object value, bool setEditorValue)
{
object temp = null; //空值为null
if (value != DBNull.Value) temp = value;
//有绑定数据源, 给数据源赋值
if (bindingControl.DataBindings.Count > 0)
{
var dataSource = bindingControl.DataBindings[0].DataSource;
var field = bindingControl.DataBindings[0].BindingMemberInfo
.BindingField;
if (dataSource is DataTable)
(dataSource as DataTable).Rows[0][field] = value;
else
DataConverter.SetValueOfObject(dataSource, field, value);
}
//给输入组件的赋值
if (setEditorValue)
{
if (bindingControl is BaseEdit)
(bindingControl as BaseEdit).EditValue = value;
else
DataConverter.SetValueOfObject(bindingControl, "EditValue",
value);
}
}
///
/// 设置输入组件只读及背景色
///
/// 输入组件
/// 可写/只读
/// 是否设置背景色
protected void SetEditorEnable(TextEdit editor, bool enable,
bool setBackgroundColor)
{
if (enable && setBackgroundColor) editor.BackColor = Color.White;
if (!enable && setBackgroundColor)
editor.BackColor = SystemColors.ButtonFace;
editor.Properties.ReadOnly = !enable;
}
///
/// 设置Grid自定义按钮(Add,Insert,Delete)状态
///
protected void SetGridCustomButtonAccessable(GridControl gridControl,
bool value)
{
var custom = gridControl.EmbeddedNavigator.Buttons.CustomButtons;
foreach (NavigatorCustomButton btn in custom) btn.Enabled = value;
}
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("数据查询");
tpDetail.Text = LanLib.Get("数据编辑");
}
///
/// 设置为查看模式
/// 数据操作两种状态.1:数据修改状态 2:查看数据状态
///
protected virtual void SetViewMode()
{
_buttons.GetButtonByName(ButtonNameList.btnFilter).Enable =
ButtonAuthorized(ButtonAuthority.VIEW);
_buttons.GetButtonByName(ButtonNameList.btnPrint).Enable =
ButtonAuthorized(ButtonAuthority.PRINT);
_buttons.GetButtonByName(ButtonNameList.btnPreview).Enable =
ButtonAuthorized(ButtonAuthority.PREVIEW);
_buttons.GetButtonByName(ButtonNameList.btnAdd).Enable =
ButtonAuthorized(ButtonAuthority.ADD);
_buttons.GetButtonByName(ButtonNameList.btnDelete).Enable =
ButtonAuthorized(ButtonAuthority.DELETE);
_buttons.GetButtonByName(ButtonNameList.btnEdit).Enable =
ButtonAuthorized(ButtonAuthority.EDIT);
_buttons.GetButtonByName(ButtonNameList.btnView).Enable =
ButtonAuthorized(ButtonAuthority.VIEW);
_buttons.GetButtonByName(ButtonNameList.btnSave).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnCancel).Enable = false;
_buttons.GetButtonByName(ButtonNameList.btnMoveFirst).Enable = true;
_buttons.GetButtonByName(ButtonNameList.btnMovePrior).Enable = true;
_buttons.GetButtonByName(ButtonNameList.btnMoveNext).Enable = true;
_buttons.GetButtonByName(ButtonNameList.btnMoveLast).Enable = true;
}
///
/// 显示明细页
///
protected virtual void ShowDetailPage(bool disableSummaryPage)
{
try
{
SuspendLayout();
tpDetail.PageEnabled = true;
tcBusiness.SelectedTabPage = tpDetail;
tpSummary.PageEnabled = !disableSummaryPage;
FocusEditor(); //第一个编辑框获得焦点.
ResumeLayout();
}
catch (Exception ex)
{
ResumeLayout();
Msg.ShowException(ex);
}
}
///
/// 显示主表页
///
protected virtual void ShowSummaryPage(bool disableDetailPage)
{
try
{
SuspendLayout();
tpSummary.PageEnabled = true;
tcBusiness.SelectedTabPage = tpSummary;
tpDetail.PageEnabled = !disableDetailPage;
if (_SummaryView != null) _SummaryView.SetFocus();
ResumeLayout();
}
catch (Exception ex)
{
ResumeLayout();
Msg.ShowException(ex);
}
}
///
/// 显示当前操作消息
///
protected void ShowTip(string tip)
{
lblPrompt.Text = tip;
lblPrompt.Update();
}
///
/// 在保存时有此情况发生: 不会更新最后一个编辑框里的数据!
/// 当移除焦点后会更新输入框的数据.
///
protected void UpdateLastControl()
{
try
{
if (ActiveControl == null) return;
var ctl = ActiveControl;
txtFocusForSave.Focus();
ActiveControl = ctl;
}
catch (Exception ex)
{
Msg.ShowException(ex);
}
}
///
/// 更新当前操作的缓存记录
/// 保存数据后更新Summary当前记录.
/// 如果是修改后保存,将最新数据替换当前记录的数据.
/// 如果是新增后保存,在表格内插入一条记录.
///
/// 查询表格中的当前记录
protected virtual void UpdateSummaryRow(DataRow summary)
{
UpdateSummaryRow(summary, _UpdateType);
}
///
/// 更新当前操作的缓存记录(主表表格中当前记录)
///
/// 查询表格中的当前记录
/// 操作状态
protected 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);
}
}
#region IPrintableForm 成员
///
/// 打印报表
///
///
//public virtual void DoPrint(IButtonInfo button)
//{
// DataSet ds = DAL.GetMasterDetailData();
// Msg.ShowInformation("没有实现打印功能!");
//}
#endregion
#region 成员变量
///
/// 当显示修改明细页时,首先获取焦点的编辑框.
///
protected Control _ActiveEditor;
public static DatabaseMSSQL mSSQL = null;
public static DatabaseMSSQL mSSQLSYS = null;
///
/// 关键字段输入框,新增时不可修改
///
protected Control _KeyEditor;
///
/// 主表的数据表格对象,必须由派生类指定表格类型。
/// 因Dev GridControl组件不可继承所以子类窗体Load的时候需要赋值.
///
protected ISummaryView _SummaryView;
///
/// 数据编辑页的主容器
/// 因继承问题,需要在子类窗体Load的时候需要赋值
///
protected Control _DetailGroupControl;
///
/// 数据操作状态
///
protected UpdateType _UpdateType = UpdateType.None;
protected virtual string GetStateName()
{
if (UpdateType.Add == _UpdateType) return "(新增模式)";
if (UpdateType.Modify == _UpdateType) return "(修改模式)";
return "(查看模式)";
}
///
/// 是否允许用户操作数据
///
protected bool _AllowDataOperate = true;
#endregion
#region IDataOperatable接口的方法
///
/// 高级查询模板方法(虚方法)
///
///
public virtual void DoFilter(IButtonInfo sender)
{
Msg.ShowInformation("未实现此功能,参考frmPO,frmSO实例!");
}
///
/// 查看选中记录的数据
///
///
public virtual void DoViewContent(IButtonInfo sender)
{
ButtonStateChanged(_UpdateType);
}
///
/// 新增记录
///
///
public virtual void DoAdd(IButtonInfo sender)
{
_UpdateType = UpdateType.Add;
SetEditMode();
ButtonStateChanged(_UpdateType);
}
///
/// 修改数据
///
///
public virtual void DoEdit(IButtonInfo sender)
{
_UpdateType = UpdateType.Modify;
SetEditMode();
ButtonStateChanged(_UpdateType);
}
///
/// 取消新增或修改
///
///
public virtual void DoCancel(IButtonInfo sender)
{
try
{
frmWaitingEx.ShowMe(this);
_UpdateType = UpdateType.None;
SetViewMode();
ButtonStateChanged(_UpdateType);
if (_UpdateType == UpdateType.Add)
ShowSummaryPage(true);
else if (_SummaryView.RowCount > 0)
DoViewContent(sender);
else
ShowSummaryPage(true);
}
catch (Exception ex)
{
LogUserOperate.Write(ex);
Msg.ShowException(ex);
}
finally
{
frmWaitingEx.HideMe(this);
}
}
///
/// 保存数据
///
///
public virtual void DoSave(IButtonInfo sender)
{
DoSave_ResetState();
}
///
/// 数据窗体保存数据后重置操作状态
///
protected virtual void DoSave_ResetState()
{
//适用性:当派生窗体重载DoSave方法,提交数据成功后调用此方法而不是调用base.DoSave()
_UpdateType = UpdateType.None;
SetViewMode();
ShowDetailPage(false);
ButtonStateChanged(_UpdateType);
}
///
/// 删除记录
///
///
public virtual void DoDelete(IButtonInfo sender)
{
}
#endregion
#region Set Editors Accessable
///
/// 控制[明细编辑页面]上的所有可输入控件是否可编辑.
///
protected virtual void SetDetailEditorsAccessable(Control panel,
bool value)
{
if (panel == null) return;
controlNavigatorSummary.Enabled = !value;
SetControlAccessableCycle(panel, value);
}
///
/// 设置容器内的控件可用状态, Control.Enable = false/true
///
/// 容器
/// false/true
public static void SetControlEnable(Control container, bool value)
{
if (container is Label) return;
if (container is LabelControl) return;
if (container.Name == "") return;
if (container.Controls.Count > 0)
foreach (Control c in container.Controls)
{
c.Enabled = value;
SetControlEnable(c, value);
}
}
///
/// 设置容器内所有可输入控件的状态 .ReadOnly or Enable . (递归)循环控制
///
/// 容器
/// false/true
protected void SetControlAccessableCycle(Control container, bool value)
{
if (container.HasChildren)
foreach (Control ctrl in container.Controls)
//DevExpress的内部(Inner)控件
if (ctrl.Name == string.Empty)
SetControlAccessable(container, value);
else
SetControlAccessableCycle(ctrl, value);
else
SetControlAccessable(container, value);
}
///
/// 设置容器内所有可输入控件的状态.ReadOnly or Enable = false/true
///
/// 容器
/// false/true
protected void SetControlAccessable(Control container, bool value)
{
if (container is Label) return;
if (container is LabelControl) return;
if (container is UserControl) return;
if (container.HasChildren == false) return; //没有子控件,不处理
foreach (Control c in container.Controls)
//最常用组件,首先处理
if (c is BaseEdit) //输入框
(c as BaseEdit).Properties.ReadOnly = !value;
else if (c is GridControl) //表格
((c as GridControl).Views[0] as GridView).OptionsBehavior
.Editable = value;
else
SetControlAccessableByProp(container,
value); //其它组件,反射属性设置状态
}
///
/// 设置一个控件的可用状态,通过反射ReadOnly,Properties属性
///
/// 控件
/// 值
private void SetControlAccessableByProp(Control control, bool value)
{
var type = control.GetType();
var infos = type.GetProperties();
foreach (var info in infos)
{
if (info.Name == "ReadOnly") //Properties.ReadOnly
{
info.SetValue(control, !value, null);
return;
}
if (info.Name == "Properties")
{
var o = info.GetValue(control, null);
//处理特殊组件
if (o is RepositoryItemButtonEdit &&
(o as RepositoryItemButtonEdit).Buttons.Count >
0) //ButtonEdit
(o as RepositoryItemButtonEdit).Buttons[0].Enabled =
value;
else if (o is RepositoryItemDateEdit &&
(o as RepositoryItemDateEdit).Buttons.Count >
0) //DateEdit
(o as RepositoryItemDateEdit).Buttons[0].Enabled =
value;
if (o is RepositoryItem)
(o as RepositoryItem).ReadOnly = !value;
return;
}
}
}
#endregion
#region Summary数据导航功能
///
/// 移到第一条记录
///
protected virtual void DoMoveFirst(IButtonInfo sender)
{
if (_SummaryView == null) return;
_SummaryView.MoveFirst();
if (tcBusiness.SelectedTabPage != tpSummary) DoViewContent(null);
}
///
/// 移到上一条记录
///
protected virtual void DoMovePrior(IButtonInfo sender)
{
if (_SummaryView == null) return;
_SummaryView.MovePrior();
if (tcBusiness.SelectedTabPage != tpSummary) DoViewContent(null);
}
///
/// 移到下一条记录
///
protected virtual void DoMoveNext(IButtonInfo sender)
{
if (_SummaryView == null) return;
_SummaryView.MoveNext();
if (tcBusiness.SelectedTabPage != tpSummary) DoViewContent(null);
}
///
/// 移到最后一条记录
///
protected virtual void DoMoveLast(IButtonInfo sender)
{
if (_SummaryView == null) return;
_SummaryView.MoveLast();
if (tcBusiness.SelectedTabPage != tpSummary) DoViewContent(null);
}
#endregion
#region 几个断言
///
/// 检查对象是否为空
///
/// 要检测的对象
/// 如果为空提示信息
protected void AssertNull(object obj, string errMsg)
{
if (null == obj) throw new Exception(errMsg);
}
///
/// 检查对象对等
///
/// 对象A
/// 对象B
/// 如果不相等提示信息
protected void AssertEqual(object objA, object objB, string errMsg)
{
if (objA != null && objB != null)
if (!objA.Equals(objB))
throw new Exception(errMsg);
}
///
/// 检查是否有选择一条记录.
///
protected void AssertFocusedRow()
{
var ret = _SummaryView == null ||
_SummaryView.IsValidRowHandle(_SummaryView
.FocusedRowHandle) == false;
if (ret) throw new Exception("您没有选择记录,操作取消!");
}
///
/// 检查数据集是否有数据
///
///
protected void AssertRowNull(DataSet data)
{
var ret = data == null || data.Tables.Count == 0 ||
data.Tables[0].Rows.Count <= 0;
if (ret) throw new Exception("该数据集没有数据!");
}
///
/// 检查数据集是否有数据
///
///
protected void AssertTableEmpty(DataSet ds)
{
if (ds == null || ds.Tables.Count <= 0 ||
ds.Tables[0].Rows.Count <= 0) throw new Exception("该数据集没有数据!");
}
#endregion
}
}