ボタンやラジオボタンなど、「押して操作する系コンポーネント」は外観重視でitemFormatterやformatItem()の使用はやむを得ない。 が、その場合も絶対に前面のコンポーネントがフォーカスを奪いっぱなしにならないよう徹底的に“処置”する。
2019-04-12 00:18:16たとえば、セル上に「Enterキーでイベントが発火するボタン」を配置したとする。 この時点で、ただちに「ボタン自体にフォーカスが当たっているのか、ボタンをホストしているセルにフォーカスが当たっているのか問題」が勃発する。 ボタン自体にフォーカスが当たると前述のとおり立ち往生するので、
2019-04-12 00:18:16論理的に考えて、ボタンがフォーカスされた瞬間に、その背後にあるセルへフォーカスを逃す処理を組み込む必要がある。 ところが、セルにフォーカスが当たっている状態でEnterを押すと、FlexGrid#keyActionEnterに従ってフォーカスが滑ってしまう。
2019-04-12 00:18:17ということはつまり、ボタンをホストしているセルに限って、keyActionEnterを無効化しなければならない。 これは、FlexGrid#selectionChangedイベントの中で行えばよいと素人は考えがちだが、話はそう簡単ではない。
2019-04-12 00:18:17selectionプロパティについて、語る
悩ましい現象について
これは#FlexGridのサブクラスであり、GrapeCity様に年間12万のお布施をする者だけが使う事を許された#MultiRowで確認した自称なんだけど(←会社に買って貰った)、selectionChangedイベントの入り先が結合セルだった場合、時と場合によってイベントに引き渡されるCellRangeオブジェクトが変わるのだ
2019-04-12 00:18:18わかりやすいところで言うと、結合された単一セルを選択しているにも拘らず、CellRange#isSingleCellプロパティがtrueだったりfalseだったりする。 正直これは#Wijmoのバグではないかと思っている。 また同様に、row, row2, col, col2プロパティも安定しない。
2019-04-12 00:18:18そのため、FlexGrid#selectionで得られるCellRangeを基に、被フォーカスセルを厳密に特定することは不可能に近い。 ……長くなったので、一旦ここで切る。
2019-04-12 00:18:18#FlexGridは、カスタムエディタを使えばExcelとかから複数セルのドラッグ&ドロップにデフォルトで対応できる。 itemFormatterやCellTemplateでセルの上にテキストボックスを1個1個配置すると、もはや<table>タグと同じで単一セルにしかドロップできないし、なんならグリッドの複数セル選択も危うい。
2019-04-12 00:27:30結論
それでもWijmoが大好きです。