作成2013.05.01
数表を扱うには、DataGridView クラスを使用すると便利です。
アクティブセルのコピー・ペーストを追加してみました。
- 参照元情報
DataGridView クラスは
「DataGridView クラス」にジャンプする
で詳細の機能説明がありますが、かなり難解です。
- 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」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。
- 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の全コード
<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の全コード
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の全コード
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)複数セルのコピーとペーストはセレクトセル領域を配列として扱う必要があります。