将名称选择器中的结果放入只读控件中

时间:2013-02-14 16:22:59

标签: xpages xpages-extlib

我在XPages中使用扩展库中的名称选择器,我将结果放入多行编辑框中。

如何使编辑框为只读,以便最终用户无法编辑所选名称,除非使用名称选择器?

我尝试设置只读属性,但也隐藏了控件。

我还尝试将结果放入隐藏字段,然后使用换行符作为分隔符在计算字段中显示结果,但是使目标控件不可见也会使控件不可见。

5 个答案:

答案 0 :(得分:4)

您可以将namePicker与扩展库中的djextNameTextBox控件结合使用。此控件仅允许用户删除名称(而不是编辑它)。

<xe:djextNameTextBox id="testField" value="#{document.TestField}"></xe:djextNameTextBox>
<xe:namePicker id="namePicker1" for="testField" dialogTitle="Pick a name">
    <xe:this.dataProvider>
        <xe:dominoNABNamePicker addressBookSel="all-public" nameList="people"></xe:dominoNABNamePicker>
    </xe:this.dataProvider>
</xe:namePicker>

我理解你是否想要使用编辑框而不是djextNameTextBox,因为它的外观。如果是这种情况,那么一些自定义CSS可能对您有所帮助: - )

答案 1 :(得分:2)

使用maxlength属性。这将阻止人们直接输入该字段

<xp:inputText id="inputText1"
value="#{viewScope.adminOwner_Tx}" maxlength="0"
style="width:300px">
</xp:inputText>

答案 2 :(得分:1)

我使用隐藏字段<xp:hidden>和计算字段来解决方法。我在我的博客http://naveegator.blogspot.com/2012/06/displaying-common-names-of-user-with.html上对此进行了描述。

以下是代码段:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xe:namePicker id="npUserNames" for="hdnUserNames">
        <xe:this.dataProvider>
            <xe:dominoNABNamePicker addressBookDb="names.nsf"></xe:dominoNABNamePicker>
        </xe:this.dataProvider>
    </xe:namePicker>
    <xp:inputHidden id="hdnUserNames" multipleTrim="true">
        <xp:this.multipleSeparator><![CDATA[#{javascript:","}]]></xp:this.multipleSeparator>
        <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="cfUserNames"></xp:eventHandler>
    </xp:inputHidden>
    <xp:text escape="true" id="cfUserNames">
        <xp:this.value><![CDATA[#{javascript:@Name("[CN]", getComponent("hdnUserNames").getValue())}]]></xp:this.value>
    </xp:text>
</xp:view>

您还可以在这个问题“ReadOnly field in Xpage not submitted”中查看Sven关于如何制作只读字段的答案。

答案 3 :(得分:1)

感谢您的回复。我在这里和XPages Lotus论坛中使用了一些响应。

  1. 我创建了dojo Names PIcker并将其指向名为Approvers的文本控件,并在Approvers Control中将MultipleSeparator设置为“,”
  2. 添加一个名为ApproversDisplay的多行文本框,将其设置为只读,不要将其绑定到数据对象,默认值为

    var Rel = getComponent('Approvers').getValue();
    return @Implode(Rel,"\n")
    

    用新行分隔每个值。

  3. 在Approvers控件上设置onchange事件,以在ApproverDisplay上执行部分刷新。
  4. 在源代码中我设置了样式属性display:none,这不会隐藏名称选择器,就像visible属性一样。
  5. 我对XPages很陌生,所以有些人可能会认为有更好的方法,但是比我真正想要的更多时间!它可以工作!

答案 4 :(得分:1)

我倾向于使用的这些案例的解决方法,类似于Bill F&amp; Naveen(但也许更清理一下):
将您的选择器目标字段包含在div中,并通过将“display:none”应用为样式来隐藏它。这样,它在页面上呈现,使其可访问,但不可见 为了显示选择器对此字段所做的任何更改,我添加了一个onchange事件,刷新了一个包含计算字段的面板。此外,您可以根据需要设置计算字段中名称的显示样式(代码中的两个示例)。

<xp:div style="display:none;">
    <xp:inputText id="yourfield" value="#{yourdocument.yourfield}" multipleSeparator=";">
        <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="surroundingpanel"></xp:eventHandler>
    </xp:inputText>
</xp:div>

<xp:panel id="surroundingpanel">

    <!-- displaying names abbreviated, separated by default multi-separator , -->
    <xp:text escape="true" id="computedFieldExample1" value="#{yourdocument.yourfield}">
        <xp:this.converter> <!-- converter is optional -->
            <xp:customConverter>
                <xp:this.getAsString><![CDATA[#{javascript:@Name("[ABBREVIATE]", value)}]]></xp:this.getAsString>
                <xp:this.getAsObject><![CDATA[#{javascript:@Name("[CANONICALIZE]", value)}]]></xp:this.getAsObject>
            </xp:customConverter>
        </xp:this.converter>
    </xp:text>

    <!-- displaying names abbreviated one below each other -->
    <xp:text escape="false" id="computedFieldExample2">
        <xp:this.value><![CDATA[#{javascript:@Implode(@Name("[ABBREVIATE]", yourdocument.getItemValue("yourfield")), "<br />")}]]></xp:this.value>
    </xp:text>

    <xe:namePicker id="namepicker1" for="yourfield">
        <xe:this.dataProvider>
            <xe:dominoNABNamePicker nameList="peopleByLastName"></xe:dominoNABNamePicker>
        </xe:this.dataProvider>
    </xe:namePicker>
</xp:panel>