【IE9】 複数のSPREADをWebフォームに配置すると、行の追加時に異なるSPREADに対して処理が実行されることがある
対象製品
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行の新規行が追加されます(適切な動作ではありません)
【再現コード】
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)));
}
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)));
}