WijmoのFlexGridでは、新しい行は通常、表の最下部に追加されます。newRowAtTop
プロパティをtrue
に設定すると、新規行テンプレートは表の先頭に表示されるようになりますが、実際に追加される行は依然として最下行となるため、表示と挙動にズレが生じます。
本記事では、このギャップを解消し、新規行を上から追加する方法を丁寧に解説します。
新規行を先頭に追加する実装手順
まず、rowAdded
イベントを活用して、実際に新規行が追加された際にその位置を操作します。itemsSource
の最後に追加された行を先頭に移動させる実装です。
var theGrid = new FlexGrid('#theGrid', {
autoGenerateColumns: false,
columns: [
{ binding: 'id', header: 'ID', width: 80 },
{ binding: 'country', header: '国' },
{ binding: 'downloads', header: 'DL数', width: 80 },
{ binding: 'sales', header: '売上', width: 80 },
{ binding: 'expenses', header: '費用', width: 80 },
],
itemsSource: data,
allowAddNew: true,
newRowAtTop: true,
frozenRows: 1,
});
theGrid.rowAdded.addHandler((s, e) => {
s.itemsSource.unshift(s.itemsSource.pop());
s.collectionView.onCollectionChanged(e);
});
ここでのポイントは以下の2点です:
s.itemsSource.unshift(s.itemsSource.pop());
で、追加された行を先頭に移動。collectionView.onCollectionChanged(e);
を呼び出すことで、コレクションの更新イベントを明示的に発火。
なぜ collectionView に明示的な通知が必要なのか?
rowAdded
はその名の通り追加処理が完了した時に発火します。そのため、itemsSource
を直接操作してもCollectionView
側ではその変更を認識できません。
Wijmo公式ドキュメントでは、refreshOnEditにて、編集後の自動反映について記述があります。つまり、編集が発生したことを明示的に伝える必要があるのです。
まとめ:FlexGridでの行追加位置を柔軟に制御しよう
新規行テンプレートが上に表示される一方で、実際の行追加は下というデフォルト動作に違和感を持つ方も多いでしょう。このようなケースでは、イベントハンドリングでロジックを補完することで、ユーザーの直感と一致するUIを実現できます。
可能であれば、行追加の位置を制御するカスタムラッパークラスを用意し、上から追加
/下から追加
を切り替えられる仕組みを作っておくと、再利用性と柔軟性が向上します。