代码之家  ›  专栏  ›  技术社区  ›  Thomas Adrian

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

  •  0
  • Thomas Adrian  · 技术社区  · 7 年前

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

    组合框的类型是“string”(没有转换器),但如果我使用转换器将其更改为“decimal”,这似乎无关紧要。

    逗号在瑞典是十进制分隔符

    我使用@dbLookup获取关键字值

    像这样的。 @DbLookup(db,“vwLookupCat”,“BONUS”,“KeyWord”)

    当我保存文档时,关键字document中的值将按原样保存为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,“vwLookupCat”,“BONUS”,“KeyWord”))

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

    提前感谢

    托马斯

    Seem to be a similar question here without solution

    1 回复  |  直到 7 年前
        1
  •  1
  •   shillem    7 年前

    我可以想出两种方法,这两种方法都需要你使用bean,希望你已经熟悉了这个概念。

    概念上的正义

    转换器保持在原来的位置。毕竟你想处理一个数字,你是在保存一个数字。转换器指示框架将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提供的完全违反直觉的转换器。因为你不知道选择“数字”在内部做什么,它是否会是 Integer Double BigDecimal 等你被更多的不确定性所困扰,而不是确定性。我有自己的数字转换器,但由于我知道IBM one的工作原理,我认为您可以通过为转换器指定一个额外的参数来解决问题。

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

    我知道,我知道, integerOnly 使您认为它会将值转换为 整数 . 它不会,它会转化为 双重的 . 你真幸运!假设您需要一个整数!

    概念上的垃圾

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