2017-08-28 16 views
3

私の職場では、一般的な会社のスプレッドシートを作成するための社内プログラムを開発しています。私たちのプログラムはあまりにも多くの機能を必要としませんが、1つはセルをクリックして上下左右にドラッグして元のセルの内容をExcelのようにユーザーが選択したセル。WPF DataGridの「ドラッグ&コピー」

確かな、曖昧ではない、文脈の答えに対する私の検索は実りありませんでした。私がこれについて何かを見つけるのに最も近いのは、this SO questionと、データグリッド上の行の物理的な位置を移動する記事です。この質問の作成者は、「ドラッグアンドコピー」の実装を完全にスキップしたと報告して、成功しませんでした。

MVVMに基づいて構築されたアプリケーションでこの機能を実装する方法はありますか?

答えて

1

単純XAML - 、SelectionUnitを注意SelectedCellsChangesとkeyUpイベントイベントはいくつかの単純なC#コードデータグリッドに

<Window x:Class="WpfApp4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApp4" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid x:Name="MyGrid" HorizontalAlignment="Left" Height="276" Margin="18,21,0,0" VerticalAlignment="Top" Width="466" SelectionUnit="Cell" SelectedCellsChanged="SelectionChanged" KeyUp="MyGrid_PreviewKeyUp"/> 
    </Grid> 
</Window> 

を追加:

using System; 
    using System.Collections.Generic; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Input; 

    namespace WpfApp4 
    { 
     public class MyItems 
     { 
      public int Col1 { get; set; } 
      public int Col2 { get; set; } 
      public int Col3 { get; set; } 
      public int Col4 { get; set; } 
     } 

     public partial class MainWindow : Window 
     { 
      // create a source for the datagrid 
      public List<MyItems> DataList { get; set; } 

      // somewhere to hold the selected cells 
      IList<DataGridCellInfo> DataGridSelectedCells { get; set; } 

      public MainWindow() 
      { 
       InitializeComponent(); 
       DataContext = this; 

       DataList = new List<MyItems>() 
       { 
        new MyItems() { Col1=1, Col2=2, Col3=3, Col4=4}, 
        new MyItems() { Col1=5, Col2=6, Col3=7, Col4=8}, 
        new MyItems() { Col1=9, Col2=10, Col3=11, Col4=12}, 
        new MyItems() { Col1=13, Col2=14, Col3=15, Col4=16}, 
       }; 

       MyGrid.ItemsSource = DataList; 

      } 

      private void SelectionChanged(object sender, SelectedCellsChangedEventArgs e) 
      { 
       DataGridSelectedCells = MyGrid.SelectedCells; 
      } 

      private void MyGrid_PreviewKeyUp(object sender, KeyEventArgs e) 
      { 
       // Check your key here (Ctrl D, Ctrl R etc)     
       // then loop around your data looking at what is selected 
       // chosing the direction based on what key was pressed  
       foreach (DataGridCellInfo d in DataGridSelectedCells) 
       { // get the content of the cell   
        var cellContent = d.Column.GetCellContent(d.Item); 
        if (cellContent != null) 
        { // if it's not null try to get the content 
         DataGridCell dc = (DataGridCell)cellContent.Parent; 
         TextBlock tb = (TextBlock)dc.Content; 

         // Change the contents of tb.Content here 
         // or dump for debugging 
         Console.WriteLine(tb.Text); 
        } 
       } 
      } 
     } 
} 

ユーザが任意の方向にセルをドラッグすると 'ができますGridSelectedCells 'は選択されたセルのみで塗りつぶします。 KeyUp(またはその他の優先)イベントを使用して、ユーザーがコピーする(またはコンテキストメニューで右クリックイベントを実装する)ようにし、必要に応じてデータをループしてコピーします。

完全な解決策ではありませんが、開始する必要があります。