46章:DataGridView(2)コピー・ペースト (C#)

    作成2013.05.01

     数表を扱うには、DataGridView クラスを使用すると便利です。 アクティブセルのコピー・ペーストを追加してみました。

  1. 参照元情報
     DataGridView クラスは
    「DataGridView クラス」にジャンプする
     で詳細の機能説明がありますが、かなり難解です。


  2. DataGridView(2)コピー・ペースト (C#)
    DataGridView クラスは名前空間: System.Windows.Forms、アセンブリ: System.Windows.Formsの機能であり、WPFではユーザコントロールを使用する必要があります。
     サンプルコードはDataGridView クラスの極一部の機能を利用して作成しました。アクティブセルのコピー・ペーストを追加してみました。
     ダウンロード後は解凍してから使用してください。
      [DataGridView(2)コピー・ペースト (C#)]をダウンロードする。
     解凍すると「46WpfDataGri2」フォルダーがあります。
    注(1)「46WpfDataGri2」フォルダーの「WpfDataGri1.sln」ファイルをダブルクリックすると「Express 2012 for Windows Desktop」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「WpfDataGri1.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. WpfDataGri1.slnの実行
    (1)「Express 2012 for Windows Desktop」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)画面が表示されます。
    (4)数表の直径の欄に数値を入力し、Enterで円の面積を計算します。
    (5)数表の行は自動的に追加されます。
    (6)F1キーを押すとアクティブセルの値はクリップボードの保存されます。
    (7)F2キーを押すとアクティブセルにクリップボードの値がペーストされます。
    (6)Buttonはデバッグ用です。
    (7)クローズボックスで終了します。


  4. プロジェクトの構成
    (1)MainWindow.xaml
    ・Button1とUserControl1を配置します。
    (2)MainWindow.xaml.cs
    ・コードを配置します。
    (3)UserCntrol1
    ・dataGridView1を配置します。
    (4)UserCntrol1.cs
    ・コードを配置します。


  5. MainWindow.xamlの全コード
    <Window x:Class="WpfDataGri1.MainWindow"	
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"	
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"	
            xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"	
            xmlns:self="clr-namespace:WpfDataGri1"	
            Title="円の面積の計算" Height="350" Width="525">	
        <Grid>	
            <Grid.RowDefinitions>	
                <RowDefinition Height="25" />	
                <RowDefinition Height="*" />	
            </Grid.RowDefinitions>	
            <StackPanel Grid.Row="0">	
                <Button x:Name="Button1" Content="Button" Width="80" HorizontalAlignment="Left" Click="Button1_Click"/>	
            </StackPanel>	
                <WindowsFormsHost x:Name="wfHost"  Grid.Row="1">	
                <self:UserControl1 x:Name="myControl"  />	
            </WindowsFormsHost>	
        </Grid>	
    </Window>	
    

    ・一般的な記述です。


  6. MainWindow.xaml.csの全コード

    using System.Windows;
    
    namespace WpfDataGri1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button1_Click(object sender, RoutedEventArgs e)
            {
                 var S = myControl.DGV.Rows[0].Cells[0].Value;
            }
        }
    }
    

    (1)private void Button1_Clickはデバッグ用であり、動作には影響しません。
    (2)var S = myControl.DGV.Rows[0].Cells[0].Value;でdataGridView1のセルの値を参照できます。


  7. UserCntrol1.csの全コード
    using System;
    using System.Windows.Forms;
    
    namespace WpfDataGri1
    {
        public partial class UserControl1 : UserControl
        {
            public double x;
            public double a;
            public DataGridView DGV;
    
            public UserControl1()
            {
                InitializeComponent();
                DGV = dataGridView1;
                dataGridView1.RowCount = 10;
            }
    
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                if (dataGridView1.RowCount >= 2)
                {
                    int ir = dataGridView1.CurrentCell.RowIndex;
                    int ic = dataGridView1.CurrentCell.ColumnIndex;
                    
                    x = Convert.ToDouble(dataGridView1.Rows[ir].Cells[0].Value);
                    a = Math.PI * x * x / 4;
                    dataGridView1.Rows[ir].Cells[1].Value = a.ToString();
                }
            }
    
            private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
            {
                var k = e.KeyCode;
                if (k == Keys.F1)//コピー
                {
                    var cc = dataGridView1.CurrentCellAddress;
                    if (dataGridView1.Rows[cc.Y].Cells[cc.X].Value != null)
                    {
                        System.Windows.Forms.Clipboard.SetDataObject(new DataObject(dataGridView1.Rows[cc.Y].Cells[cc.X].Value));
                    }
                }
    
                if (k == Keys.F2)//ペースト
                {
                    var cc = dataGridView1.CurrentCellAddress;
                    var objData = System.Windows.Forms.Clipboard.GetDataObject();
    
                    if (objData.GetDataPresent(DataFormats.StringFormat))
                    {
                        String str = (String)objData.GetData(DataFormats.StringFormat);  
                        if (str != "dataGridView1.Rows[cc.Y].Cells[cc.X].Value")
                        {    
                            dataGridView1.Rows[cc.Y].Cells[cc.X].Value = str;        
                        }         
                    }
                }
            }
        }
    }
    

    (1)f (k == Keys.F1)はF1キーを押された場合、以下を実行します。
    (2)var cc = dataGridView1.CurrentCellAddress;でカレントセルの座標を得ます。
    (3)System.Windows.Forms.Clipboard.SetDataObject(new DataObject(dataGridView1.Rows[cc.Y].Cells[cc.X].Value));でカレントセルの値をクリップボードにコピーします。
    (4) if (k == Keys.F2)はF2キーを押された場合、以下を実行します。
    (5)var objData = System.Windows.Forms.Clipboard.GetDataObject();でクリップボードの内容を変数objDataに設定します。
    (6)String str = (String)objData.GetData(DataFormats.StringFormat);で文字に変換します。
    (7)dataGridView1.Rows[cc.Y].Cells[cc.X].Value = str;でカレントセルに文字を設定します。


    感想:
    (1)カレントセルのコピーとペーストは比較的簡単なコードで記載できます。
    (2)複数セルのコピーとペーストはセレクトセル領域を配列として扱う必要があります。







47章:[C#/VB/XAML] データグリッド (DataGrid) を利用するには (WPF)に行く。

トップページに戻る。