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

xpages:如何使编辑框为只读并且仍然具有会话范围变量?,xpages,Xpages,我有一个包含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}">

我有一个包含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>
//第一个编辑框:获取用户名,将其设置为默认值,这样用户就不需要键入自己的姓名
//第二个编辑框:在编辑框1中获取用户名后,在此编辑框中检索用户的部门
//第三个编辑框:以YYYYMM格式获取开始搜索日期,用户只能键入数字
=48&&event.keyCode
/xp:参数>
//第四编辑框:以YYYYMM格式获取endsearch日期,用户只能键入数字
=48&&event.keyCode
/xp:参数>
//调用另一个页面以导出excel的按钮
我运行代码,它运行良好。然而,以下是我想问的问题。在第一个和第二个编辑框中,如果我将这些编辑框设置为只读。它似乎丢失了会话范围变量,我运行了代码,excel只包含默认的头

我发现这篇文章与我的案例非常相似,因此我将编辑框设置为“可编辑”,并尝试从文章中应用以下代码:

//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>
//用于第1个编辑框
//用于第二个编辑框
编辑框仍可编辑,excel无法正常工作(仅显示默认标题)

那么,如何使编辑框为只读,并且仍然具有会话范围变量呢

谢谢你的建议。多谢各位

参考:


您可以计算两个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}" />

我在9.01 FP6上遇到了这个问题 最好的解决方案是将输入放在xp:panel中,然后使用panel上的readonly属性将其中的字段设置为只读。
这很好,并且易于实现

,所以前两个编辑框应该只显示sessionScope变量的值?用户不应该更改这两个sessionScope变量?然后设置sessionScope变量的值,例如beforeRenderResponse事件,而不是HeadHello@PerHenrikLausten,谢谢您的回复。“用户不应更改两个sessionScope变量?”,是的,这是真的,我查看了程序的用户需求、用户登录到该xpage时的请求、用户名和部门应自动显示。“前两个编辑框应仅显示sessionScope变量的值?”,这是因为如果我不使用sessionScope变量,我无法在excel中导出数据,并且我不知道是否有更好的方法来实现此目标。很抱歉,我不确定如何正确使用beforeRenderResponse事件。在那里我放置了
sessionScope.Officer&sessionScope.Department
,编辑框仍然是可编辑的。我添加了一个答案,希望能对您有所帮助。哦,我明白了,我需要两个计算字段才能做到这一点。这对我帮助很大,我接受了你的回答。非常感谢你。