父子表的小练习(三)——多选

有时,我们需要一次性选中多行。这里提供了三种多选的方式:按钮、类、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的全局变量中定义。好的,这样就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值