ロックされたボタン型セルにフォーカスが当たるとスクリプトエラーが発生する

文書番号 : 39080     文書種別 : 不具合     登録日 : 2015/08/25     最終更新日 : 2015/10/08
文書を印刷する
対象製品
SPREAD for ASP.NET 8.0J
発生環境
Internet Explorer 8
状況
修正済み
詳細
SetLockedメソッドによってロックしたボタン型セルにフォーカスが当たるとスクリプトエラーが発生します。

【再現手順】
1.新規WebフォームにSPREADひとつ、Button1,Button2を配置する
2.Webフォームに下記の再現コードを貼り付け、Web フォームを起動する
3."lock"ボタンを押下する
4."focus"ボタンを押下する
--- スクリプトエラーが発生する

※なお、手順3のあとボタンを直接押下しても現象が発生します。(二回押下する必要があります。)

【再現コード】
------------------------------------
Webフォームクラス
------------------------------------
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 IsPostBack Then Return

    Dim iButton As New FarPoint.Web.Spread.ButtonCellType()
    FpSpread1.ActiveSheetView.Cells(0, 0).CellType = iButton
  End Sub
End Class

------------------------------------
クライアント側スクリプト
------------------------------------
<script type="text/javascript">
  function lock() {
    var spread = document.getElementById('<%=FpSpread1.ClientID %>');
    spread.Cells(0, 0).SetLocked(true);
  }
  function focusTest() {
    var spread = document.getElementById('<%=FpSpread1.ClientID %>');
    spread.focus();
  }
</script>

------------------------------------
.aspx ボタン設定
------------------------------------
※下記のようにButtonへ関数実行を設定してください
<input id="Button1" type="button" value="Lock" onclick="lock();" />
<input id="Button2" type="button" value="focus" onclick="focusTest();" />
回避方法
Service Pack 2(v8.0.4002.2010)で修正済み。
Service Pack 2(v8.0.4002.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

製品が実行するSetFocus処理をオーバーライドし例外を補足することで本現象の回避が可能です。

【回避コード】クライアント側スクリプトに下記のコードを追加します。

window.onload = function () {
  // 既存のSetFocusメソッドをオーバーライドし例外を補足
  var FPWS = (((FarPoint || {}).Web || {}).Spread || {});
  if (FPWS.ButtonEditor && FPWS.ButtonEditor.prototype.SetFocus) {
    var originalFocus = FPWS.ButtonEditor.prototype.SetFocus;
    FPWS.ButtonEditor.prototype.SetFocus = function () {
      try {
        originalFocus();
      } catch (e) { }
    };
  }
};