SPREADのダブルクリックでポストバックを繰り返すと、Internet Explorer 11のメモリ使用量が増大し続ける

文書番号 : 39535     文書種別 : 不具合     登録日 : 2016/08/24     最終更新日 : 2016/09/09
文書を印刷する
対象製品
SPREAD for ASP.NET 8.0J
発生環境
Internet Explorer 11
状況
修正済み
詳細
SPREADのダブルクリックでポストバックを繰り返すと、Internet Explorer 11のメモリ使用量が増大し続けます。

【再現コード】
------------------------------------
Webフォームクラス
------------------------------------
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
  FpSpread1.ActiveSheetView.RowCount = 200
  FpSpread1.ActiveSheetView.PageSize = 200
  FpSpread1.ActiveSheetView.ColumnCount = 20

  For i As Integer = 0 To FpSpread1.ActiveSheetView.RowCount - 1
    For j As Integer = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
      FpSpread1.ActiveSheetView.Cells(i, j).Text = "test"
    Next
  Next
End Sub

------------------------------------
クライアント側スクリプト
------------------------------------
window.onload = init;

function init() {
  var spread = document.getElementById("FpSpread1");

  if (spread.addEventListener) {
    spread.addEventListener("dblclick", fnClick, false);
  }
  else {
    spread.ondblclick = fnClick;
  }
}

function fnClick(event) {
  document.getElementById("Button1").click();
}

【再現手順】
1.プロジェクトを起動します
2.セルA1をダブルクリックします
 -- ポストバックが発生します
3.2の処理を繰り返します
 -- メモリが上昇し続けます。

[ダブルクリック回数とメモリの推移]
表示時: 78.8MB
10回目:217.7MB
20回目:355.4MB
30回目:489.2MB
40回目:622.2MB
50回目:754.6MB
回避方法
Service Pack 3(v8.0.4004.2010)で修正済み。なお、Service Pack 3を適用した場合でも一定レベルでのメモリ上昇は避けられません。この動作は製品の制限事項となります。

Service Pack 3でのメモリ使用量の推移
表示時: 61.6MB
10回目: 79.6MB
20回目: 91.9MB
30回目:103.5MB
40回目:115.9MB
50回目:128.8MB

Service Pack 3(v8.0.4004.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

ポストバック前に明示的にオブジェクトの解放処理を行います。なお、回避策を適用した場合でも一定レベルでのメモリ上昇は避けられません。この動作は製品の制限事項となります。

------------------------------------
クライアント側スクリプト
------------------------------------
window.onload = init;

function init() {
  var spread = document.getElementById("FpSpread1");

  if (spread.addEventListener) {
    spread.addEventListener("dblclick", fnClick, false);
  }
  else {
    spread.ondblclick = fnClick;
  }
}

function fnClick(event) {
  // ポストバック前に解放処理
  var spread = document.getElementById("FpSpread1");
  spread.removeEventListener("dblclick", fnClick, false);
  disposeSpread(spread);

  setTimeout(function () {
    // 既存の処理
    document.getElementById("Button1").click();
  }, 0);
}

function disposeSpread(spread) {
  try {
    if (spread.dispose) {
      spread.EndEdit();
      spread.dispose();
      if (spread.Behavior)
        spread.Behavior.attachOnActiveEvents = null;
      spread.__attachOnActiveEvent = null;
      delete spread.__attachOnActiveEvent;
    }

    window.document.PreviousActiveSpread = null;
    window.document.FpActiveSpread = null;
    window.document.FpActiveSheetView = null;

    delete window.document.PreviousActiveSpread;
    delete window.document.FpActiveSpread;
    delete window.document.FpActiveSheetView;

    cleanElement(spread);
  } catch (e) { }
}

function cleanElement(element) {
  for (var i in element) {
    try {
      if (i && i.toString().indexOf("on") == 0)
        element[i] = null;
    } catch (e) { }
  }

  var tb = document.getElementById(element.id + "_textBox");
  if (tb) {
    cleanElement(tb);
  }
}