作成2013.05.01
 数表を扱うには、DataGridView クラスを使用すると便利です。
アクティブセルのコピー・ペーストを追加してみました。
 参照元情報 参照元情報
 DataGridView クラスは
 「DataGridView クラス」にジャンプする
 で詳細の機能説明がありますが、かなり難解です。
 
 
 
 DataGridView(2)コピー・ペースト  (C#) DataGridView(2)コピー・ペースト  (C#)
 DataGridView クラスは名前空間: System.Windows.Forms、アセンブリ: System.Windows.Formsの機能であり、WPFではユーザコントロールを使用する必要があります。
 サンプルコードはDataGridView クラスの極一部の機能を利用して作成しました。アクティブセルのコピー・ペーストを追加してみました。
 ダウンロード後は解凍してから使用してください。
  [DataGridView(2)コピー・ペースト  (C#)]をダウンロードする。 [DataGridView(2)コピー・ペースト  (C#)]をダウンロードする。
 解凍すると「46WpfDataGri2」フォルダーがあります。
 注(1)「46WpfDataGri2」フォルダーの「WpfDataGri1.sln」ファイルをダブルクリックすると「Express 2012 for Windows Desktop」が起動します。
 注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
 注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
 注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
 注(5)「WpfDataGri1.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。
 
 
 
 WpfDataGri1.slnの実行 WpfDataGri1.slnの実行
 (1)「Express 2012 for Windows Desktop」のデバッグ機能を使用します。
 (2)「デバッグ」_「デバッグ開始」を選択します。
 (3)画面が表示されます。
 (4)数表の直径の欄に数値を入力し、Enterで円の面積を計算します。
 (5)数表の行は自動的に追加されます。
 (6)F1キーを押すとアクティブセルの値はクリップボードの保存されます。
 (7)F2キーを押すとアクティブセルにクリップボードの値がペーストされます。
 (6)Buttonはデバッグ用です。
 (7)クローズボックスで終了します。
 
 
 
 プロジェクトの構成 プロジェクトの構成
 (1)MainWindow.xaml
 ・Button1とUserControl1を配置します。
 (2)MainWindow.xaml.cs
 ・コードを配置します。
 (3)UserCntrol1
 ・dataGridView1を配置します。
 (4)UserCntrol1.cs
 ・コードを配置します。
 
 
 
 MainWindow.xamlの全コード 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>	
 ・一般的な記述です。
 
 
 
 MainWindow.xaml.csの全コード 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のセルの値を参照できます。
 
 
 
 UserCntrol1.csの全コード 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)複数セルのコピーとペーストはセレクトセル領域を配列として扱う必要があります。