目录
前言
本人有C# C/S 和 B/S项目的开发经验 但是没有金蝶二开的经验所以有些地方可能和其他大佬理解的不一样,写的不对的地方请大佬们斧正。
提示:以下是本篇文章正文内容,下面案例可供参考
表单插件的开发
- 第一步打开VS 创建C# NET Framework类库
- 引入需要的dll 表单插件继承AbstractBillPlugIn类 其他的我碰到再说
- 这一步完成后就可以写自己的代码了 金蝶有自己的生命周期函数(我理解为生命周期函数)
- 最常用的有:
AfterBindData事件
在onload事件之后发生 一般是整个界面加载完成后 可以用来绑定默认的一些数据
AfterButtonClick事件
按钮的点击事件 e.key代表的是你在bos 设计器添加的按钮标识 当时踩了个坑就是标识它框架是全大写所以我不想改我标识 就加了个ToUpper()
EntryBarItemClick事件
这个事件是明细的按钮事件 一般用来写自定义的明细事件 可以用来完成框架没有的按钮效果
BarItemClick事件
这是页面上的菜单的事件可以对它进行重载
CustomEvents事件
这个事件我觉得是最好用的一个事件 因为它可以拿到用户做的对应操作 比如
我这里做的一个功能是客户输入数据后按Enter然后进行数据筛选并添加到页面 最后固定焦点到输入的地方
还有电子称的功能实现也是因为这个事件
在客制化WPF控件中实现IKDCustomControl, IDynamicFormSupported这两个接口然后就可以传输数据到CustomEvents事件里接收
客制化控件的开发可以去看官方文档
如何自动添加数据:
往entry里填数据就行了 最后一定要刷新明细不然显示不出来哦。源码:
//获取单据体数据包
DynamicObjectCollection Entrys = this.View.Model.DataObject["明细标识"] as DynamicObjectCollection;
//赋值data是你的数据集
foreach (var item in data)
{
//构建新增行单据体数据
DynamicObject entry = Entrys.DynamicCollectionItemPropertyType.CreateInstance() as DynamicObject;//相当于新增行操作
entry["F_SYKF_Barcode"] = item["BARCODE"];
entry["F_SYKF_Boxcapacity"] = item["BoxCapacity"];
entry["F_SYKF_QTY"] = 0;
entry["F_SYKF_Materialcode"] = item["materialID"].GetValue<string>("Number");
entry["F_SYKF_MATERIALNAME"] = item["materialID"].GetValue<string>("Name");
entry["F_SYKF_CUSTMATERIALCODE"] = item["CustMatID"].GetValue<string>("Number");
entry["F_SYKF_Lot"] = item["LOT"].GetValue<string>("Name");
entry["F_SYKF_Customerlot"] = item["cosLot"];
entry["F_SYKF_Notes"] = item["REMARK"];
entry["isComplete"] = 0;
//新增行的数据add进单据提数据包
Entrys.Add(entry);
}//bos的明细标识
this.View.UpdateView("明细标识");
我的业务是还有添加主明细的子明细:
//获取当前选择行号
SubEntryEntity entryRow= this.View.BillBusinessInfo.GetEntryEntity("主明细标识") as SubEntryEntity;
var selectRowIndex = this.View.Model.GetEntryCurrentRowIndex("主明细标识");
var EntryData = this.View.Model.DataObject;
var BillPack = EntryData["主明细标识"] as DynamicObjectCollection;//获取主明细数据包
var entry = BillPack[selectRowIndex];//当前行的数据
DynamicObjectCollection subEntryRows = entryRow.DynamicProperty.GetValue(entry) as DynamicObjectCollection;
foreach (var item in sonEntryData)
{
DynamicObject subEntry = subEntryRows.DynamicCollectionItemPropertyType.CreateInstance() as DynamicObject;
subEntry["F_SYKF_mBarcode"] = item["BARCODE"];
subEntry["F_SYKF_materialID"] = item["materialId_id"];
subEntry["F_SYKF_mMaterialcode"] = item["materialID"].GetValue<string>("Number");
subEntry["F_SYKF_mMaterialname"] = item["materialID"].GetValue<string>("Name");
subEntry["F_SYKF_mLot"] = item["lot"].GetValue<string>("Number");
subEntry["F_SYKF_mCustomerlot"] = item["cosLot"];
subEntry["F_SYKF_MMZ"] = item["GrossWeight"];
subEntry["F_SYKF_mBarCodenum"] = item["QTY"];
subEntry["F_SYKF_mCustomermID"] = item["custmatid"].GetValue<string>("Number");
subEntry["F_SYKF_mLotID"] = item["lot"].GetValue<long>("ID");
subEntryRows.Add(subEntry);
}
//调用值更新事件
_ = BillPack.UpdateRows;//没有就不要调
this.View.InvokeFieldUpdateService("F_SYKF_QTY", selectRowIndex);
this.View.UpdateView("FmEntity");//刷新一定要
还有一点让我研究的挺久的就是如何在它删除行后计算加的东西的重量
实现的方法有很多 我这里提供一个在这两个事件里面重算就行了
public override void AfterDeleteEntry(AfterDeleteEntryEventArgs e)
{
base.AfterDeleteEntry(e);
GetLXWeight(_MaterialcurrentData);
}
public override void AfterDeleteRow(AfterDeleteRowEventArgs e)
{
base.AfterDeleteRow(e);
GetLXWeight(_MaterialcurrentData);
}
结语
以上就是我通过这个小项目的收获希望大家能通过这篇文章有所收获