如何在组合框

时间:2018-02-20 08:56:38

标签: validation combobox xpages numeric

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

组合框的类型为" string" (没有转换器)但是如果我把它改成"十进制"它似乎并不重要。使用转换器。

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

我使用@dbLookup

获取关键字值 像这样的事情。 @DbLookup(分贝," vwLookupCat""奖金""关键字&#34)

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

enter image description here

enter image description here

enter image description here

<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>
  • 请注意,我没有在组合框上使用任何验证器
  • 我无法将关键字字段类型更改为数字,因为这会在许多其他地方使用
  • 如果没有帮助使用@Text(@Text(@DbLookup(db,&#34; vwLookupCat&#34;,&#34; BONUS&#34;,&#34; KeyWord&#34;) ))

我应该如何解决这个问题?

提前致谢

托马斯

Seem to be a similar question here without solution

1 个答案:

答案 0 :(得分:1)

我可以想到两种方法可以解决它,这两种方法都需要你使用豆子,希望你应该已经熟悉这个概念。

概念上正直

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

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

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

编写ssjs +公式让我感到痛苦,但调用应该是这样的:

<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提供的完全违反直觉的转换器。因为你不知道选择&#39;数字&#39;在内部,无论是IntegerDouble还是BigDecimal等等,您都会遇到比确定性更多的不确定性。我有自己的数字转换器但是因为我知道IBM的工作原理,我认为你可以通过为转换器指定一个额外的参数来解决问题。

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

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

概念上很糟糕

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