【问题标题】:Placing results from Name Picker into a read only control将 Name Picker 的结果放入只读控件
【发布时间】:2013-02-14 16:22:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: xpages xpages-extlib


    【解决方案1】:

    您可以将 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 可能会对您有所帮助 :-)

    【讨论】:

    • 我和比尔有同样的问题。感谢您的提示 - 但不幸的是,名称选择器对话框在单击“确定”后没有关闭。我发现,名称选择器的行为取决于给定的目标来显示所选名称。有什么想法吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我使用隐藏字段&lt;xp:hidden&gt; 和计算字段的解决方法。我在我的博客http://naveegator.blogspot.com/2012/06/displaying-common-names-of-user-with.html 上描述了这一点。

      下面是sn-p的代码:

      <?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>
      

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

      【讨论】:

        【解决方案4】:

        感谢您的回复。我在这里和 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 属性那样隐藏名称选择器。

        我对 XPages 还很陌生,所以有些人可能会认为有更好的方法,但经过几个小时后,我真的不想数了!它有效!

        【讨论】:

          【解决方案5】:

          我倾向于使用的这些情况的解决方法,类似于 Bill F 和 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>
          

          【讨论】:

            猜你喜欢
            • 2023-02-08
            • 1970-01-01
            • 2016-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多