[SPRN05744]【クライアント】コールバックと同時にコンボボックス型セルのドロップダウンリストを表示するとIEでエラーが発生する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
発生環境
動作保証環境と同様
詳細
コールバックさせるタイミングでコンボボックス型セルのドロップダウンリストを表示した場合、IEでエラーが発生します。
下記、再現手順とサンプルコードです。
[再現手順]
1.新規WebフォームにSPREADだけを配置します。
2.下記のサンプルコードをコピーします。
3.アプリケーションを実行します。
4.B1セルを編集します。
5.B1セルを編集状態のまま、A1セルのドロップダウンボタンをクリックしてリストを表示します。
6.IEでエラーが発生します。
[サンプルコード]
-------------------------
Webフォーム
-------------------------
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack = True Then
Return
End If
' 1列目にコンボボックス型セルを設定
Dim cbstr As String()
cbstr = New String() {"1月", "2月", "3月", "4月", "5月", "6月"}
Dim cmbbx As New FarPoint.Web.Spread.ComboBoxCellType(cbstr)
cmbbx.ShowButton = True
FpSpread1.ActiveSheetView.Columns(0).CellType = cmbbx
End Sub
Private Sub FpSpread1_ButtonCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.ButtonCommand
If e.CommandName = "sprdUpdate" Then
' クライアント側の変更を更新
FpSpread1.SaveChanges()
End If
End Sub
-------------------------
クライアント側スクリプト
-------------------------
<script language="javascript">
function window.onload()
{
var spread = document.getElementById("FpSpread1");
spread.onDataChanged = dc;
}
function dc()
{
var spread = event.srcElement;
spread.UpdatePostbackData();
spread.CallBack("sprdUpdate");
}
</script>
下記、再現手順とサンプルコードです。
[再現手順]
1.新規WebフォームにSPREADだけを配置します。
2.下記のサンプルコードをコピーします。
3.アプリケーションを実行します。
4.B1セルを編集します。
5.B1セルを編集状態のまま、A1セルのドロップダウンボタンをクリックしてリストを表示します。
6.IEでエラーが発生します。
[サンプルコード]
-------------------------
Webフォーム
-------------------------
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack = True Then
Return
End If
' 1列目にコンボボックス型セルを設定
Dim cbstr As String()
cbstr = New String() {"1月", "2月", "3月", "4月", "5月", "6月"}
Dim cmbbx As New FarPoint.Web.Spread.ComboBoxCellType(cbstr)
cmbbx.ShowButton = True
FpSpread1.ActiveSheetView.Columns(0).CellType = cmbbx
End Sub
Private Sub FpSpread1_ButtonCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.ButtonCommand
If e.CommandName = "sprdUpdate" Then
' クライアント側の変更を更新
FpSpread1.SaveChanges()
End If
End Sub
-------------------------
クライアント側スクリプト
-------------------------
<script language="javascript">
function window.onload()
{
var spread = document.getElementById("FpSpread1");
spread.onDataChanged = dc;
}
function dc()
{
var spread = event.srcElement;
spread.UpdatePostbackData();
spread.CallBack("sprdUpdate");
}
</script>
回避方法
回避策として、次の2方法のいずれかを検討して下さい。
●方法1●
下記のdo_callbackメソッドのようにtry-catchでスクリプトエラーを回避する。
<script language="javascript">
function window.onload()
{
var spread = document.getElementById("FpSpread1");
spread.onDataChanged = dc;
}
function dc()
{
setTimeout(do_callback,0);
}
function do_callback(){
var s=document.getElementById("FpSpread1");
try{
s.UpdatePostbackData();
s.CallBack("su");
}
catch(e){}
}
</script>
●方法2●
下記のdo_callback2メソッドのようにコンボ列以外の列への移動でコールバックする。
<script language="javascript">
var COMBOCOL=1//コンボ列の列番号を設定
function window.onload()
{
var spread = document.getElementById("FpSpread1");
spread.onDataChanged = dc;
}
function dc()
{
setTimeout(do_callback2,0);
}
function do_callback2(){
// コンボ列以外のセルへ移動した時にコールバック
var s=document.getElementById("FpSpread1");
if(s.ActiveCol!=COMBOCOL){
s.UpdatePostbackData();
s.CallBack("su");
}
}
</script>
●方法1●
下記のdo_callbackメソッドのようにtry-catchでスクリプトエラーを回避する。
<script language="javascript">
function window.onload()
{
var spread = document.getElementById("FpSpread1");
spread.onDataChanged = dc;
}
function dc()
{
setTimeout(do_callback,0);
}
function do_callback(){
var s=document.getElementById("FpSpread1");
try{
s.UpdatePostbackData();
s.CallBack("su");
}
catch(e){}
}
</script>
●方法2●
下記のdo_callback2メソッドのようにコンボ列以外の列への移動でコールバックする。
<script language="javascript">
var COMBOCOL=1//コンボ列の列番号を設定
function window.onload()
{
var spread = document.getElementById("FpSpread1");
spread.onDataChanged = dc;
}
function dc()
{
setTimeout(do_callback2,0);
}
function do_callback2(){
// コンボ列以外のセルへ移動した時にコールバック
var s=document.getElementById("FpSpread1");
if(s.ActiveCol!=COMBOCOL){
s.UpdatePostbackData();
s.CallBack("su");
}
}
</script>
この文書は、以前は次のFAQ IDで公開されていました : 6385