2015-03-13 39 views
0

我有一個右鍵單擊我的DataGrid控件的上下文菜單。其中一個菜單項是「全部複製」。當用戶點擊「全部複製」時,它應該將所有數據網格內容複製到剪貼板,以便用戶可以將其粘貼到Excel中。在調用SelectAllCells()後恢復datagrid中的原始選擇

我在看ApplicationCommands.Copy命令,但似乎只適用於選定項目。所以我想在我的命令處理程序來選擇所有單元格,執行復制命令,然後取消選擇所有單元格:

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

但是,如果用戶選擇幾行(例如行1,3和5)什麼,並點擊「全部複製「。在這種情況下,我應該在選擇所有單元格並執行復制命令後恢復其選擇。我怎樣才能做到這一點?

回答

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方法的代碼。

+0

謝謝!有用。可能只有一點我有。我將得到InvalidOperationException(只能在多種選擇模式下更改SelectedItems集合,在單選模式下使用SelectedItem。)如果我的DataGrid的SelectionMode設置爲Single,則在dg.SelectedItems.Add(selectedItem)行中。所以我認爲我應該在foreach循環後恢復原始SelectionMode以避免此異常。 – AndreyS 2015-03-16 12:31:52

+0

是的,你是對的。很高興它的工作原理 - 如果你對此感到滿意,你會介意接受答案嗎? – 2015-03-16 14:37:39

相關問題