调用 SelectAllCells() 后恢复数据网格中的原始选择
Restore original selection in datagrid after calling SelectAllCells()
我的 DataGrid 控件有一个右键单击上下文菜单。它的菜单项之一是 'Copy All'。当用户单击 'Copy All' 时,它应该将所有数据网格内容复制到剪贴板,以便用户可以将其粘贴到 Excel。
我正在查看 ApplicationCommands.Copy 命令,但它似乎只适用于 selected 项目。所以我试图 select 我的命令处理程序中的所有单元格,执行复制命令,然后取消 select 所有单元格:
SelectAllCells();
ApplicationCommands.Copy.Execute(null, this);
UnselectAllCells();
但是,如果用户 select 编辑了几行(例如第 1,3 和 5 行)并单击 'Copy All' 会怎么样?在这种情况下,我应该在 selecting 所有单元格并执行复制命令后恢复他的 selection。我怎样才能做到这一点?
有点繁琐,但可以做到。
基本前提是记下您 select 在 select 一切之前编辑的内容;然后重新select复制后的那些记录。
不是 ToList() 之后的 Distinct() 很重要。由于 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 的名称。
静态 GetCell 方法的代码可以在此 link.
上找到
我的 DataGrid 控件有一个右键单击上下文菜单。它的菜单项之一是 'Copy All'。当用户单击 'Copy All' 时,它应该将所有数据网格内容复制到剪贴板,以便用户可以将其粘贴到 Excel。
我正在查看 ApplicationCommands.Copy 命令,但它似乎只适用于 selected 项目。所以我试图 select 我的命令处理程序中的所有单元格,执行复制命令,然后取消 select 所有单元格:
SelectAllCells();
ApplicationCommands.Copy.Execute(null, this);
UnselectAllCells();
但是,如果用户 select 编辑了几行(例如第 1,3 和 5 行)并单击 'Copy All' 会怎么样?在这种情况下,我应该在 selecting 所有单元格并执行复制命令后恢复他的 selection。我怎样才能做到这一点?
有点繁琐,但可以做到。 基本前提是记下您 select 在 select 一切之前编辑的内容;然后重新select复制后的那些记录。
不是 ToList() 之后的 Distinct() 很重要。由于 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 的名称。
静态 GetCell 方法的代码可以在此 link.
上找到