有时候我们的表单可能很简单,只是一个简单交互的表单,但有可能还是要劳师动众的给它建个工程写个插件,是不是很不爽?例如我有如下一个表单:

功能很简单就是选个业务对象,收集绑定几个字段名,然后确定返回一个对象而已。我不想写插件,因为K3Cloud是基于.net 4.0的,它对动态语言有了支持,于是我选择使用python来实现这个简单逻辑,以下是我的py插件,有注释,小伙伴们应该读得懂:

#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.K3.Core')
clr.AddReference('LUTAI.K3.BOS.Core')
clr.AddReference('Kingdee.BOS.ServiceHelper')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Util import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from Kingdee.BOS.Core.Interaction import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata.FieldElement import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.K3.Core import *
from LUTAI.K3.BOS.Core import *
from LUTAI.K3.BOS.Core.Metadata.Operation import *
from System import *
from System.Collections.Generic import *
#这里是重载cloud插件模型的按钮点击事件,其它事件的重写也一样
def ButtonClick(e):        
if e.Key=="FOK":
#这里是实例化C#中的实体对象
        selParams = BatchEditBomOpParams();
#这里就是取表单模型里某字段的模型对象了
        selFormIdField = this.View.BillBusinessInfo.GetField("FSelFormId");
        mtrlFieldKeyField = this.View.BillBusinessInfo.GetField("FMtrlIdFieldKey");
        auxPropIdFieldKeyField = this.View.BillBusinessInfo.GetField("FAuxPropIdFieldKey");
        bomIdFieldKeyField = this.View.BillBusinessInfo.GetField("FBomIdFieldKey");
#从模型取值赋值给C#实体对象
        selParams.FormId=selFormIdField.RefIDDynamicProperty.GetValue(this.Model.DataObject);
        selParams.MaterialIdFieldKey=mtrlFieldKeyField.DynamicProperty.GetValue(this.Model.DataObject);
        selParams.AuxPropIdFieldKey=auxPropIdFieldKeyField.DynamicProperty.GetValue(this.Model.DataObject);
        selParams.BomIdFieldKey=bomIdFieldKeyField.DynamicProperty.GetValue(this.Model.DataObject);
if len(selParams.FormId)<=0:
this.View.ShowMessage("表单对象字段必录!");
return;
if len(selParams.MaterialIdFieldKey)<=0:
this.View.ShowMessage("成品编码字段必录!");
return;
if len(selParams.BomIdFieldKey)<=0:
this.View.ShowMessage("BOM版本字段必录!");
return;
this.View.ReturnToParentWindow(selParams);
this.View.Close();
def DataChanged(e):
if e.Key=="FSelFormId":
if len(e.NewValue)>0:
            #这里要注意的是,使用this.Context获取上下文,不要使用this.View.get_Context(),这是智能感知的,被害死了
            metadata = MetaDataServiceHelper.Load(this.Context, e.NewValue);
            lstMtrlFieldItems = List[EnumItem]();
            lstAuxPropIdFieldItems = List[EnumItem]();
            lstBomIdFieldItems = List[EnumItem]();
            lstAuxPropIdFieldItems.Add(EnumItem());
if e.NewValue == "ENG_BOM":
                enumItem=EnumItem();
                enumItem.Caption=LocaleValue("物料清单内码", this.Context.UserLocale.LCID);
                enumItem.Value=metadata.BusinessInfo.GetForm().PkFieldName;
                enumItem.Seq=0;
                enumItem.EnumId=Guid.NewGuid().ToString();
                lstBomIdFieldItems.Add(enumItem);
            iFlag = 0;
for field in metadata.BusinessInfo.GetFieldList():
                enumItem2 = EnumItem();
                enumItem2.Seq = iFlag;
                enumItem2.Caption = field.Name;
                enumItem2.Value = field.Key;
                enumItem2.EnumId = Guid.NewGuid().ToString();
                iFlag=iFlag+1;
if isinstance(field,BaseDataField):                    
                    lookupObjId = field.LookUpObject.FormId;
if lookupObjId=="ENG_BOM":
                        lstBomIdFieldItems.Add(enumItem2);
if lookupObjId=="BD_MATERIAL":
                        lstMtrlFieldItems.Add(enumItem2);
if isinstance(field,RelatedFlexGroupField):
                    lstAuxPropIdFieldItems.Add(enumItem2);
if lstMtrlFieldItems.Count>0:
                fieldEditor = this.View.GetControl("FMtrlIdFieldKey");
                fieldEditor.SetComboItems(lstMtrlFieldItems);
this.Model.SetValue("FMtrlIdFieldKey",lstMtrlFieldItems[0].Value);
if lstAuxPropIdFieldItems.Count>0:
                fieldEditor = this.View.GetControl("FAuxPropIdFieldKey");
                fieldEditor.SetComboItems(lstAuxPropIdFieldItems);
this.Model.SetValue("FAuxPropIdFieldKey",lstAuxPropIdFieldItems[0].Value);
if lstBomIdFieldItems.Count>0:
                fieldEditor = this.View.GetControl("FBomIdFieldKey");
                fieldEditor.SetComboItems(lstBomIdFieldItems);
this.Model.SetValue("FBomIdFieldKey",lstBomIdFieldItems[0].Value);

晕掉,复制过来都是带颜色的,可是一保存不高亮了,没颜色了,手动编辑了几种颜色,但太多了,麻烦。凑合看吧。希望这个编辑控件可以改进支持高亮代码显示才好。

【原】K3Cloud平台开发之Python插件的更多相关文章

  1. [K/3Cloud]K3Cloud平台开发之Python插件

    有时候我们的表单可能很简单,只是一个简单交互的表单,但有可能还是要劳师动众的给它建个工程写个插件,是不是很不爽?例如我有如下一个表单: 功能很简单就是选个业务对象,收集绑定几个字段名,然后确定返回一个 ...

  2. 企业级监控平台开发之nagios二次开发(七)

    背景: A公司里有很多服务器(>3000台),每台服务器都有不同的用途,如DB Server.WEB Server.ESXI等,每个组使用其中的一批,每个组可能有多个服务器管理员.现在问题出来了 ...

  3. Java微信公众平台开发之OAuth2.0网页授权

    根据官方文档点击查看在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修 ...

  4. [原]Windows Azure开发之Linux虚拟机

      Windows Azure是微软的云服务集合,用来提供云在线服务所需要的操作系统与基础存储与管理的平台,是微软的云计算的核心组成组件之一.其中windows azure提供的最重要的一项服务就是虚 ...

  5. Python自动化开发之python的常用模块

    python常用模块 模块的种类:模块分为三种,分别是自定义模块:内置标准模块(即标准库):开源模块(第三方). 以下主要研究标准模块即标准库:标准库直接导入即可,不需要安装. 时间模块:time , ...

  6. 前端开发之Chrome插件

    Postman - REST Client Postman是Ajax开发的神器,对于Restful开发方式特别有帮助,可以用来模拟各种请求来测试API的正确性,比如用来模拟Ajax请求.它还支持认证, ...

  7. Vim下的Web开发之html,CSS,javascript插件

    Vim下的Web开发之html,CSS,javascript插件   HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...

  8. Android插件化开发之OpenAtlas生成插件信息列表

    上一篇文章.[Android插件化开发之Atlas初体验]( http://blog.csdn.net/sbsujjbcy/article/details/47446733),简单的介绍了使用Atla ...

  9. UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)

    前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...

随机推荐

  1. js两个时间比较

    var applyStart = $("#ApplyStart").val().replace(/-/g,'/'); var applyEnd = $("#ApplyEn ...

  2. 【ThinkingInC++】65、使用delete void*可能会出错

    /** * 书本:[ThinkingInC++] * 功能:使用delete void*可能会出错 * 时间:2014年10月5日14:31:43 * 作者:cutter_point */ #incl ...

  3. [Angular 2] Component relative paths

    Oingial aritial --> Link Take away: import { Component, OnInit } from '@angular/core'; @Component ...

  4. Eclipse Key Shortcuts for Greater Developers Productivity--reference

    Posted by Ajitesh Kumar / In Java / June 6, 2014 http://vitalflux.com/eclipse-key-shortcuts-greater- ...

  5. display_errors & error_reporting(php调试安全)

    这两个选项对应的值即都可以在php.ini文件中设置,也都可以在php代码中使用相应的函数来设置. 在php.ini文件中的设置如下:

  6. STDMETHOD_,STDMETHOD,__declspec(novtable)和__declspec(selectany)

    1.STDMETHOD_(ULONG, AddRef)() PURE; STDMETHOD_:定义一个返回指定类型的虚方法, STDMETHOD:定义一个返回HRESULT类型的虚方法, PURE : ...

  7. Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  8. Ubuntu 13.10 Rhythmbox 播放器不能播放MP3。安装插件

    Ctrl+Alt+T > sudo apt-get install ubuntu-restricted-extras 因为版权和专利的问题,MP3等一些non-free的格式文件支持没有出现在免 ...

  9. Linux bash中的变量分类

    1.本地变量 VAR=XYZ 2.局部变量 local VAR=XYZ 3.环境变量 在子shell中可以起作用 export VAR=XYZ 4.位置变量 $0 脚本名本身 $1 第一个参数 $2 ...

  10. android本地定时通知

    android本地通知略有不同,分为立即触发和延时触发 1.即时通知 android默认的Notification为立即触发 Intent intent = new Intent(Intent.ACT ...