如何在组合框中显示选定的数值

How to display selected numeric values in a comboBox

我在 Notes 表单中有一个数字字段连接到 xpage 中的组合框。组合框中的值是十进制值列表,1,02、1,03 等,但它们作为文本存储在关键字文档中

组合框的类型为 "string"(无转换器),但如果我使用转换器将其更改为 "decimal" 似乎并不重要。

逗号在瑞典是小数点分隔符

我使用@dbLookup

获取关键字值

像这样。 @DbLookup(db,"vwLookupCat","BONUS","KeyWord")

当我保存文档时,关键字文档中的值按应有的方式保存为数字值。但是组合框不再显示正确的选定值(在编辑模式下)并且在我更改它时显示验证错误,因为该值现在是数字而不是组合框关键字值中的文本。 或者因为该字段最初是一个文本字段,但在保存时它是一个数字字段。

<xp:comboBox id="comboBox7" value="#{doc.bonus}">
                    <xp:this.converter>
                        <xp:convertNumber type="number"></xp:convertNumber>
                    </xp:this.converter>
                    <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="tbl"></xp:eventHandler>
                    <xp:selectItem itemLabel="Välj Bonus" itemValue="0"></xp:selectItem>
                    <xp:selectItems>
                        <xp:this.value><![CDATA[#{javascript:@DbLookup(db,"vwLookupCat","BONUS","KeyWord")}]]></xp:this.value>
                    </xp:selectItems>
                </xp:comboBox>

我该如何解决这个问题?

提前致谢

托马斯

我可以想到 2 种方法,这两种方法都需要您使用 beans,希望您应该已经熟悉这个概念。

概念上的正义

转换器保持原样。毕竟你要处理一个数字,你是在保存一个数字。转换器指示框架将返回的字符串值从 POST 转换为数字,这就是您想要的,因为与组件绑定的目标字段也被保存为数字。

问题是将此类值与用于填充选项的值列表相匹配。为什么?这些值不是数字。

解决方案是自定义构建选项,而不是让框架根据 dblookup 返回的字符串值数组自动装箱。

写 ssjs+formula 很痛苦,但是调用应该是这样的:

<xp:selectItems
    value="${javascript:myBeanName.getSelectItems(@DbLookup(db,"vwLookupCat","BONUS","KeyWord"))}">
</xp:selectItems>

bean方法:

public List<SelectItem> getSelectItems(String[] values) {
    List<SelectItem> options = new ArrayList<SelectItem>();

    for (String value : values) {
        options.add(new SelectItem(Double.valueOf(value), value));
    }

    return options;
}

通过这样做,您正在创建具有可比值的选项。

剩下的唯一问题是 IBM 提供的完全违反直觉的转换器。因为你不知道选择 'number' 在内部做了什么,它是否会是 IntegerDoubleBigDecimal 等等......你被更多的东西困住了不确定性大于确定性。我有自己的数字转换器,但因为我知道 IBM 的工作原理,所以我认为您可以通过为转换器指定一个额外的参数来解决这个问题。

    <xp:this.converter>
        <xp:convertNumber type="number" integerOnly="true" />
    </xp:this.converter>

我知道,我知道,integerOnly 让你认为它会将值转换为 Integer。它没有,它转换为 Double。幸运的你!假设您需要一个整数!

概念蹩脚

另一种方法是将组合框绑定到视图范围变量。 您将在页面加载时使用字符串转换后的文档值初始化变量,然后使用它。在保存时,您将读取视图范围变量,将其转换回数字并在保存之前将数字推送到文档字段。