作成日: 2017/06/28 最終更新日: 2017/08/07
文書種別
不具合
状況
修正済み
詳細
数値系セルおよび日付型セルでkeydownイベントをキャンセルできない場合があります。本現象は整数型セル、倍精度型セル、通貨型セル、パーセント型セルおよび日付型セルの編集中に発生します。
【再現手順】
1.プロジェクトを起動します
2.セルA1の編集を開始します
3.値を選択しCtrl+Xを押下します
-- 値が切り取られます(正しい動作ではありません)
4.セルA2の編集を開始します
5.Ctrl+Vを押下します
-- 手順3で切り取られた値がペーストされます(正しい動作ではありません)
【サンプルコード】
------------------------------------
Webフォームクラス
------------------------------------
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.IsPostBack Then Return
FpSpread1.ActiveSheetView.ColumnCount = 5
FpSpread1.ActiveSheetView.Columns(0).CellType = New FarPoint.Web.Spread.IntegerCellType()
FpSpread1.ActiveSheetView.Columns(1).CellType = New FarPoint.Web.Spread.DoubleCellType()
FpSpread1.ActiveSheetView.Columns(2).CellType = New FarPoint.Web.Spread.CurrencyCellType()
FpSpread1.ActiveSheetView.Columns(3).CellType = New FarPoint.Web.Spread.PercentCellType()
FpSpread1.ActiveSheetView.Columns(4).CellType = New FarPoint.Web.Spread.DateTimeCellType()
FpSpread1.ActiveSheetView.SetValue(0, 0, 123)
FpSpread1.ActiveSheetView.SetValue(0, 1, 123)
FpSpread1.ActiveSheetView.SetValue(0, 2, 123)
FpSpread1.ActiveSheetView.SetValue(0, 3, 123)
FpSpread1.ActiveSheetView.SetValue(0, 4, DateTime.Today)
End Sub
------------------------------------
クライアント側スクリプト
------------------------------------
document.onreadystatechange = function () {
if (document.readyState == "complete") {
var spread = document.getElementById("FpSpread1");
if (spread.addEventListener) {
spread.addEventListener("keydown", keydown, false);
} else {
spread.onkeydown = keydown;
}
}
}
function keydown(e) {
if (e.ctrlKey) {
if (e.keyCode === 88 || e.keyCode === 67 || e.keyCode === 86) {
console.log("Ctrl + " + e.keyCode);
if (e.preventDefault) {
e.preventDefault();
e.stopPropagation();
}
else {
e.keyCode = 0;
e.returnValue = false;
e.cancelBubble = true;
}
}
}
}
本現象はセルの編集用コントロールの不具合によりイベントが親要素に正しく伝播しないことに起因しています。
【再現手順】
1.プロジェクトを起動します
2.セルA1の編集を開始します
3.値を選択しCtrl+Xを押下します
-- 値が切り取られます(正しい動作ではありません)
4.セルA2の編集を開始します
5.Ctrl+Vを押下します
-- 手順3で切り取られた値がペーストされます(正しい動作ではありません)
【サンプルコード】
------------------------------------
Webフォームクラス
------------------------------------
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.IsPostBack Then Return
FpSpread1.ActiveSheetView.ColumnCount = 5
FpSpread1.ActiveSheetView.Columns(0).CellType = New FarPoint.Web.Spread.IntegerCellType()
FpSpread1.ActiveSheetView.Columns(1).CellType = New FarPoint.Web.Spread.DoubleCellType()
FpSpread1.ActiveSheetView.Columns(2).CellType = New FarPoint.Web.Spread.CurrencyCellType()
FpSpread1.ActiveSheetView.Columns(3).CellType = New FarPoint.Web.Spread.PercentCellType()
FpSpread1.ActiveSheetView.Columns(4).CellType = New FarPoint.Web.Spread.DateTimeCellType()
FpSpread1.ActiveSheetView.SetValue(0, 0, 123)
FpSpread1.ActiveSheetView.SetValue(0, 1, 123)
FpSpread1.ActiveSheetView.SetValue(0, 2, 123)
FpSpread1.ActiveSheetView.SetValue(0, 3, 123)
FpSpread1.ActiveSheetView.SetValue(0, 4, DateTime.Today)
End Sub
------------------------------------
クライアント側スクリプト
------------------------------------
document.onreadystatechange = function () {
if (document.readyState == "complete") {
var spread = document.getElementById("FpSpread1");
if (spread.addEventListener) {
spread.addEventListener("keydown", keydown, false);
} else {
spread.onkeydown = keydown;
}
}
}
function keydown(e) {
if (e.ctrlKey) {
if (e.keyCode === 88 || e.keyCode === 67 || e.keyCode === 86) {
console.log("Ctrl + " + e.keyCode);
if (e.preventDefault) {
e.preventDefault();
e.stopPropagation();
}
else {
e.keyCode = 0;
e.returnValue = false;
e.cancelBubble = true;
}
}
}
}
本現象はセルの編集用コントロールの不具合によりイベントが親要素に正しく伝播しないことに起因しています。
回避方法
Service Pack 2(v10.0.4005.2013)で修正済み。
Service Pack 2より前のバージョンでは次の回避方法が有効です。
------------------------------------------
addEventListenerのuseCaptureフラグ(第3引数)をtrueにし、キャプチャーフェーズでイベントをハンドリングすることでkeydownイベントをキャンセルすることが可能です。
document.onreadystatechange = function () {
if (document.readyState == "complete") {
var spread = document.getElementById("FpSpread1");
if (spread.addEventListener) {
spread.addEventListener("keydown", keydown, true);
} else {
spread.onkeydown = keydown;
}
}
}
Service Pack 2より前のバージョンでは次の回避方法が有効です。
------------------------------------------
addEventListenerのuseCaptureフラグ(第3引数)をtrueにし、キャプチャーフェーズでイベントをハンドリングすることでkeydownイベントをキャンセルすることが可能です。
document.onreadystatechange = function () {
if (document.readyState == "complete") {
var spread = document.getElementById("FpSpread1");
if (spread.addEventListener) {
spread.addEventListener("keydown", keydown, true);
} else {
spread.onkeydown = keydown;
}
}
}
旧文書番号
40780