有时,我们需要一次性选中多行。这里提供了三种多选的方式:按钮、类、edit。
第一种,最简单的通过按钮实现。
在窗体中添加一个button控件,并且重写clicked()方法。原理很简单,挨个检查数据源的记录,把被选中的找出来。
void clicked()
{
FormDataSource formDataSource;
VYA_CaseListTable1 caseListTableButtonClick;
;
super();
formDataSource = VYA_CaseListTable1_ds;
for (caseListTableButtonClick = formDataSource.getFirst(true) ? formDataSource.getFirst(true) : VYA_CaseListTable1; //鼠标当前行?
caseListTableButtonClick;
caseListTableButtonClick = formDataSource.getNext()
)
{
info(strFmt("%1",caseListTableButtonClick.CaseNum));
}
}
第二种,写一个实现多选功能的类,然后把类做成菜单拖进design里。
类声明:
class MoreSelectByClass extends RunBaseBatch
{
FormDataSource formDataSource;
}
formDataSource实例化:
public FormDataSource prmFormDataSource (FormDataSource _formDataSource = formDataSource)
{
;
formDataSource = _formDataSource;
return formDataSource;
}
逻辑方法:
private void moreSelect()
{
VYA_CaseListTable1 caseListTable1;
;
for (caseListTable1 = formDataSource.getFirst(true) ? formDataSource.getFirst(true) : formDataSource.cursor(); //鼠标当前行?
caseListTable1;
caseListTable1 = formDataSource.getNext()
)
{
info(strFmt("%1",caseListTable1.CaseNum));
}
}
main:
public server static void main(Args _args)
{
MoreSelectByClass moreSelect;
moreSelect = MoreSelectByClass::construct();
if (moreSelect.prompt())
{
moreSelect.prmFormDataSource(_args.record().dataSource());
moreSelect.run();
}
}
run:
public void run()
{
#OCCRetryCount
setPrefix(MoreSelectByClass::description());
/*
if (! this.validate())
{
throw error("@SYS18447");
}
*/
try
{
ttsbegin;
this.moreSelect();
ttscommit;
}
catch (Exception::UpdateConflict)
{
if (appl.ttsLevel() == 0)
{
if (xSession::currentRetryCount() >= #RetryNum)
{
throw Exception::UpdateConflictNotRecovered;
}
else
{
retry;
}
}
else
{
throw Exception::UpdateConflict;
}
}
}
第三种,edit实现。edit的原理是勾选添加一列选择列。每次勾选,都会把对应的记录RecId和记录放进一个Map里,点击按钮时只需要遍历这个Map即可。
首先,需要在窗体中添加一行可选择的列。在窗体的数据源中,写一个included()方法,再拖拽到Grid中:
edit NoYes included(boolean _set,
VYA_CaseListTable1 _caseListTable1,
NoYes _included)
{
return editClass.editMark(_set,_caseListTable1,_included);
}
接下来我们需要创建edit类和editMark()方法:
public NoYes editMark(
boolean _set, //用户是否选中
Common _common,//选中的那条记录
NoYes _mark //用户选的值是啥类型
)
{
NoYes click; //因为是单选,所以返回的是click
if (! mapMark)
this.initMapMark();
if (_set)
{
if (_mark)
{
mapMark.insert(_common.RecId,_common);
click = NoYes::Yes;
}
else
{
if (mapMark.exists(_common.RecId))
mapMark.remove(_common.RecId);
click = NoYes::No;
}
}
else
click = mapMark.exists(_common.RecId);
return click;
}
mapMark是一个Map,定义在edit类的全局变量里。所以edit类需要在窗体的全局变量中声明,并且在init方法中实例化。
initMapMark():
public void initMapMark(container _con = conNull())
{;
mapMark = (_con) ? Map::create(_con) : new Map(Types::Int64, Types::Record);
}
最后,创建一个button,重写clicked()方法:
void clicked()
{
super();
editClass.editSelect();
}
editSelect():
public void editSelect()
{
VYA_CaseListTable1 caseListTable1;
;
mapiterator = new MapIterator(mapMark);
while(mapiterator.more())
{
caseListTable1 = mapiterator.value();
info(strfmt("%1",caseListTable1.CaseNum));
mapiterator.next();
}
}
遍历器在类edit的全局变量中定义。好的,这样就完成了。