XamDataGrid は、FieldLayoutSettings の AllowClipboardOperations プロパティに AllowClipboardOperations 列挙値の組み合わせを設定することで、クリップボード操作の有効・無効を制御できます。この機能を有効にした場合、コピーされる文字列は XamDataGrid に表示されているテキストとなるのが既定の動作です。
💡備考
XamDataGrid では柔軟にセルの表示様式・形態をカスタマイズできます。そのカスタマイズの仕方によっては表示されているテキストが必ずしもコピーされるとは限りません。ここでは、データをそのままバインドし、すべて既定の状態で表示させていて、そこにクリップボード操作を有効にする設定を追加したものとして話を進めて行きます。
そこで、表示テキストではなく、元の値や別の書式でコピーしたいという要件がある場合はどうしたらいいか、という問題が出てきます。この記事ではその実装方法をご案内します。
実装方法
XamDataGrid の ClipboardCopying イベントを使い、コピーされたセル値を保持している CellValueHolder クラス オブジェクトの Value プロパティにコピーしたいテキストを与え、IsDisplayText プロパティに true を代入します。
例えば XamDataGrid は decimal 値を通貨記号付きかつ桁区切り付きでセルに表示します。それを通貨記号は無しにして桁区切りだけつけてコピーしたい場合は以下のようなコードになります。
private void XamDataGrid_ClipboardCopying(object sender, Infragistics.Windows.DataPresenter.Events.ClipboardCopyingEventArgs e)
{
// コピーされるセルの CellValueHolder をイベント引数の e.Values から取得し、
// 順に処理していきます。
foreach(var cellValueHolder in e.Values)
{
if(cellValueHolder.Value is decimal price)
{
cellValueHolder.Value = price.ToString("N0");
cellValueHolder.IsDisplayText = true;
}
}
}
実行結果

応用編
1. 元の値をコピーしたい場合
Value にすでに元の値が入っていることが多いので、IsDisplayText を true にするだけで元の値がコピーされるようになることが多いです。
private void XamDataGrid_ClipboardCopying(object sender, Infragistics.Windows.DataPresenter.Events.ClipboardCopyingEventArgs e)
{
foreach(var cellValueHolder in e.Values)
{
if(cellValueHolder.Value is decimal price)
{
cellValueHolder.IsDisplayText = true;
}
}
}
2. なにもコピーしたくない場合
画像が表示されているセルなど、何もコピーしない方がいい場合は、CellValueHolder の Value に空文字列を設定します。
private void XamDataGrid_ClipboardCopying(object sender, Infragistics.Windows.DataPresenter.Events.ClipboardCopyingEventArgs e)
{
foreach(var cellValueHolder in e.Values)
{
if( なにもコピーしないセルなら )
{
cellValueHolder.Value = "";
cellValueHolder.IsDisplayText = true;
}
}
}