/// <summary>
/// キーダウンイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGrid_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.V)
{
if (Keyboard.Modifiers == ModifierKeys.Control)
{
var dataGrid = sender as DataGrid;
if (dataGrid != null)
{
pasteClipboard(dataGrid);
}
}
}
}
/// <summary>
/// クリップボード貼り付け
/// </summary>
/// <param name="dataGrid"></param>
private void pasteClipboard(DataGrid dataGrid)
{
try
{
// 張り付け開始位置設定
var startRowIndex = dataGrid.ItemContainerGenerator.IndexFromContainer(
(DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem
(dataGrid.CurrentCell.Item));
var startColIndex = dataGrid.SelectedCells[0].Column.DisplayIndex;
// クリップボード文字列から行を取得
var pasteRows = ((string)Clipboard.GetData(DataFormats.Text)).Replace("\r", "")
.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
var maxRowCount = pasteRows.Count();
for (int rowCount = 0; rowCount < maxRowCount; rowCount++)
{
var rowIndex = startRowIndex + rowCount;
// タブ区切りでセル値を取得
var pasteCells = pasteRows[rowCount].Split('\t');
// 選択位置から列数繰り返す
var maxColCount = Math.Min(pasteCells.Count(), dataGrid.Columns.Count - startColIndex);
for (int colCount = 0; colCount < maxColCount; colCount++)
{
var column = dataGrid.Columns[colCount + startColIndex];
// 貼り付け
if (!byteFiled.Contains(column.Header.ToString()))
{
column.OnPastingCellClipboardContent(dataGrid.Items[rowIndex], pasteCells[colCount]);
}
}
}
// 選択位置復元
dataGrid.CurrentCell = new DataGridCellInfo(
dataGrid.Items[startRowIndex], dataGrid.Columns[startColIndex]);
}
catch
{
}
}
MVVM で実装されている場合は Behavior で KeyDown イベントを引っ掛けてあげれば OK です。
/// <summary>
/// アタッチ
/// </summary>
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.KeyDown += dataGrid_KeyDown;
}
0 件のコメント:
コメントを投稿