子表前端常用方法:
方法 | 作用 |
---|---|
AddRow | 添加子表行数据 |
UpdataRow | 更新子表行数据 |
ClearRows | 清空子表行 |
GetCellManager | 获取子表的控件 |
this.D000001AccountList.ClearRows();//删除子表行,D000001AccountList为子表编码
//添加子表行
var subObjectId = $.IGuid(); //创建行ID
this.D000001AccountList.AddRow( subObjectId, {
"D000001AccountList.F0000001": "赋值1",
"D000001AccountList.F0000002": "赋值2",
"D000001AccountList.F0000003": "赋值3"
})
//更新(修改)子表数据
var currentRowId =this.F67c89495df154ab69ede62c1b61a0658.GetValue()[x].
ObjectId; //获取第x行子表ID,其中F67c89495df154ab69ede62c1b61a0658是子表ID this.F67c89495df154ab69ede62c1b61a0658.UpdateRow( currentRowId, {
"F67c89495df154ab69ede62c1b61a0658.jyjg": "赋值",
"F67c89495df154ab69ede62c1b61a0658.dqgys": "赋值",
"F67c89495df154ab69ede62c1b61a0658.cpmc": "赋值"
});
//循环遍历子表更新数据
var zibiao =this.F67c89495df154ab69ede62c1b61a0658.GetValue();
for(var i=0;i<zibiao.length;i++)
{
var currentRow=ziaobiao.[i].ObjectId;
this. F67c89495df154ab69ede62c1b61a0658.UpdataRow{
"F67c89495df154ab69ede62c1b61a0658.jyjg": "赋值",
});
}
子表和主表的控件其实都是BizObject,区别只在于子表的控件会一个父表ID:parentobjectid
在绑定change事件时不能绑定子表的某一行数据,而是要绑定这个子表对象
主表绑定时:
this.F0000001.BindChange('key',function(){
alert)("主表绑定事件");
})
子表绑定时
//子表绑定事件只能绑定子表对象,不能绑定子表某一具体控件,想让某控件绑定事件,需要在function中增加回调参数res,判断具体的某一个数据 是否触发事件,
var parent=this;//因为BindChange是一个回调函数,在其内部使用this是function的this,而不是子表的this,因此要先把子表的this保存一下
this.F67c89495df154ab69ede62c1b61a0658.BindChange('key',function(res){
if(res[0].DataField=="F67c89495df154ab69ede62c1b61a0658.F000002"){//DataField是获取控件对象
alert(“子表控件绑定事件”);
ver objectid=res[0].ObjectId;//获取当前行数据的对象ID
//parent.F67c89495df154ab69ede62c1b61a0658.GetValue()[ 0 ].ObjectId;因为res就是BIndChange回调函数返回的子表对象,所以可以直接取到行数据,否则,可以GetValue获取行数据
var cellObj = parent.F67c89495df154ab69ede62c1b61a0658.GetCellManager( cellObj , "F67c89495df154ab69ede62c1b61a0658.F0000001" );//获取子表控件
cellObj.SetReadonly(true);//获取到控件后,就可以对控件进行各种操作了
}
//此时,代码整体实现的就是当子表控件F0000002数据改变,那么alert,同时子表控件F0000001变更为只读。
});
实践
出库时校验数据
可以直接在表单设置——表单校验中设置校验条件。当校验不通过时,错误信息会提示,
子表数据的重复检验
主表的重复校验只需要在控件属性的不允许重复录入打钩即可,但子表的控件属性是没这个选项的,因此只能代码实现
Using system.data;
//在后端代码的OnSubmit中添加如下代码
H3.DataModel.BizObject[] child =(H3.DataModel.BizObject[]) this.Request.BizObject["F67c89495df154ab69ede62c1b61a0658"];
foreach(H3.DataModel.BizObject item in child){
string repStr = string.Formet("select * from I_F67c89495df154ab69ede62c1b61a0658 where F0000001='{0}' ",item["F0000001"]+string.Empty)
DataTable repDt=this.Engine.Query.QueryTable(repStr,null);
if(repDt !=null&&repDt,Rows,Count>0){
response.Infos.Add("子表数据重复提交");
}
}
用业务规划向某一个目标的子表中添加数据
在一个任务发布中,每次添加任务日志。
创建一个表单:任务发布
主表文本:任务名称,任务发布人
子表文本:日志提交时间,提交人,
创建一个表单:日志提交
主表文本:日志内容,
主表其他内容:创建人,创建时间(这俩个是已有的控件),
关联表单:关联表单“任务发布”
即“任务发布”发布一个任务,然后“日志提交提交日志”,会把日志信息关联添加到任务发布的子表中去
在此,只介绍窗口界面的操作方式
在表单设置——业务规则——新建业务规则——选择表单生效时——切换到高级模式——
INSERT(选择任务发布的子表,子表的主表ID,关联表单,子表对象1,主表对象1,子表对象2,主表对象2…)
在次,任务发布的子表是目标表单,日志提交的表单是当前表单。