2016-07-21 3 views
1

私は4つの編集ボックスとボタンを含むxpageを持っています。これらはExcelでデータをエクスポートするために使用されます。私は、これらの4つのエディットボックスでセッションスコープを使用します。これは、Excelを生成するために値を保存しているためです。xpages:編集ボックスを読み取り専用にする方法とセッションスコープ変数を使用する方法はありますか?

デザインの外観は、次のようになります。

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

私は、コードを実行し、それが正常に動作します。しかしここに私が尋ねたいことがあります。最初と2番目の編集ボックスで、これらの編集ボックスを[読み取り専用]に設定するとします。それはセッションのスコープ変数を失うようだと私はコードを実行し、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> 

編集ボックスはまだ編集可能とExcelがある:私はこの記事ReadOnly field in Xpage not submittedが私の場合と非常によく似ているので、私が編集可能にエディットボックスを設定し、ポストからこのコードを適用しよう見つける

正しく動作しません(デフォルトヘッダーのみを表示します)。

私はどのように編集ボックスを読み取り専用にしても、セッションスコープ変数を持つことができますか?

お気軽にご相談ください。ありがとうございました。

参考:あなたは、例えばであなたの2つのsessionScopeと変数の値を計算することができます

ReadOnly field in Xpage not submitted

export data from panel

+1

最初の2つの編集ボックスは、sessionScope変数の値のみを表示する必要がありますか? 2つのsessionScope変数をユーザーが変更しないでください。次に、sessionScope変数の値を例えばに設定します。 beforeRenderResponseイベント –

+0

こんにちは@PerHenrikLausten、あなたのお返事ありがとうございます。 "2つのsessionScope変数はユーザによって変更されるべきではありませんか?"、はい、それは当てはまります。プログラムのユーザ要件、そのxpageにログインするユーザ要求、ユーザ名、部門が自動的に表示されます。 "最初の2つのエディットボックスは、sessionScope変数の値を表示するだけですか?"というのは、sessionScope変数を使用しないと、エクセルでデータを書き出すことができないためです。目標。 – beginner

+0

beforeRenderResponseイベントを正しく使用する方法がわかりません。そこに 'sessionScope.Officer&sessionScope.Department'を置いて、エディットボックスは編集可能です。 – beginner

答えて

3

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

ああ私は、それを行うために2つの計算フィールドを持っている必要があります。それは私を大いに助け、あなたの答えを受け入れました。どうもありがとうございました。 – beginner

0

私は9.01 FP6 最善の解決策でこの問題があった場所にいましたxp:パネル内の入力を受け取り、パネル内のreadonly属性を使用してそのフィールドを読み取り専用にします。 これはうまくいき、実装が簡単だった

関連する問題