(结合视频教学资料使用)
1.UBF路径配置
(视频160)
2.解决方案建立规则
目录层次:解决方案>>项目>>组件
同一模块,所有BE、BP、SV项目放在(同)一个解决方案内
同一模块,所有BE,只用一个项目,即只生成一个BE的DLL
同一模块,所有BP、SV,只用一个项目,即只生成一个BP、SV的DLL
同一模块,可以所有枚举放在(同)一个BE组件内
同一模块,所有UI项目放在一个解决方案内
一个档案或单据UI,及其相关的查找参照UI,用(同)一个项目,即一个档案或单据,生成一个UI的DLL 同一模块,所有列表UI,用(同)一个项目
同一模块,所有参照UI,用(同)一个项目
3.命名规范
配件名:UFIDA.U9.Cust.XM(地区).HXPP(公司).EX(模块)BE
表名:Cust_XM(地区)_HXPP(公司)_EX(模块)_XXXX
4.档案开发需求
(视频170,180)
考核模块(EX)>>科目(Subject)
5.BE Code与Model对比
6.组件、类实体、属性关系查询(SQL语句)
select a. Name as ComponentName ,at. DisplayName as ComponentName_CN,a. AssemblyName,a .Kind ,b. Name as ClassName , bt. DisplayName as ClassName_CN,b. FullName,b .Discriminator
,c. Name as AttributeName ,ct. DisplayName as AttributeName_CN
from UBF_MD_Component a
left outer join UBF_MD_Component_Trl at on a. Local_ID=at .Local_ID and at.SysMLFlag= 'zh-cn'
left outer join UBF_MD_Class b on a. ID=b .MD_Component_ID
left outer join UBF_MD_Class_Trl bt on b. Local_ID=bt .Local_ID and bt.SysMLFlag= 'zh-cn'
left outer join UBF_MD_Attribute c on b. ID=c .MD_Class_ID
left outer join UBF_MD_Attribute_Trl ct on c. Local_ID=ct .Local_ID and ct.SysMLFlag= 'zh-cn'
where (1 =1)
and bt. DisplayName='科目'
7.UI Code与Model对比
8.UIForm、Part、Page的关系查询(SQL语句)
select at .DisplayName as UIFormDisplayName , a .name as UIFormName ,c. name as PageName
,a. uid as [UID(FormID)], b.PageCode
,a. uri as [PartID(UIFormURI)], c.uri as PageURI
,a. AssemblyName , a.ClassName
,a. Width,a .Height, https://www.doczj.com/doc/749415811.html, as ApplicationName
from ubf_md_uiform a
left outer join ubf_assemble_part b on a.uid =b. component
left outer join ubf_assemble_page c on b.page =c. id
left outer join base_application_trl dt on c.application =dt. id and dt. sysmlflag='zh-cn'
left outer join ubf_md_uiform_trl at on a.id =at. id and at. sysmlflag='zh-cn'
where (1 =1)
and at.DisplayName='科目'
9.同步枚举脚本
以补丁包方式更新/安装,则不需要下面的脚本,因为be的bulk中会处理;
delete from ubf_sys_extenumtype
delete from ubf_sys_extenumtype_trl
delete from ubf_sys_extenumvalue
delete from ubf_sys_extenumvalue_trl
GO
insert into ubf_sys_extenumtype select local_id as id,'20060612' ,'u9zhangheng', '20060612','u9zhangheng' ,0, fullname as code, isextend,id as uid,0 as IsRefView from ubf_md_class where classtype=3
insert into ubf_sys_extenumtype_trl select a .local_id as id ,'zh-CN', b.[displayname] as [name],b .[Description] from ubf_md_class a left join ubf_RES_resourcevalue b on cast( a.[iD] as nvarchar(255 )) = b. resourcename where classtype =3 insert into ubf_sys_extenumvalue select a .local_id as id,'20060612' ,'u9zhangheng', '20060612','u9zhangheng' ,0, a.[Local_Class_ID] as ExtEnumType , a.[name] as code,a .defaultvalue as evalue ,issystem, md_class_id as ExtEnumTypeUID from ubf_md_attribute as a inner join ubf_md_class as b on a. md_class_id=b .id where classtype =3
insert into ubf_sys_extenumvalue_trl select a .local_id as id ,'zh-CN', c.[displayname] as [name] from ubf_md_attribute as a inner join ubf_md_class as b on a.md_class_id =b. id left join ubf_RES_resourcevalue c on cast( a.[ID] as nvarchar(255 )) = c. resourcename where classtype= 3
GO
--枚举值表关系
SELECT a .Code , at .NAME ,a. EValue, c.UID AS EnumTypeUID FROM UBF_Sys_ExtEnumValue a
LEFT OUTER JOIN UBF_Sys_ExtEnumValue_Trl at ON a.id =at . id AND at. SysMLFlag='zh-cn'
LEFT OUTER JOIN UBF_Sys_ExtEnumType c ON a.ExtEnumType =c . id
WHERE c .Code = 'UFIDA.U9.Base.Doc.ConfirmTypeEnum'
10.装配发布
(视频190)
\UBFV28\U9.VOB.Product.UBF\UBFStudio
BuildupDesigner.exe
buildup.xml,修改UILib路径
.\Runtime\environment.xml
带实例名的ConnectionString
Catalog=HXPP0145;packet size=4096;Max Pool size=100;Connection Timeout=900;persist security info=True;MultipleActiveResultSets=true;
11.常用代码
(视频200,210,220)
BE上赋默认值,OnSetDefaultValue 处增加代码
if (https://www.doczj.com/doc/749415811.html, == null)
{ https://www.doczj.com/doc/749415811.html, = Context.LoginOrg; }
UI上赋默认值,Model>>AfterInitModel 处增加代码
this.Subject.FieldOrg.DefaultValue = https://www.doczj.com/doc/749415811.html,Ref.ID;
this.Subject.FieldOrg_Code.DefaultValue = https://www.doczj.com/doc/749415811.html,Ref.CodeColumn;
this.Subject.FieldOrg_Name.DefaultValue = https://www.doczj.com/doc/749415811.html,Column;
扩展字段处理,在Webpart>>AfterCreateChildControls()里面调用:
FlexFieldHelper.SetDescFlexField(this.FlexFieldPicker0, this.Model.Subject);
其中:this.FlexFieldPicker0为要设置的描述性弹性域控件,this.Model.Subject为描述性弹性域所在的View,把Subject 换成你的View就可以了。
复制,Webpark中按钮事件写代码,复制功能自动完成,增加清除不需复制值的代码即可
this.Model.Subject.FocusedRecord.Code = string.Empty;
开启个性化,AfterCreateChildControls中加
UFIDA.U9.UI.PDHelper.PersonalizationHelper.SetPersonalizationEnable(this, true);
删除按钮绑定提示,AfterCreateChildControls中加
UFIDA.U9.UI.PDHelper.PDFormMessage.ShowDelConfirmDialog(this.Page,UFIDA.U9.UI.PDHelper.PDResource.GetDeleteConfir mInfo(), "", this.BtnDelete);
弹出窗口与非弹出窗口的按钮控制(确定、取消),在AfterUIModelBinding中调用SetControlStauts
private void SetControlStauts ()
{
//是否为弹出模态窗口
if (UFIDA.U9.UI.PDHelper.NavigateManager.IsTitleLink(this) || UFIDA.U9.UI.PDHelper.NavigateManager.IsModelPopup(this))
{
this.BtnOk.Visible = true;
this.BtnClose.Visible = true;
//列表动作不可用
this.BtnList.Enabled = false;
}
else
{
//确定取消不可见
this.BtnOk.Visible = false;
this.BtnClose.Visible = false;
this.BtnList.Enabled = true;
}
}
附件>>不用写代码,只需启用文档库。
12.UI事件的执行先后顺序
AfterEventBind,事件绑定之后
AfterCreateChildControls,创建控件之后
OnLoadData_Extend(刷新时执行,一般PostBack不执行)
AfterOnLoad
OnDataCollect_Extend(刷新时不执行,PostBack执行),数据收集
BeforeUIModelBinding,UIModel的值绑定到UIForm的控件之前
AfterUIModelBinding,UIModel的值绑定到UIForm的控件之后
13.贯穿BE和UI的关系图
14.不走审批流的提交、审核、弃审处理
不走审批流的提交、审核、弃审,按钮状态控制(示例代码)
private void SetControlStauts()
{
PrintProduceSituationRecord r1 = this.Model.PrintProduceSituation.FocusedRecord;
if (r1 != null)
{
switch (r1.Status)
{
case 0:
BtnSubmit.Enabled = true;
BtnApprove.Enabled = false;
BtnUndoApprove.Enabled = false;
BtnDelete.Enabled = true;
Card4.ReadOnly = false;
break;
case 1:
BtnSubmit.Enabled = false;
BtnApprove.Enabled = true;
BtnUndoApprove.Enabled = false;
BtnDelete.Enabled = true;
Card4.ReadOnly = false;
break;
case 2:
BtnSubmit.Enabled = false;
BtnApprove.Enabled = false;
BtnUndoApprove.Enabled = true;
BtnDelete.Enabled = false;
Card4.ReadOnly = true;
break;
default:
break;
}
}
//控制只读
((UFSoft.UBF.UI.ControlModel.IUIFieldBindingDataBindControl)this.Status178).ReadOnly = true;
((IUIFieldBindingDataBindControl)this.ApprovedBy101).ReadOnly = true;
((IUIFieldBindingDataBindControl)this.ApprovedOn311).ReadOnly = true;
}
不走审批流的提交、审核、弃审按钮处理(示例代码)
private void BtnSubmit_Click_Extend(object sender, EventArgs e)
{
PrintProduceSituationRecord r1 = this.Model.PrintProduceSituation.FocusedRecord;
if (r1 != null && r1.Status == 0)
{
BtnSave_Click_Extend(sender, e);
r1.Status = 1;
BtnSave_Click_Extend(sender, e);
SetControlStauts();
}
BtnSubmit_Click_DefaultImpl(sender, e);
}
private void BtnApprove_Click_Extend(object sender, EventArgs e)
{
PrintProduceSituationRecord r1 = this.Model.PrintProduceSituation.FocusedRecord;
if (r1 != null && r1.Status == 1)
{
BtnSave_Click_Extend(sender, e);
r1.Status = 2;
r1.ApprovedBy = long.Parse(https://www.doczj.com/doc/749415811.html,erID);
r1.ApprovedOn = DateTime.Now;
BtnSave_Click_Extend(sender, e);
SetControlStauts();
}
BtnApprove_Click_DefaultImpl(sender, e);
}
private void BtnUndoApprove_Click_Extend(object sender, EventArgs e)
{
PrintProduceSituationRecord r1 = this.Model.PrintProduceSituation.FocusedRecord;
if (r1 != null && r1.Status == 2)
{
BtnSave_Click_Extend(sender, e);
r1.Status = 0;
r1.ApprovedBy = null;
r1.ApprovedOn = null;
BtnSave_Click_Extend(sender, e);
SetControlStauts();
}
BtnUndoApprove_Click_DefaultImpl(sender, e);
}
15.常用ContextItems(上下文值)
Context.DateTime
https://www.doczj.com/doc/749415811.html,erID
https://www.doczj.com/doc/749415811.html,erName
https://www.doczj.com/doc/749415811.html,erCode
https://www.doczj.com/doc/749415811.html,ID
Context.Culture
Context.Contact
Context.EnterpriseID
Context.EnterpriseName
16.查找代码
(视频230)
查找代码,AfterCreateChildControls中加
UFIDA.U9.UI.PDHelper.PDFormMessage.ShowConfirmDialog(this.Page, "92afc0de-6cba-4b56-a815-5efd0f2ebb55", "580", "408", Title, wpFindID.ClientID, BtnFind);
其中FormID,可在UI对应的Webpart代码中查到
17.参照关系查询(aspnet_Parts,UIRComponent,UIReference,EntityReference,Class,Component)(SQL语句)
select a. FormId , a .ClassName as RefClassName ,a .Assembly as RefAssemblyName,a. URI as RefURI
,b. Name as RefComponentName ,bt. DisplayName as RefComponentName_CN
,c. RefType ,c .Name as RefTypeName,c .Filter, c.RefEntityId ,c. RefEntityName
,d. MD_Class_ID as [EntityReference_ClassID] ,d. MD_Template_ID as [EntityReference_TemplateID]
,e. Name as RefEntity_ClassName ,e. FullName as RefEntity_ClassFullName, e.DefaultTableName as RefEntity_TableName,et. DisplayName as RefEntity_ClassName_CN
,f. Name as RefEntity_ComponentName ,f. AssemblyName as RefEntity_AssemblyName
from aspnet_Parts a
left outer join UBF_MD_UIRComponent b on a. FormId=b .UID
left outer join UBF_MD_UIRComponent_Trl bt on b. ID=bt .ID
left outer join UBF_MD_UIReference c on b. UID=c .Container
left outer join UBF_MD_EntityReference d on c. Container=d .MD_Template_ID
left outer join UBF_MD_Class e on c. RefEntityId=e .ID
left outer join UBF_MD_Class_Trl et on e. Local_ID=et .Local_ID
left outer join UBF_MD_Component f on e. MD_Component_ID=f .ID
where (1 =1)
and c. Name='cref'
and (et. DisplayName='科目')
18.代码控制过滤条件
通过代码,给参照加过滤条件(示例代码),BeforeUIModelBinding
IUFFldReferenceColumn c1 = (IUFFldReferenceColumn)this.DataGrid5.Columns["WaterMarkMO"];
c1.CustomInParams = BaseAction.Symbol_AddCustomFilter + "=UFIDA::U9::Cust::HXPP::MO::WaterMarkMOBE::WaterMarkMO.DocNo in (select MO.DocNo from UFIDA::U9::MO::MO::MO as MO where https://www.doczj.com/doc/749415811.html,=UFIDA::U9::Cust::HXPP::MO::WaterMarkMOBE::https://www.doczj.com/doc/749415811.html, and MO.DocState in (2,3))";
用代码控制参数过滤(示例代码),Webpart,在OnLoadData_Extend中写代码
if (this.Model.cRef.CurrentFilter.Parameters[0] != null)
{
//此处.Parameters[0],也可用.Parameters["@ID"]代替
long curID = long.Parse(this.Model.cRef.CurrentFilter.Parameters[0].DataValue.ToString());
if (curID > 0)
{
string childID = FLDcsUI.Get.TreeChildID("CustUT_GC_ParameterConfig", "Parent", curID);
if (!string.IsNullOrEmpty(childID))
{
this.Model.cRef.CurrentFilter.OPath += " and UFIDA::U9::Cust::UT::GC::ParameterConfigBE::ParameterConfig.ID not in (" + childID + ")";
}
}
}
19.页面导航代码
(视频240)
卡片导航到列表,在相应的UI项目,Webpart,BtnList_Click_Extend
this.NavigatePage("UFIDA.U9.Cust.XM.HXPP.EX.SubjectListURI", null);
列表导航到卡片
新增,在相应的LIST Action,OnNew_Extend中加
this.CurrentPart.NavigatePage("UFIDA.U9.Cust.XM.HXPP.EX.SubjectURI", null);
双击行跳转,在相应的LIST Action,OnGridRowDbClick_Extend中加
UFIDA.U9.UI.PDHelper.NaviteParamter p = new NaviteParamter();
//是正拖的话,这里需用MainID
string dataid = this.CurrentModel.Subject.FocusedRecord["ID"].ToString();
if (!string.IsNullOrEmpty(dataid))
{
https://www.doczj.com/doc/749415811.html,Values.Add("PDPageStatus", "browser");
https://www.doczj.com/doc/749415811.html,Values.Add("ID", dataid);
UFIDA.U9.UI.PDHelper.NavigateManager.NavigatePage(this.CurrentPart,
"UFIDA.U9.Cust.XM.HXPP.EX.SubjectURI", p);
}
列表过滤当前组织数据,在相应的LIST Action,CustomFilterOpath_Extend中加
if (string.IsNullOrEmpty(filterOpath))
{ filterOpath = string.Format("Org={0}", https://www.doczj.com/doc/749415811.html,ID);
}
else
{ filterOpath += string.Format(" and Org={0}", https://www.doczj.com/doc/749415811.html,ID);
}
20.单据开发需求
费用明细单行(FeeDetailLine)
(视频250)
单据类型基类、单据基类,在发布对象浏览器的UBF的BaseBE内,DocTypeBE
(固定)编译出错:
错误 4 “UFIDA.U9.Cust.XM.HXPP.EX.FeeDetailBE.FeeDetail”不会实现继承的抽象成员“UFIDA.U9.Base.Doc.Doc.DocType.get”D:\UFIDA\VSProject\Training\EXBE\Entity\FeeDetailBE\FeeDetail.cs 14 24
UFIDA.U9.Cust.XM.HXPP.EXBE
需要在BE代码对应单据(FeeDetail)的Extend中,增加以下代码
//重载DocType.get
public override UFIDA.U9.Base.Doc.DocType DocType
{
get { return this.FDDocType; }
}
//费用明细单单据类型,费用明细单,实体对应Extend,OnSetDefaultValue中赋组织默认值
赋默认值代码
21.费用明细单单据类型UI开发
(视频260)
编号规则(又叫编码方案)的参照,在发布对象浏览器的UI的UFIDA.U9.CBO.Ref.BaseReferenceUI.MetaData中
编号规则(又叫单据编码规则)的Form引用,在发布对象浏览器的UI的UFIDA.U9.Base.Sequence.SequenceUI.WebPart 费用明细单单据类型查找对应的参照开发
常用代码
查找代码
发布组件、发布页面、发布菜单
22.费用明细单单据类型列表对应开发
(视频270)
页面导航代码
发布页面
23.EX模块的参照开发(EXUIREF)
(视频280)
费用明细单单据类型参照
科目的参照
发布组件
24.费用明细单UI开发
(视频290)
费用明细单查找对应的参照开发
发布组件、发布页面、发布菜单
加代码
(视频300)
常用代码
//默认当前日期,单据UI>>Model>> AfterInitModel
this.FeeDetail.FieldBusinessDate.DefaultValue = DateTime.Now;
//Grid上的扩展字段处理
FlexFieldHelper.SetDescFlexField(this.DataGrid5, this.DataGrid5.Columns.Count - 1, "DescFlexField");
//行号设置
//引用UFIDA.U9.Base.BaseBP.Agent.dll,UFIDA.U9.Base.BaseBP.Deploy.dll
UFIDA.U9.Base.Profile.Proxy.GetProfileValueProxy p1 = new UFIDA.U9.Base.Profile.Proxy.GetProfileValueProxy(); int sequenceStart1 = 10;
UFSoft.UBF.UI.ControlModel.IAutoRowNo r1;
p1.ProfileCode = "SysLineNo";
p1.ProfileOrg = long.Parse(https://www.doczj.com/doc/749415811.html,ID);
UFIDA.U9.Base.Profile.PVDTOData data1 = p1.Do();
if (data1 != null && !string.IsNullOrEmpty(data1.ProfileValue))
{ int.TryParse(data1.ProfileValue, out sequenceStart1); }
r1 = ((UFSoft.UBF.UI.ControlModel.IAutoRowNo)this.DataGrid5.Columns["RowNo"]);
r1.Sequence = true;
r1.SequenceStart = sequenceStart1;
r1.SequenceStep = r1.SequenceStart;
查找代码
25.费用明细单列表对应开发
(视频310)
页面导航代码
发布页面
26.费用明细单中单据类型、及科目的Form引用实现
(视频320)
弹出Form,取消按钮关闭窗口代码
this.CloseDialog(false);
27.BP开发
BP开发,假定需求:费用明细单,增加加载按钮,按传入条件自动加载行。
(视频330)
传入:组织ID,长整型;科目类型,整型
返回:List
需要引用:UFIDA.U9.Cust.XM.HXPP.EXBE.Dll
28.BE,UI,BP,SV引用规则
后期UI启用新事件,(由于Extend代码不会再覆盖)需手动在Extend中加事件代码,可参考原有的事件写,如private void BtnClose_Click_Extend(object sender, EventArgs e)
{
BtnClose_Click_DefaultImpl(sender, e);
}
29.BP部份关键代码
BP代码
//实体查找,写法1
StringBuilder sb1=new StringBuilder (256);
sb1.Append ("Org=@org1");
sb1.Append (" and SubjectType=@subjecttype1");
sb1.Append (" and Effective.IsEffective=1");
sb1.Append (" and '" + Context.LoginDateTime +"' between Effective.EffectiveDate and Effective.DisableDate");
Subject.EntityList el1 = Subject.Finder.FindAll(sb1.ToString(),new OqlParam [2]{new OqlParam (https://www.doczj.com/doc/749415811.html,ID ),new OqlParam (bpObj.SubjectTypeValue)});
UI代码
写获取行号的方法
//增加行前,先清除旧行
this.Model.FeeDetail_FeeDetailLine.Clear();
//增加新行
FeeDetail_FeeDetailLineRecord r1 = this.Model.FeeDetail_FeeDetailLine.AddNewUIRecord();
//绑定父行
r1.SetParentRecord(this.Model.FeeDetail.FocusedRecord);
30.调试
代码调试(U9V2.5使用VS2005调试,需按以下修改)
1、修改U9应用程序池(运行inetmgr),将.Net Framework版本改为2.0
2、Portal下,原web.config改名为>>web.config.bak(备份),https://www.doczj.com/doc/749415811.html,35改为>>web.config
(如按以上修改后,Portal无法正常打开,则还原上面的修改,安装VS2010 Ultimate,将要调试的类文件,拖入vs2010,同样是附加到进程进行调试)
调试方法
将代码附加(快捷键Ctrl+Alt+P)到w3wp(勾选显示所有会话中的进程)进程,设置断点,即可进行调试。
异常控制(Ctrl+Alt+E):用于无法定位错误位置的代码调试。
快速监视(Ctrl+D、Q):查看变量值。
31.UI布局设计
通过对容器的网格行、列集合属性的设定,以及摆放各类控件,进行UI布局设计。
容器类控件均有“容器布局”属性,容器布局属性主要由上边距、下边距、左边距、右边距、行间距、网格列集合、网格行集合属性组成,UIForm,Card(卡片控件)均为容器。
容器布局
容器内分布网格(网格列集合,网格行集合组成),网格存放各控件,Card的网格有类型value,spacing,title;
如上卡片控件(Card),网格列集合数为7,网格行集合数为8,灰色为行间距。
可以看布局列信息上面的末列数值,对快速布局很有帮助,末列数值指示出最后一列的宽度,如下:
多用界面控件树查看层次关系,有助于提升视觉理解。
练习画以下UIForm样式:
(视频340)
32.建立主账簿(使标准产品不要进入即报错)
(视频350)
33.插件开发
包括有UI插件、BE插件、BP插件,而其中的BP插件较少应用,可按需查阅用友开发资料。
命名规范依据项目而定,最重要是统一,参考如下:
UI插件命名空间、程序集名称、项目名称:UFIDA.U9.Cust.地区.客户. UIPlugIn
插件类命名:单据简称+UIPlugInExtend
BE插件命名空间、程序集名称、项目名称:UFIDA.U9.Cust.地区.客户.BEPlugIn
插件类命名:单据简称+[插件位置(Update、Insert……)可略,可通过Event判断]+BEPlugInExtend
34.UI插件开发
(视频360)
假定需求:在采购管理>>标准采购的下方操作功能区,增加“科目”按钮,弹出“科目”窗口,同时将标准采购的单据类型名称,传给“科目”的备注,参考图:
35.UI插件开发过程关键点
手动新建类库项目(使生成代码命名风格与U9生成的代码保持一致);
//必须引用的dll
//UFSoft.UBF.UI.IView.dll (bin,applicationserver\bin)
//UFSoft.UBF.UI.FormProcess.dll (ubflib,applicationserver\bin)
//页面扩展按钮必须引用的dll
//UFSoft.UBF.UI.Engine.Runtime.dll (bin,applicationserver\bin)
//UFSoft.UBF.UI.WebControls.BaseComponent.dll (bin,applicationserver\bin)
//.NET的System.Web
//UFSoft.UBF.UI.Controls.Interface.dll (bin,applicationserver\bin)
//UFSoft.UBF.UI.MD.Runtime.dll (ubflib,applicationserver\bin)
//......
UI插件可扩展的事件(常用的)
初始化后,创建控件树,创建关联控件
AfterInit(UFSoft.UBF.UI.IView.IPart part, EventArgs args)
Form加载后
AfterLoad(UFSoft.UBF.UI.IView.IPart Part, EventArgs args)
......
扩展类示例代码(参考代码)
public class ExtendUIProcess : UFSoft.UBF.UI.Custom.ExtendedPartBase
{
//后面事件需要通过IPart取值
private UFSoft.UBF.UI.IView.IPart _part;
///
/// 重写初始化后事件,创建控件树,创建关联控件
///
///
///
public override void AfterInit(UFSoft.UBF.UI.IView.IPart part, EventArgs args)
{
//首先调用原来的事件
base.AfterInit(part, args);
//校验有效
if (part == null || part.Model == null)
{return;}
_part = part;
//页面扩展-加按钮
#region 页面扩展-加按钮
//实例化按钮
IUFButton btnShowSubject = new UFWebButtonAdapter();
btnShowSubject.Text = "科目";
btnShowSubject.ID = "BtnShowSubject";
btnShowSubject.AutoPostBack = true;
//加入Card容器
IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, "Card0");
card.Controls.Add(btnShowSubject);
https://www.doczj.com/doc/749415811.html,yout(card,btnShowSubject, 18, 0);
//设置按钮事件
btnShowSubject.Click += new EventHandler(btnShowSubject_Click);
#endregion
}
}
//按钮事件
void btnShowSubject_Click(object sender, EventArgs e)
{
//写业务逻辑代码
//......
}
//集团人员写的类,可复制使用
public class CommonFunction
{
///
/// 设置控件在卡片容器中的布局
///
/// 卡片容器
/// 增加的控件
/// 布局横坐标
/// 布局纵坐标
public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y)
{
Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(0), Unit.Pixel(0), true);
}
///
/// 设置控件在卡片容器中的布局
///
/// 卡片容器
/// 增加的控件
/// 布局横坐标
/// 布局纵坐标
/// 控件宽
/// 控件高
public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y, int width, int height)
{
Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(width), Unit.Pixel(height), false);
}
///
/// 设置控件在卡片容器中的布局
///
/// 卡片容器
/// 增加的控件
/// 布局横坐标
/// 布局纵坐标
/// 单元格横向跨度
/// 单元格纵向跨度
/// 控件宽
/// 控件高
/// 是否自适应大小
public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y, int xspan, int yspan,
Unit width, Unit height, bool isAutoSize)
{
IGridLayout gl = https://www.doczj.com/doc/749415811.html,yout as IGridLayout;
if (gl == null) return;
GridLayoutInfo glInfo = new GridLayoutInfo((uint)x, (uint)y, (uint)xspan, (uint)yspan, width, height);
glInfo.AutoSize = isAutoSize;
gl.Controls.Add((Control)ctrl, glInfo);
}
}
36.UI插件部署
UI插件配置文件说明(部署UI插件,先看看效果)
复制Portal\ WebPartExtend_Vendor1.config文件,进行修改>>WebPartExtend_Cust_XM_HXPP_(标准模块).config 文件 extendedPartAssemblyName="UFIDA.U9.Cust.MO.UIPlugIn.dll">
(相应修改以下内容)
parentPartFullName 要扩展的原Form全名
extendedPartFullName 插件类全名
extendedPartAssemblyName 插件程序集名
如何查要扩展的原Form全名
UI插件部署位置
UI插件dll部署到portal\uilib(可自行编写autobuild.bat)
WebPartExtend_XXX.config 部署到portal
37.按钮事件代码参考
//将插件中的FocusedReocrd转成强类型,以方便取值,具体Record所在的View,可使用监视查看
//引用UFIDA.U9.SCM.PM.PurchaseOrderUI.WebPart.dll
UFIDA.U9.PM.PurchaseOrderUIModel.PurchaseOrderRecord r1 = (UFIDA.U9.PM.PurchaseOrderUIModel.PurchaseOrderRecord)_part.Model.Views[0].FocusedRecord;
https://www.doczj.com/doc/749415811.html,ValueCollection p1 = new https://www.doczj.com/doc/749415811.html,ValueCollection();
p1.Add("PODocTypeName",r1.DocumentType_Name);
//弹出科目窗口,cd989ec3-fe4e-4943-8e4c-a2f91a5d1bab为FormID,可打开源代码查看,也可通过sql语句查看
//p1为NameValueCollection,页面传参用
_part.ShowModalDialog("cd989ec3-fe4e-4943-8e4c-a2f91a5d1bab", "科目", "992", "504", _part.TaskId.ToString(), p1,false);
//科目页面,接受参数值处理
public void BeforeUIModelBinding()
{
if (this.Model.Subject.FocusedRecord == null)
{ this.Model.Subject.FocusedRecord = this.Model.Subject.AddNewUIRecord(); }
if (NameValues != null && NameValues["PODocTypeName"] != null)
{
this.Model.Subject.FocusedRecord.Memo = NameValues["PODocTypeName"].ToString();
}
}
38.UI插件常用代码(示例代码)
//取得插件页面上的按钮控件
UFSoft.UBF.UI.ControlModel.IUFButton btnSetup = (IUFButton)_part.GetUFControlByName(this._part.TopLevelContainer, "BtnSetup");
//注册按钮事件
btnSetup.Click += new EventHandler(btnSetup_Click);
//编写按钮事件动作代码
void btnSetup_Click(object sender, EventArgs e)
{}
//NameValue页面传值
//传送