X++:突出显示代码中网格中的所有记录(包括未加载的记录)

X++: Highlighting all records in a grid from a code (including not loaded ones)

我无法完成这个看似简单的任务。我有一个名为 PrintAll 的自定义 CheckBox,我想要的是一旦它得到 selected,网格中的所有行都会得到 selected/highlighted。这是我尝试过的:

选项 1: 通过 CTRL+SHIFT+END。下面的示例通过 CTRL+A 组合。

public boolean modified()
{
    boolean ret;

    ret = super();
    #task

    if(PrintAll.value())
    {
        // CTRL+A
        element.task(#taskSelectAll);
    }

    return ret;
}

结果: selects 只加载了记录,所以说 500 条中的 20 条。如果向下滚动,它保持 selecting 即将到来的。

CTRL+SHIFT+END 组合在 UI 中有效,尽管它给出了这个 Box::yesNo:

You cannot select all lines including the last one, as not all the lines have been loaded at the present time. Loading all the lines may take some time!

Do you want to continue selecting lines and to load all lines now?

当我测试 taskid CTRL+SHIFT+END 得到的结果时,它似乎得到 2842,不幸的是在代码中使用此 ID,因为 element.task(2842); 仅突出显示第一条记录。

因此,如果我可以正确地提交 CTRL+SHIFT+END 而不是 CTRL+A,问题就会得到解决。

编辑: (部分解决方案) 运行 element.task(2842); 两次让我看到上面的警告,所以我可以单击是和 select 所有行。有谁知道我怎么能绕过这个警告?

选项 2: 尝试表单和数据源的各种属性,使其加载所有可用记录,而不是前 20 条记录。

结果:没有任何效果。

选项 3: 也许是 CheckBox,它可以在某些表单上作为第一个字段找到,一旦 selected,selects所有记录,都可以做同样的事情,但我找不到如何将其添加到我的自定义表单中?虽然也许这个选项 select 也只加载记录,所以它不会对我现在拥有的产生影响。

这就是最终对我有用的方法 (source)。请注意,InventDim 不是我在此表单中的主要数据源。 InventTransOrigin 是一个,但它没有用。

所以我想,如果您不想向最终用户显示任何警告,您可以使用此方法:

public boolean modified()
{
    InventDim    inventDimTMP;

    boolean ret;

    ret = super();

    if(PrintAll.value())
    {
        inventDimTMP = InventDim_DS.getFirst();

        while(inventDimTMP)
        {
            InventDim_DS.findRecord(inventDimTMP);
            InventDim_DS.mark(true);
            inventDimTMP = InventDim_DS.getNext();
        }
    }

    return ret;
}

或者如果您希望他们看到上述警告,请执行以下操作:

public boolean modified()
{
    boolean ret;

    ret = super();

    if(PrintAll.value())
    {
        // Marks first record
        element.task(2842);
        // Marks all records
        element.task(2842);
    }

    return ret;
}