调用SelectAllCells()后恢复数据网格中的原始选择

时间:2015-03-13 15:09:08

标签: wpf datagrid code-behind

我的DataGrid控件有一个右键单击上下文菜单。其中一个菜单项是“全部复制”。当用户点击“全部复制”时它应该将所有datagrid内容复制到剪贴板,以便用户可以将其粘贴到Excel中。

我正在查看ApplicationCommands.Copy命令,但似乎只适用于所选项目。所以我试图在命令处理程序中选择所有单元格,执行Copy命令然后取消选择所有单元格:

SelectAllCells();
ApplicationCommands.Copy.Execute(null, this);
UnselectAllCells(); 

但是,如果用户选择了多行(例如第1,3和5行)并点击了“全部复制”,该怎么办?在这种情况下,我应该在选择所有单元格并执行复制命令后恢复其选择。我怎样才能做到这一点?

1 个答案:

答案 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方法的代码。