新增业务单据主从表窗体 - MiniFramework蝇量框架 - Winform框架
新增业务单据主从表窗体 - MiniFramework蝇量框架 - Winform框架
总体开发思路大致与单表相同,主从表窗体多了一个明细表。注意:本文已省略基础界面开发。
单表窗体开发指南:https://www.cscode.net/archive/miniframework/255527961665541.html
目录
- 一、添加Windows窗体,继承 frmBaseData
- 二、添加按钮组件(ucButtonFunction)
- 三、添加 XtraTableContaol组件
- 四、【数据查询】添加查询条件、主表表格
- 五、【编辑详情】添加主表当前记录详情、明细表
- 六、新增 Model、DAL、BLL 源码
- 七、实现【查询】按钮事件
- 八、实现功能按钮事件
- 关于 DataBinder 类 - 绑定下拉选择组件数据源
- 扩展功能 - DataDictCache 类
- 扩展功能 - 使用 ButtonEdit 组件实现弹窗选择供应商
- 扩展功能 - 使用 RepositoryItemButtonEdit 组件实现弹窗选择产品资料
- 扩展功能 - 明细表表格实现【增加】、【插入】、【删除】功能
- 扩展功能 - 明细表自动计算功能
一、添加Windows窗体,继承 frmBaseData
二、添加按钮组件(ucButtonFunction)
三、添加 XtraTableContaol组件
添加2个TabPage标签页,分别改名【数据查询】、【编辑详情】,已经设置标签页的小图标。
四、【数据查询】添加查询条件、主表表格
添加查询条件相关组件。首先添加一个 PanelControl 组件作为查询条件的容器。
然后添加相关查询条件组件,如:LabelControl、TextEdit、DateEdit,以及2个按钮 SimpleButton,分别是【查询】与【清空】按钮。
五、【编辑详情】添加主表当前记录详情、明细表
添加一个 PanelControl 组件作为主表详情区域容器。然后添加每个字段对应的输入组件,本文使用的组件有: TextEdit、DateEdit、ButtonEdit、LookupEdit 等。
注意:编辑详情页输入组件命名规范:txt+字段名,如:txtPONO,txtSupplierCode ,
而查询条件输入组件命名规范:txt_+字段名,txt下划线,如:txt_PONO,txt_SupplierCode
添加一个 GridControl 组件作为明细表表格。
六、新增 Model、DAL、BLL 源码
分别对应3个子目录:
新增Model
在 Models 子目录下新增一个2个cs文件,分别为 tb_PO.cs 、tb_POs.cs
MiniFramework没有代码生成器,建议从其他.cs文件复制过来改名。
新增DAL
新增BLL
七、实现【查询】按钮事件
//查询按钮事件
private void btnQuery_Click(object sender, EventArgs e)
{
try
{
frmWaitingEx.ShowMe(this);
//查询条件
var input = new QueryPO
{
docNo1 = txt_DocNoFrom.EditValue.ToStringEx(),
docNo2 = txt_DocNoTo.EditValue.ToStringEx(),
docDate1 = Globals.GetMinSQLDate(txt_DocDateFrom.DateTime),
docDate2 = Globals.GetMinSQLDate(txt_DocDateTo.DateTime),
stockCode = txt_StockCode.EditValue.ToStringEx(),
supplierInfo = txt_SupplierInfo.Text.Trim(),
createUser = txt_CreatedBy.EditValue.ToStringEx()
};
var dt = _BLL.Query(input);
gcSummary.DataSource = dt;
ucOperate.DoSetViewMode();
}
finally
{
frmWaitingEx.HideMe(this);
}
}
八、实现功能按钮事件
frmPurchaseOrder.cs 实现的按钮事件:
参考:ucOperate_OnAdd 方法【新增】按钮事件
/// <summary>
/// 新增按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ucOperate_OnAdd(object sender, UserControls.ButtonEventArgs e)
{
var source = _BLL.CreateDataBinder(null);
source.Rows[0][tb_PO.FlagApp] = "N";//默认赋值
source.Rows[0][tb_PO.PONO] = "*自动生成*";
source.Rows[0][tb_PO.PODate] = DateTime.Today;
source.Rows[0][tb_PO.CreatedBy] = Loginer.Current.UserId;
source.Rows[0][tb_PO.CreationDate] = DateTime.Now;
//绑定主表当前记录的数据源(所有文本输入框)
DataBinder.BindingEditorPanel(gcDetailEditor, source);
//绑定明细表的数据源
this.LoadDetail("-");
this.ShowDetailPage(true);
_UpdateType = UpdateType.Add;
e.IsDone = true;
}
参考文章:ucButtonFunction 组件详解
https://www.cscode.net/archive/miniframework/256700773441541.html
关于 DataBinder 类 - 绑定下拉选择组件数据源
参考以下例子,实现自己的方法。
/// <summary>
/// 绑定下拉组件(LookupEdit)数据源
/// </summary>
/// <param name="lue"></param>
internal static void BoundCurrency(RepositoryItemLookUpEdit lue)
{
lue.NullText = "";
lue.DropDownRows = 15;
InitializeControl(lue, new string[] { "货币类型" }, new string[] { tb_Currency.CurrencyName });
DataBinder.BindingLookupEditDataSource(lue, DataDictCache.Cache.Currency, tb_Currency.CurrencyName, tb_Currency.Currency);
}
扩展功能 - DataDictCache 类
https://www.cscode.net/archive/newdoc/cs-210903193535642-42.html
扩展功能 - 使用 ButtonEdit 组件实现弹窗选择供应商
扩展功能 - 使用 RepositoryItemButtonEdit 组件实现弹窗选择产品资料
扩展功能 - 明细表表格实现【增加】、【插入】、【删除】功能
扩展功能 - 明细表自动计算功能
若上图所示,【金额】列是不可输入的,输入【单价】或【数量】自动计算。
开发步骤:
给明细表表格 gvDetail 绑定 CellValueChanged 事件
gvDetail.CellValueChanged += GvDetail_CellValueChanged;
private void GvDetail_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
//用户修改了单价、数量列
if ((e.Column == colD_Price) || (e.Column == colD_Quantity))
{
decimal price = ConvertEx.ToDecimal(gvDetail.GetDataRow(gvDetail.FocusedRowHandle)[tb_POs.Price]);//单价
decimal quantity = ConvertEx.ToDecimal(gvDetail.GetDataRow(gvDetail.FocusedRowHandle)[tb_POs.Quantity]);//数量
decimal amt = Math.Round(price * quantity, 2, MidpointRounding.AwayFromZero);//金额=数量*单价
gvDetail.SetFocusedRowCellValue(colD_Amount, amt);
gvDetail.UpdateCurrentRow();//更新当前资料行
gvDetail.UpdateTotalSummary();//更新合计
//更新主表的合计金额,取明细表合计(SUM)
decimal totalAmt = ConvertEx.ToDecimal(colD_Amount.SummaryItem.SummaryValue);
this.SetEditorBindingValue(txtAmount, totalAmt, true);
}
}