CallBackStoppedのタイミングでCallBackメソッドを呼び出すと、ButtonCommandイベントが発生しない
対象製品
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");
}
}
【再現手順】
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);
}
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);
}