我的DataGrid控件有一个右键单击上下文菜单。其中一个菜单项是“全部复制”。当用户点击“全部复制”时它应该将所有datagrid内容复制到剪贴板,以便用户可以将其粘贴到Excel中。
我正在查看ApplicationCommands.Copy命令,但似乎只适用于所选项目。所以我试图在命令处理程序中选择所有单元格,执行Copy命令然后取消选择所有单元格:
SelectAllCells();
ApplicationCommands.Copy.Execute(null, this);
UnselectAllCells();
但是,如果用户选择了多行(例如第1,3和5行)并点击了“全部复制”,该怎么办?在这种情况下,我应该在选择所有单元格并执行复制命令后恢复其选择。我怎样才能做到这一点?
答案 0 :(得分:1)
它有点繁琐,但可以做到。 基本前提是在选择所有内容之前记下您选择的内容;然后在复制后重新选择这些记录。
Distinct()之后的ToList()不重要。如果没有这个,由于LINQ的延迟执行,它将无法工作。
我还在代码中添加了禁用调度程序处理的功能。这将阻止在调度程序上处理消息(即,在程序操作发生时将阻止屏幕重绘)
var selectionMode = dg.SelectionMode;
var token = Application.Current.Dispatcher.DisableProcessing();
var selectedItems = dg.SelectedCells.Select(x => x.Item).Distinct().ToList();
try
{
dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
dg.SelectionMode = DataGridSelectionMode.Extended;
dg.SelectAll();
ApplicationCommands.Copy.Execute(null, dg);
}
catch
{
}
finally
{
dg.SelectionMode = selectionMode;
dg.UnselectAll();
foreach (var selectedItem in selectedItems)
{
dg.SelectedItems.Add(selectedItem);
var row = dg.ItemContainerGenerator.ContainerFromItem(selectedItem) as DataGridRow;
if (row != null)
{
DataGridCell cell = GetCell(dg, row, 0);
if (cell != null)
{
cell.Focus();
}
}
}
token.Dispose();
}
dg是DataGrid的名称。
可以在此link上找到静态GetCell方法的代码。