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

listViewからrichTextBoxへのDrag&Drop

環境/言語:[Windows 7/Vista MS2010 C# Winアプリ]
分類:[.NET]

お世話になります。

listViewからrichTextBoxへのDrag&Dropをしようとしています。

richTextBoxのDrag&Dropは、下記でやってます。
richTextBox1.AllowDrop = true;
richTextBox1.EnableAutoDragDrop = true;

listViewは、下記のとおりでDragは、開始しますが、richTextBox上に来た時に
禁止マークになりdropできません。

private void listView2_ItemDrag(object sender, ItemDragEventArgs e)
{
listView1.DoDragDrop((ListViewItem)e.Item, DragDropEffects.Copy/* | DragDropEffects.Move*/);
}
private void listView2_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
e.Effect = DragDropEffects.Copy;
}
private void listView2_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
{
Point p = this.listView2.PointToClient(new Point(e.X, e.Y));
ListViewItem item = this.listView2.GetItemAt(p.X, p.Y);
if (item != null)
}
}

下記のように書いた時、richTextBox1_DragEnter()は、呼ばれますが、_DragDrop()は、呼び出されません。
this.richTextBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.richTextBox1_DragEnter);
this.richTextBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.richTextBox1_DragDrop);
private void richTextBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
e.Effect = DragDropEffects.Copy;
}
private void richTextBox1_DragDrop(object sender, DragEventArgs e)
{
string txt=e.Data.GetData(DataFormats.Text).ToString();
}

どのようにしたら、listView -> textBoxへのドロップができますか?教えてください。
■No30538に返信(hiroさんの記事)
> お世話になります。

> listView1.DoDragDrop((ListViewItem)e.Item, DragDropEffects.Copy/* | DragDropEffects.Move*/);
Moveも指定すれば大丈夫だと思います。
■No30539に返信(shuさんの記事)
> ■No30538に返信(hiroさんの記事)
>>お世話になります。
>
>> listView1.DoDragDrop((ListViewItem)e.Item, DragDropEffects.Copy/* | DragDropEffects.Move*/);
> Moveも指定すれば大丈夫だと思います。

お世話になります。
リストビューから移動でなくコピーしたいと思ってこの部分をコメントにしてましたけど違ってたんですね。

DragEnter()での処理で移動かコピーか、セットできますね。


ここまでは、出来ましたが、よろしければもう少し教えてください。


RichTextBox1_DragDrop() での処理で指定した位置にドロップする処理で下記のようにしてみましたが、位置が正しくありません。
マウスカーソルの位置を期待してますが、実際は、それより数十文字先から文字終りにドロップします。
【ドロップする部分】
Point pt = new Point(e.X, e.Y);
int pos=richTextBox1.GetCharIndexFromPosition(pt);
string dat = richTextBox1.Text;
dat = dat.Substring(0, pos) + txt + dat.Substring(pos);
richTextBox1.Text = dat;

また、可能ならtextBox上にマウスが来たらカーソルを移動してドロップ場所を知らせるようにしたいのですが、どうしたらできますか?
下記では、何の変化も見られません。
richTextBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
{
e.Effect = DragDropEffects.Copy;

Point pt = new Point(e.X, e.Y);
int pos = richTextBox1.GetCharIndexFromPosition(pt);
richTextBox1.SelectionStart = pos;
}
}

ここまで書いておいてなんですが、DragDrop() にコードを書かなくても自動的にrichTextBox内でのDrag&Dropのように行われるということはないんですよね?
2012/06/06(Wed) 11:44:07 編集(投稿者)

■No30541に返信(hiroさんの記事)

> ここまで書いておいてなんですが、DragDrop() にコードを書かなくても自動的にrichTextBox内でのDrag&Dropのように行われるということはないんですよね?
ドラッグ開始時にListViewItemでなく、挿入するテキストであるListViewItem.Textを設定すれば、richTextBox1.EnableAutoDragDrop = true;
の効果により可能です。ドラッグ開始までコーディングすればいいです。
リストビュー内でのドラッグ処理があるとしたらドラッグターゲットはテキストにしてドラッグアイテムは別に変数退避をすると良いかもしれません。


一応マウス座標についてですが
richTextBox1.PointToClient(pt)にてクライアント座標に変換しないと駄目です。
> ドラッグ開始時にListViewItemでなく、挿入するテキストであるListViewItem.Textを設定すれば、richTextBox1.EnableAutoDragDrop = true;
> の効果により可能です。ドラッグ開始までコーディングすればいいです。
あっ!そういうことでしたか。今のコードは、リストのアイテムだったので書きだされなかったのですね。
つまり、貼り付け先のコントロールの出力に合わせた内容でドラッグを開始すればいいということですね。

ありがとうございました。
解決済み!

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