作成日: 2018/02/15 最終更新日: 2018/03/28
文書種別
不具合
状況
修正済み
詳細
ブール値のセルから1回のTabキーで次のセルにフォーカス移動できず、Tabキーを2回押す必要があります。本現象は以下の条件の時に発生します。
・KeyActionTabプロパティによりTabキー押下時に次のセルに移動する設定がされている
・startEditingメソッドまたはユーザー操作によりセルの編集が開始されている
・KeyActionTabプロパティによりTabキー押下時に次のセルに移動する設定がされている
・startEditingメソッドまたはユーザー操作によりセルの編集が開始されている
回避方法
この問題は2018v1で修正されました。
※修正版を適用しない場合の回避方法は以下の通りです。
独自にキーイベントをハンドルして回避します。
<script type="text/javascript">
wijmo.grid._KeyboardHandler.prototype._keydown = function (e) {
var g = this._g, sel = g.selection, ctrl = e.ctrlKey || e.metaKey, shift = e.shiftKey, target = e.target, handled = true;
this._altDown = false;
if (g._wantsInput(e.target)) {
return;
}
if (!g.isRangeValid(sel) || e.defaultPrevented) {
return;
}
if (g.activeEditor && g._edtHdl._keydown(e)) {
return;
}
var gr = wijmo.tryCast(g.rows[sel.row], wijmo.grid.GroupRow), ecv = g.editableCollectionView, keyCode = e.keyCode;
if (g.autoClipboard) {
if (ctrl && (keyCode == 67 || keyCode == 45)) {
var args = new wijmo.grid.CellRangeEventArgs(g.cells, sel);
if (g.onCopying(args)) {
var text = g.getClipString() + '¥r¥n';
wijmo.Clipboard.copy(text);
g.onCopied(args);
}
e.stopPropagation();
return;
}
// paste: ctrl+v or shift+Insert
if ((ctrl && keyCode == 86) || (shift && keyCode == 45)) {
if (!g.isReadOnly) {
var args_1 = new wijmo.grid.CellRangeEventArgs(g.cells, sel);
if (g.onPasting(args_1)) {
wijmo.Clipboard.paste(function (text) {
g.setClipString(text);
g.onPasted(args_1);
});
}
}
e.stopPropagation();
return;
}
}
if (g.rightToLeft) {
switch (keyCode) {
case wijmo.Key.Left:
keyCode = wijmo.Key.Right;
break;
case wijmo.Key.Right:
keyCode = wijmo.Key.Left;
break;
}
}
var smv = wijmo.grid.SelMove, sm = wijmo.grid.SelectionMode;
switch (keyCode) {
// shift-space: select row
// ctrl-space: select column
// else start editing, toggle checkboxes
case wijmo.Key.Space:
if (shift && sel.isValid) {
switch (g.selectionMode) {
case sm.CellRange:
case sm.Row:
case sm.RowRange:
case sm.ListBox:
g.select(new wijmo.grid.CellRange(sel.row, 0, sel.row, g.columns.length - 1));
break;
}
}
else if (ctrl && sel.isValid) {
switch (g.selectionMode) {
case sm.CellRange:
g.select(new wijmo.grid.CellRange(0, sel.col, g.rows.length - 1, sel.col));
break;
}
}
else {
handled = this._startEditing(true, e);
if (handled) {
setTimeout(function () {
var edt = g.activeEditor;
if (edt) {
if (edt.disabled || edt.readOnly) {
g.finishEditing();
}
else if (edt.type == 'checkbox') {
edt.checked = !edt.checked;
g.finishEditing();
}
else {
wijmo.setSelectionRange(edt, edt.value.length);
}
}
});
}
}
break;
// ctrl+A: select all
case 65:
if (ctrl) {
switch (g.selectionMode) {
case sm.CellRange:
case sm.Row:
case sm.RowRange:
case sm.ListBox:
g.select(new wijmo.grid.CellRange(0, 0, g.rows.length - 1, g.columns.length - 1));
break;
}
}
else {
handled = false;
}
break;
// left/right
case wijmo.Key.Left:
if (ctrl || e.altKey) {
handled = false;
}
else {
if (sel.isValid && sel.col == 0 && gr != null && !gr.isCollapsed && gr.hasChildren) {
gr.isCollapsed = true;
}
else {
this._moveSel(smv.None, ctrl ? smv.Home : smv.Prev, shift);
}
}
break;
case wijmo.Key.Right:
if (ctrl || e.altKey) {
handled = false;
}
else {
if (sel.isValid && sel.col == 0 && gr != null && gr.isCollapsed) {
gr.isCollapsed = false;
}
else {
this._moveSel(smv.None, ctrl ? smv.End : smv.Next, shift);
}
}
break;
// up/down move selection, alt-up/down toggles the listbox
case wijmo.Key.Up:
if (ctrl) {
handled = false;
}
else {
this._altDown = e.altKey;
if (e.altKey) {
handled = g._edtHdl._toggleListBox(e);
}
else {
this._moveSel(smv.Prev, smv.None, shift);
}
}
break;
case wijmo.Key.Down:
if (ctrl) {
handled = false;
}
else {
this._altDown = e.altKey;
if (e.altKey) {
handled = g._edtHdl._toggleListBox(e);
}
else {
this._moveSel(smv.Next, smv.None, shift);
}
}
break;
// page up/down
// +alt for top/bottom (+ctrl is used to switch tabs in Chrome)
case wijmo.Key.PageUp:
this._altDown = e.altKey;
this._moveSel(e.altKey ? smv.Home : smv.PrevPage, smv.None, shift);
break;
case wijmo.Key.PageDown:
this._altDown = e.altKey;
this._moveSel(e.altKey ? smv.End : smv.NextPage, smv.None, shift);
break;
// home/end
case wijmo.Key.Home:
this._moveSel(ctrl ? smv.Home : smv.None, smv.Home, shift);
break;
case wijmo.Key.End:
this._moveSel(ctrl ? smv.End : smv.None, smv.End, shift);
break;
// tab
case wijmo.Key.Tab:
handled = this._performKeyAction(g.keyActionTab, shift);
break;
// Enter
case wijmo.Key.Enter:
handled = this._performKeyAction(g.keyActionEnter, shift);
if (!shift && ecv && ecv.currentEditItem != null) {
g._edtHdl._commitRowEdits();
}
break;
// Escape: cancel edits/row addition
case wijmo.Key.Escape:
handled = false;
if (ecv) {
if (ecv.currentAddItem || ecv.currentEditItem) {
var ee = new wijmo.grid.CellRangeEventArgs(g.cells, g.selection);
ee.cancel = true;
g.onRowEditEnding(ee);
if (ecv.currentAddItem) {
ecv.cancelNew();
}
if (ecv.currentEditItem) {
ecv.cancelEdit();
}
g.onRowEditEnded(ee);
handled = true;
}
}
g._mouseHdl.resetMouseState();
break;
// Delete selection
case wijmo.Key.Delete:
case wijmo.Key.Back:
handled = this._deleteSel(e);
break;
// F2/F4: editing
case wijmo.Key.F2:
handled = this._startEditing(true, e);
break;
case wijmo.Key.F4:
handled = g._edtHdl._toggleListBox(e);
break;
// everything else
default:
handled = false;
break;
}
if (handled) {
if (!g.containsFocus()) {
g.focus();
}
e.preventDefault();
e.stopPropagation();
}
};
</script>
※修正版を適用しない場合の回避方法は以下の通りです。
独自にキーイベントをハンドルして回避します。
<script type="text/javascript">
wijmo.grid._KeyboardHandler.prototype._keydown = function (e) {
var g = this._g, sel = g.selection, ctrl = e.ctrlKey || e.metaKey, shift = e.shiftKey, target = e.target, handled = true;
this._altDown = false;
if (g._wantsInput(e.target)) {
return;
}
if (!g.isRangeValid(sel) || e.defaultPrevented) {
return;
}
if (g.activeEditor && g._edtHdl._keydown(e)) {
return;
}
var gr = wijmo.tryCast(g.rows[sel.row], wijmo.grid.GroupRow), ecv = g.editableCollectionView, keyCode = e.keyCode;
if (g.autoClipboard) {
if (ctrl && (keyCode == 67 || keyCode == 45)) {
var args = new wijmo.grid.CellRangeEventArgs(g.cells, sel);
if (g.onCopying(args)) {
var text = g.getClipString() + '¥r¥n';
wijmo.Clipboard.copy(text);
g.onCopied(args);
}
e.stopPropagation();
return;
}
// paste: ctrl+v or shift+Insert
if ((ctrl && keyCode == 86) || (shift && keyCode == 45)) {
if (!g.isReadOnly) {
var args_1 = new wijmo.grid.CellRangeEventArgs(g.cells, sel);
if (g.onPasting(args_1)) {
wijmo.Clipboard.paste(function (text) {
g.setClipString(text);
g.onPasted(args_1);
});
}
}
e.stopPropagation();
return;
}
}
if (g.rightToLeft) {
switch (keyCode) {
case wijmo.Key.Left:
keyCode = wijmo.Key.Right;
break;
case wijmo.Key.Right:
keyCode = wijmo.Key.Left;
break;
}
}
var smv = wijmo.grid.SelMove, sm = wijmo.grid.SelectionMode;
switch (keyCode) {
// shift-space: select row
// ctrl-space: select column
// else start editing, toggle checkboxes
case wijmo.Key.Space:
if (shift && sel.isValid) {
switch (g.selectionMode) {
case sm.CellRange:
case sm.Row:
case sm.RowRange:
case sm.ListBox:
g.select(new wijmo.grid.CellRange(sel.row, 0, sel.row, g.columns.length - 1));
break;
}
}
else if (ctrl && sel.isValid) {
switch (g.selectionMode) {
case sm.CellRange:
g.select(new wijmo.grid.CellRange(0, sel.col, g.rows.length - 1, sel.col));
break;
}
}
else {
handled = this._startEditing(true, e);
if (handled) {
setTimeout(function () {
var edt = g.activeEditor;
if (edt) {
if (edt.disabled || edt.readOnly) {
g.finishEditing();
}
else if (edt.type == 'checkbox') {
edt.checked = !edt.checked;
g.finishEditing();
}
else {
wijmo.setSelectionRange(edt, edt.value.length);
}
}
});
}
}
break;
// ctrl+A: select all
case 65:
if (ctrl) {
switch (g.selectionMode) {
case sm.CellRange:
case sm.Row:
case sm.RowRange:
case sm.ListBox:
g.select(new wijmo.grid.CellRange(0, 0, g.rows.length - 1, g.columns.length - 1));
break;
}
}
else {
handled = false;
}
break;
// left/right
case wijmo.Key.Left:
if (ctrl || e.altKey) {
handled = false;
}
else {
if (sel.isValid && sel.col == 0 && gr != null && !gr.isCollapsed && gr.hasChildren) {
gr.isCollapsed = true;
}
else {
this._moveSel(smv.None, ctrl ? smv.Home : smv.Prev, shift);
}
}
break;
case wijmo.Key.Right:
if (ctrl || e.altKey) {
handled = false;
}
else {
if (sel.isValid && sel.col == 0 && gr != null && gr.isCollapsed) {
gr.isCollapsed = false;
}
else {
this._moveSel(smv.None, ctrl ? smv.End : smv.Next, shift);
}
}
break;
// up/down move selection, alt-up/down toggles the listbox
case wijmo.Key.Up:
if (ctrl) {
handled = false;
}
else {
this._altDown = e.altKey;
if (e.altKey) {
handled = g._edtHdl._toggleListBox(e);
}
else {
this._moveSel(smv.Prev, smv.None, shift);
}
}
break;
case wijmo.Key.Down:
if (ctrl) {
handled = false;
}
else {
this._altDown = e.altKey;
if (e.altKey) {
handled = g._edtHdl._toggleListBox(e);
}
else {
this._moveSel(smv.Next, smv.None, shift);
}
}
break;
// page up/down
// +alt for top/bottom (+ctrl is used to switch tabs in Chrome)
case wijmo.Key.PageUp:
this._altDown = e.altKey;
this._moveSel(e.altKey ? smv.Home : smv.PrevPage, smv.None, shift);
break;
case wijmo.Key.PageDown:
this._altDown = e.altKey;
this._moveSel(e.altKey ? smv.End : smv.NextPage, smv.None, shift);
break;
// home/end
case wijmo.Key.Home:
this._moveSel(ctrl ? smv.Home : smv.None, smv.Home, shift);
break;
case wijmo.Key.End:
this._moveSel(ctrl ? smv.End : smv.None, smv.End, shift);
break;
// tab
case wijmo.Key.Tab:
handled = this._performKeyAction(g.keyActionTab, shift);
break;
// Enter
case wijmo.Key.Enter:
handled = this._performKeyAction(g.keyActionEnter, shift);
if (!shift && ecv && ecv.currentEditItem != null) {
g._edtHdl._commitRowEdits();
}
break;
// Escape: cancel edits/row addition
case wijmo.Key.Escape:
handled = false;
if (ecv) {
if (ecv.currentAddItem || ecv.currentEditItem) {
var ee = new wijmo.grid.CellRangeEventArgs(g.cells, g.selection);
ee.cancel = true;
g.onRowEditEnding(ee);
if (ecv.currentAddItem) {
ecv.cancelNew();
}
if (ecv.currentEditItem) {
ecv.cancelEdit();
}
g.onRowEditEnded(ee);
handled = true;
}
}
g._mouseHdl.resetMouseState();
break;
// Delete selection
case wijmo.Key.Delete:
case wijmo.Key.Back:
handled = this._deleteSel(e);
break;
// F2/F4: editing
case wijmo.Key.F2:
handled = this._startEditing(true, e);
break;
case wijmo.Key.F4:
handled = g._edtHdl._toggleListBox(e);
break;
// everything else
default:
handled = false;
break;
}
if (handled) {
if (!g.containsFocus()) {
g.focus();
}
e.preventDefault();
e.stopPropagation();
}
};
</script>
旧文書番号
82526