xpages:如何使编辑框只读并仍然具有会话范围变量?

问题描述 投票:1回答:2

我有一个包含4个编辑框和一个按钮的xpage,它们用于导出excel中的数据。我在这四个编辑框中使用会话范围,因为我已经存储了值以生成excel。

设计外观如下所示:

//1st edit box: get the user name, set it to default so the user does not need to type his/her name

<xp:inputText id="inputText1" value="#{sessionScope.User}">
    <xp:this.defaultValue><![CDATA[#{javascript: @Name("[CN]",@UserName())}]]></xp:this.defaultValue>
</xp:inputText>

//2nd edit box: after get the user name in edit box 1, retrieve the user's department in this edit box

<xp:inputText id="inputText2"value="#{sessionScope.Department}">
    <xp:this.defaultValue><![CDATA[#{javascript:@DbLookup(@DbName(),"UserView", (getComponent("inputText1").getValue()),2  )}]]></xp:this.defaultValue>
</xp:inputText>

//3rd edit box: get the start search date in YYYYMM format, user only can type numbers

<xp:inputText id="inputText3" value="#{sessionScope.startYYYYMM}">
<xp:eventHandler event="onkeypress" submit="false">
    <xp:this.script><![CDATA[if  (event.keyCode >= 48 && event.keyCode <= 57)
    {
       event.returnValue = true;
    }
    else
    {
      event.returnValue = false;
    }]]></xp:this.script>
        <xp:this.parameters>
            <xp:parameter name="message1" value="value">
            /xp:parameter>
        </xp:this.parameters>
</xp:eventHandler>
</xp:inputText>

//4th editbox: get the endsearch date in YYYYMM format, user only can type numbers

<xp:inputText id="inputText4" value="#{sessionScope.startYYYYMM}">
<xp:eventHandler event="onkeypress" submit="false">
    <xp:this.script><![CDATA[if  (event.keyCode >= 48 && event.keyCode <= 57)
    {
       event.returnValue = true;
    }
    else
    {
      event.returnValue = false;
    }]]></xp:this.script>
        <xp:this.parameters>
            <xp:parameter name="message1" value="value">
            /xp:parameter>
        </xp:this.parameters>
</xp:eventHandler>
</xp:inputText>

//a button to call another page to export the excel

<xp:button value="Export" id="button11">
<xp:eventHandler event="onclick" submit="true" immediate="false" save="false" refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:context.redirectToPage("ExportExcel.xsp");}]]></xp:this.action>
</xp:eventHandler>
</xp:button>

我运行代码,它工作正常。不过这是我想问的问题。在第一个和第二个编辑框中,如果我将这些编辑框设置为只读。它似乎丢失了会话范围变量,我运行代码,excel只包含默认标头。

我发现这篇文章ReadOnly field in Xpage not submitted与我的情况非常相似,所以我将编辑框设置为可编辑并尝试从帖子中应用此代码:

//for 1st editbox
<xp:scriptBlock id="scriptBlock1">
    <xp:this.value><![CDATA[function makeFieldReadOnly() {
document.getElementById("#{id:inputText1}").readOnly = true;  
}
window.onload = makeFieldReadOnly;]]></xp:this.value>
</xp:scriptBlock>

 //for 2nd edit box
 <xp:scriptBlock id="scriptBlock2">
    <xp:this.value><![CDATA[function makeFieldReadOnly() {
document.getElementById("#{id:inputText2}").readOnly = true;  
}
window.onload = makeFieldReadOnly;]]></xp:this.value>
</xp:scriptBlock>

编辑框仍然可编辑,excel无法正常工作(仅显示默认标题)。

那么如何将编辑框设置为只读且仍具有会话范围变量?

感谢您的建议。谢谢。

参考:

ReadOnly field in Xpage not submitted

export data from panel

xpages
2个回答
3
投票

您可以计算两个sessionScope变量的值,例如: beforeRenderResponse:

<xp:this.beforeRenderResponse><![CDATA[#{javascript:
    sessionScope.User = @Name("[CN]",@UserName());
    sessionScope.Department = @DbLookup(@DbName(),"UserView", (@Name("[CN]",@UserName()),2  )
}]]></xp:this.beforeRenderResponse>

然后,您可以在计算文本字段中显示sessionScope变量的值,而不是输入字段:

<xp:text escape="true" id="computedField1" value="#{sessionScope.User}" />
<xp:text escape="true" id="computedField2" value="#{sessionScope.Department}" />

0
投票

我有这个问题与9.01 FP6最好的解决方案是将输入放在一个xp:面板,然后使用面板上的readonly属性使其中的字段只读。这很好用,很容易实现

© www.soinside.com 2019 - 2024. All rights reserved.