概要

XamDataGrid のイベントをハンドリングして、複数のセルを同時に同じ値で編集する機能を実装する方法を説明します。


事前設定:セル選択の有効化

まず、以下の2つのプロパティを設定してセルの複数選択を有効にします。

  • FieldSettings.CellClickAction → SelectCell
  • FieldLayoutSettings.SelectionTypeCell → Extended
<igWPF:XamDataGrid x:Name="_xamDataGrid" >
    <igWPF:XamDataGrid.FieldLayoutSettings>
            <igWPF:FieldLayoutSettings SelectionTypeCell="Extended" />
        </igWPF:XamDataGrid.FieldLayoutSettings>
        <igWPF:XamDataGrid.FieldSettings>
            <igWPF:FieldSettings CellClickAction="SelectCell" />
    </igWPF:XamDataGrid.FieldSettings>
</igWPF:XamDataGrid>

実装手順

この例では、F2 キーが押されたときに限り、複数セル編集を有効にします。

3つのイベントを組み合わせて実装します。

1. PreviewKeyDown イベント:選択セルの保存

ユーザーが F2 キーを押したタイミングで XamDataGrid.PreviewKeyDown イベントを処理し、現在選択されているセルをリストに格納します。

EditModeStarting イベントが発生する前に選択セルへアクセスする必要があるため、PreviewKeyDown イベントを使用します。

List<Cell> _cells = new List<Cell>();

private void _xamDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
	var grid = sender as XamDataGrid;
	if (grid == null) return;
	if (e.Key == Key.F2)
	{
		if (grid.SelectedItems?.Cells != null)
		{
			foreach (var item in grid.SelectedItems.Cells)
			{
				_cells.Add(item);
			}
		}
	}
}

2. EditModeStarting イベント:選択状態の維持

F2 キーが押されると XamDataGrid は編集モードに入り、EditModeStarting イベントが発生します。

編集モードに移行すると選択状態が解除されてしまうため、ここで保存済みのセルに対して選択状態を再設定します。これにより、どのセルが更新対象かをユーザーに視覚的に示すことができます。

private void _xamDataGrid_EditModeStarting(object sender, Infragistics.Windows.DataPresenter.Events.EditModeStartingEventArgs e)
{
	foreach (var cell in _cells)
	{
		cell.IsSelected = true;
	}
}

3. EditModeEnding イベント:複数セルへの値の反映

ユーザーが値を入力して編集を確定すると、EditModeEnding イベントが発生します。

ここで保存済みの各セルをループし、リフレクションを使用して Cell.Record.DataItem の対応プロパティを取得・更新します。すべての更新が完了したら、選択セルのリストをクリアします。

private void _xamDataGrid_EditModeEnding(object sender, Infragistics.Windows.DataPresenter.Events.EditModeEndingEventArgs e)
{
	if (_cells.Count > 0)
	{
		foreach (var cell in _cells)
		{
			if (cell?.Record?.DataItem != null && cell.Field != null && e.Editor != null)
			{
				var property = cell.Record.DataItem.GetType().GetProperty(cell.Field.Name);
				if (property != null)
				{
					property.SetValue(cell.Record.DataItem, e.Editor.Value, null);
				}
			}
		}
		_cells.Clear();
	}
}

以上で実装は完了です。

アプリケーションを実行し、XamDataGrid 上でCtrl キーを押しながらセルをクリックし、値を更新するセルを選択状態にします。

F2キーを押してセルの編集を開始し、値を変更します。

Enterキーを押して編集を完了すると、選択されていたセルの値が一斉に書き換わりました。

Tagged:

製品について

Ultimate UI for WPF