CallBackStoppedのタイミングでCallBackメソッドを呼び出すと、ButtonCommandイベントが発生しない

文書番号 : 39108     文書種別 : 不具合     登録日 : 2015/09/15     最終更新日 : 2015/10/08
文書を印刷する
対象製品
SPREAD for ASP.NET 8.0J
状況
修正済み
詳細
通常、CallBackメソッドの実行によって、サーバー側ではButtonCommandイベントが発生しますが、CallBackStoppedに設定したイベント内でCallBackメソッドを実行すると、ButtonCommandがコールされない現象が発生します。

【再現手順】
1.新規WebフォームにSPREADひとつを配置する
2.Webフォームに下記の再現コードを貼り付け、Web フォームを起動する
3.コマンドバー上の挿入、もしくは行の追加ボタンを押下する
--- CallBackメソッドによるButtonCommandイベントが発生しない

【再現コード】
------------------------------------
Webフォームクラス
------------------------------------
Imports FarPoint.Web.Spread

Public Class WebForm1
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then
      Return
    End If

    FpSpread1.ActiveSheetView.AllowInsert = True
  End Sub

  Protected Sub FpSpread1_InsertCommand(sender As Object, e As SpreadCommandEventArgs) Handles FpSpread1.InsertCommand
    System.Diagnostics.Debug.Print("FpSpread1_InsertCommand: {0} {1}", e.CommandName, e.CommandArgument)
  End Sub

  Protected Sub FpSpread1_ButtonCommand(sender As Object, e As SpreadCommandEventArgs) Handles FpSpread1.ButtonCommand
    System.Diagnostics.Debug.Print("FpSpread1_ButtonCommand: {0} {1}", e.CommandName, e.CommandArgument)
  End Sub
End Class

------------------------------------
クライアント側スクリプト
------------------------------------
  window.onload = init;
  function init() {
    var spread = document.getElementById("FpSpread1");
    if (spread.addEventListener) {
      spread.addEventListener("CallBackStopped", cstop, false);
    }
    else {
      spread.onCallBackStopped = cstop;
    }
  }
  function cstop(e) {
    e = e || window.event;
    var cname = e.command.split(",");
    var spread = document.getElementById("FpSpread1");
    if (cname[0] == "Add") {
      spread.CallBack("AddRow");
    } else if (cname[0] == "Insert") {
      spread.CallBack("InsertRow");
    }
  }
回避方法
Service Pack 2(v8.0.4002.2010)で修正済み。
Service Pack 2(v8.0.4002.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

setTimeoutを利用し、CallBackStoppedに設定した処理を完了させてからCallBackメソッドを呼びことにより、本現象の回避が可能です。

【再現コードへの回避方法適用例】
function cstop(e) {
  e = e || window.event;
  var cname = e.command.split(",");

  // SPREADの内部処理が完了してからCallBackメソッドを呼び出す
  setTimeout(function () {

   var spread = document.getElementById("FpSpread1");
   if (cname[0] == "Add") {
    spread.CallBack("AddRow");
   } else if (cname[0] == "Insert") {
    spread.CallBack("InsertRow");
   }

  }, 0);
}