非表示にしたSPREADを非同期ポストバックで表示後、マルチカラムコンボボックス型セルでスクリプトエラーが発生する
対象製品
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
【再現手順】
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;
}
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;
}