DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridのセル内の一部分をCtrl+Cでクリップボード上に格納する方法は?

環境/言語:[OS : Windows 2000 Professional / 言語 : C# / .NET Framework : 1.1]
分類:[.NET]

お疲れ様です。JAR所属のbettaと申します。
よろしくお願いします。

【解決したい問題】

DataGridについての質問ですが、
セル内の一部分を選択して、Ctrl+Cでクリップボード上に
データを格納したいのですが、セル内の全てが格納されてしまいます。
選択部分だけ、クリップボード上に格納するには、
どうやればよいのでしょうか?
> DataGridについての質問ですが、
> セル内の一部分を選択して、Ctrl+Cでクリップボード上に
> データを格納したいのですが、セル内の全てが格納されてしまいます。
> 選択部分だけ、クリップボード上に格納するには、
> どうやればよいのでしょうか?

とりあえずは、次のようにすればできそうです。

まず、DataGridのProcessCmdKeyメソッドをオーバーライドし、Ctrl+Cが押された時の動作を変えます。

protected override bool ProcessCmdKey(
ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;

if (msg.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)(int)keyData & Keys.KeyCode;
if ((keyData & Keys.Control) == Keys.Control &&
keyCode == Keys.C)
{
//(選択された文字列をコピーするコードを書く)
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}

上の
//(選択された文字列をコピーするコードを書く)
の部分に選択されている文字列をコピーするコードを書きます。これには、次のページを参考にしてください。

DataGridで選択されたセル内の選択された文字列を取得する
http://dobon.net/vb/dotnet/datagrid/selectedstringincell.html

クリップボードに文字列をコピー、クリップボードから文字列を取得
http://dobon.net/vb/dotnet/string/clipboard.html
■No8454に返信(管理人さんの記事)
お疲れ様です。JAR所属のbettaです。
管理人様、ご回答ありがとうございました。
教えていたただいた方法で、うまくいきました。

コードは、こんなかんじになりました。
DataGridTextBoxColumnExは、キーワードをハイライトする処理を追加した、DataGridColumnStyleクラスの派生クラスです。

public class DataGridEx : System.Windows.Forms.DataGrid
{
public DataGridEx() : base()
{
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;

if (msg.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)(int)keyData & Keys.KeyCode;
if ((keyData & Keys.Control) == Keys.Control && keyCode == Keys.C)
{
//(選択された文字列をコピーするコードを書く)
//テーブルスタイルの取得
DataGridTableStyle ts;
ts = this.TableStyles[0];

//選択されている列の取得
int cn = this.CurrentCell.ColumnNumber;

//DataGridTextBoxColumnの取得
DataGridTextBoxColumnEx cs = (DataGridTextBoxColumnEx)ts.GridColumnStyles[cn];

//TextBoxの取得
TextBox tb = cs.TextBox;

//クリップボード上にデータを格納
Clipboard.SetDataObject(tb.SelectedText);

return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板