[SPRN05744]【クライアント】コールバックと同時にコンボボックス型セルのドロップダウンリストを表示するとIEでエラーが発生する

文書番号 : 22564     文書種別 : 制限事項     最終更新日 : 2006/09/09
文書を印刷する
対象製品
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>
回避方法
回避策として、次の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>

この文書は、以前は次のFAQ IDで公開されていました : 6385