【IE9】 複数のSPREADをWebフォームに配置すると、行の追加時に異なるSPREADに対して処理が実行されることがある

文書番号 : 37645     文書種別 : 不具合     登録日 : 2014/10/23     最終更新日 : 2015/03/31
文書を印刷する
対象製品
SPREAD for ASP.NET 7.0J
発生環境
Internet Explorer 9
状況
修正済み
詳細
複数のSPREADをWebフォームに配置すると、行の追加時に異なるSPREADに対して処理が実行されることがあります。

【再現コード】
  Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    If Page.IsPostBack Then Return

    FpSpread1.ActiveSheetView.AllowInsert = True
    FpSpread1.EditModePermanent = True
    FpSpread1.CommandBar.ButtonType = FarPoint.Web.Spread.ButtonType.PushButton

    FpSpread2.ActiveSheetView.AllowInsert = True
    FpSpread2.EditModePermanent = True
    FpSpread2.CommandBar.ButtonType = FarPoint.Web.Spread.ButtonType.PushButton
  End Sub

【再現手順】
1.Webフォーム上に2つのSPREADを配置します
2.再現コードを貼り付けプロジェクトを起動します
3.SPREAD1上のコマンドバーにある行の追加ボタンを押下します
 -- SPREAD1に行が追加されます
4.SPREAD2上のコマンドバーにある行の追加ボタンを押下します
 -- SPREAD2に行が追加されません(適切な動作ではありません)
5.SPREAD1上のコマンドバーにある行の追加ボタンを押下します
 -- SPREAD1に2行の新規行が追加されます(適切な動作ではありません)
回避方法
Service Pack 3(v7.0.4017.2010)で修正済み。
Service Pack 3(v7.0.4017.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

クライアント側のMouseDownイベントをハンドリングしフォーカス移動が適切に行われるようにします。

------------------------------------
クライアント側スクリプト
------------------------------------
  window.onload = function () {
   var spreads = [document.getElementById("FpSpread1"), document.getElementById("FpSpread2")];
   for (var i = 0; i < spreads.length; i++) {
    spreads[i].addEventListener("mousedown", spreadMouseDown, false);
   }
  };

  function spreadMouseDown(event) {
   var target = event.target;
   var targetSpread = getSpread(target);
   var topTargetSpread = targetSpread ? getSpread(targetSpread, true) : null;
   if (document.FpActiveSpread && !isContains(document.FpActiveSpread, target, true) && getSpread(document.FpActiveSpread, true) != topTargetSpread) {
    document.FpActiveSpread = targetSpread;
    topTargetSpread.SetActiveSpreadID(topTargetSpread, topTargetSpread.id, targetSpread.id);
   }
  }

  function getSpread(e, getTop) {   
   var ret = e == null ? element : e;
   var w = getTop ? e.parentElement : e;
   while (w != null && w.tagName != null && w.tagName != "BODY") {
    if (w.getAttribute("FpSpread") == "Spread") {
     if (!getTop)
      return w;
     else {
      if (w.getAttribute("hierView") == "true")
       ret = w;
      else
       break;
     }
    }
    w = w.parentElement;
   }
   return getTop ? ret : null;
  }

  function isContains (a, b, includeA) {
    if (a == null || b == null) return false;
    return (includeA && a == b) || (a.contains ? a != b && a.contains(b) : (a.compareDocumentPosition && !!(a.compareDocumentPosition(b) & 16)));
   }