非表示にしたSPREADを非同期ポストバックで表示後、マルチカラムコンボボックス型セルでスクリプトエラーが発生する

文書番号 : 39531     文書種別 : 不具合     登録日 : 2016/08/22     最終更新日 : 2016/09/09
文書を印刷する
対象製品
SPREAD for ASP.NET 8.0J
状況
修正済み
詳細
非表示にしたSPREADを非同期ポストバックで表示後、マルチカラムコンボボックス型セルを操作するとスクリプトエラーが発生します。

【再現手順】
1.新しいWebFormを作成します
2.ScriptManagerとUpdatePanelを配置します
3.UpdatePanel内にSPREADとButtonを配置します
4.プロジェクトを起動しボタンをクリックします
 -- SPREADが表示されます
5.セルB2(マルチカラムコンボボックス型セル)をクリックし編集を開始します
 -- スクリプトエラーが発生します

【再現コード】
  Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    If Not IsPostBack Then
      ' MultiColumnComboBoxCellType型セル用データの作成
      Dim dt2 As New System.Data.DataTable("Test")
      dt2.Columns.Add("Disp", GetType([String]))
      dt2.Columns.Add("Value", GetType([String]))
      For i As Integer = 0 To 4
        dt2.Rows.Add(String.Format("Item{0}", i), String.Format("{0}", (i + 1) * 100))
      Next
      dt2.AcceptChanges()

      ' MultiColumnComboBoxCellType型セルの設定
      Dim mcCell As New FarPoint.Web.Spread.MultiColumnComboBoxCellType()
      mcCell.ColumnEditName = "Disp"
      mcCell.DataColumnName = "Value"
      mcCell.DataSource = dt2
      mcCell.ListHeight = 154
      mcCell.ListWidth = 182
      mcCell.ShowButton = False
      FpSpread1.ActiveSheetView.Columns(1).CellType = mcCell

      ' SPREADの非表示
      FpSpread1.Visible = False
    End If
  End Sub

  Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' SPREADの表示
    FpSpread1.Visible = True
  End Sub
回避方法
Service Pack 3(v8.0.4004.2010)で修正済み。
Service Pack 3(v8.0.4004.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

マルチカラムコンボボックス型セルの初期化ロジックを明示的に呼び出します。

------------------------------------
Webフォームクラス
------------------------------------
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
  ' スクリプトの実行
  ScriptManager.RegisterStartupScript(Me.Page, Me.Page.[GetType](), Convert.ToString(Me.UniqueID) & "_workarround", "workarround();", True)
  If Not IsPostBack Then
    ' MultiColumnComboBoxCellType型セル用データの作成
    Dim dt2 As New System.Data.DataTable("Test")
    dt2.Columns.Add("Disp", GetType([String]))
    dt2.Columns.Add("Value", GetType([String]))
    For i As Integer = 0 To 4
      dt2.Rows.Add(String.Format("Item{0}", i), String.Format("{0}", (i + 1) * 100))
    Next
    dt2.AcceptChanges()

    ' MultiColumnComboBoxCellType型セルの設定
    Dim mcCell As New FarPoint.Web.Spread.MultiColumnComboBoxCellType()
    mcCell.ColumnEditName = "Disp"
    mcCell.DataColumnName = "Value"
    mcCell.DataSource = dt2
    mcCell.ListHeight = 154
    mcCell.ListWidth = 182
    mcCell.ShowButton = False
    FpSpread1.ActiveSheetView.Columns(1).CellType = mcCell

    ' SPREADの非表示
    FpSpread1.Visible = False
  End If
End Sub

------------------------------------
クライアント側スクリプト
------------------------------------
function workarround() {
  var mccbs = document.querySelectorAll ? document.querySelectorAll('[fpcelltype="MultiColumnComboBoxCellType"]') : getElements("fpcelltype", "MultiColumnComboBoxCellType");
  if (mccbs && mccbs.length) {
    for (var i = 0; i < mccbs.length; i++) {
      var editorid = mccbs[i].getAttribute("fpeditorid");
      if (editorid != null) {
        var str = "";
        if (eval("window." + editorid + "_obj") == undefined) {
          str = "var " + editorid + "_obj;";
        }
        if (FarPoint && FarPoint.System && FarPoint.System.WebControl && FarPoint.System.WebControl.MultiColumnComboBoxCellType && FarPoint.System.WebControl.MultiColumnComboBoxCellType.CheckInit) {
          str += " setTimeout(function(){FarPoint.System.WebControl.MultiColumnComboBoxCellType.CheckInit('" + editorid + "');},0); ";
        }
        if (str != "")
          eval(str);
      }
    }
  }
}

function getElements(attrib, val) {
  var elements = document.getElementsByTagName("td");
  var foundelements = [];

  for (var i = 0; i < elements.length; i++) {
    var currentElement = elements[i];
    if (currentElement.getAttribute(attrib) == val) {
      foundelements.push(currentElement);
    }
  }
  return foundelements;
}