トップ回答者
RichTextBox でDragDropのデータを受け取る

質問
-
お世話になります。
表題の通りなのですが、dataGridViewのカラム上のデータをDragDropでrichExitBoxに移したいのですが、richEditBoxは受け取り拒否のアイコンのままです。
プロパティの設定事項は、下記以外何かありますでしょうか?
richTextBox1.AllowDrop = true;
richTextBox1.EnableAutoDragDrop = true;実際
this.richTextBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.richTextBox_DragEnter);
を追加し
private void richTextBox_DragEnter(object sender, DragEventArgs e)
{
try
{
string name = ((System.Windows.Forms.RichTextBox)sender).Name;e.Effect = DragDropEffects.Copy;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}としてもアイコンに変化ありません。上記ハンドラは呼ばれています。
教えてください。お願いします。
Windows10 C# WinForm VS2010
回答
-
まず、ドロップされる側におけるドラッグ中に発生するイベントは、DragEnterのほかにDragOverというのが存在します。これはコントロール上でマウスカーソルが移動するなど様々な条件で発生し、DragEnterでの設定を上書きします。なおRichTextBoxではインテリセンスには表示されません。
さて、Windows標準では、そのままのドラッグは移動、Ctrlキーを押しながらのドラッグがコピー、となっています。
RichTextBoxもこの仕様に従っているようで、DragEnterおよびDragOverイベントでは、Ctrlキー無しのドラッグ中は、Effectの初期値にMoveを設定します。たとえアプリケーション側でDragEnterにてCopyを設定しても、直後に発生するDragOverでMoveに書き換えられます。
その結果、DoDragDropするときにDragDropEffects.Copyを設定した場合、AllowedEffectsがCopyなのにEffectがMoveとなって、不一致によりドロップ不可となります。
// ちなみにCtrlキー有りのドラッグ中はEffectの初期値がCopyとなるため、DragEnterなど記述しなくてもドロップできるようになったりします。
一番手っ取り早いのは、DoDragDropの第2引数に DragDropEffects.Copy | DragDropEffects.Move、と両方のEffectを許可することです。
他には、RichTextBoxのDragOverイベントでEffectを適切に設定する、でも可能です。
- 回答としてマーク ferret001 2018年10月26日 0:29
すべての返信
-
まず、ドロップされる側におけるドラッグ中に発生するイベントは、DragEnterのほかにDragOverというのが存在します。これはコントロール上でマウスカーソルが移動するなど様々な条件で発生し、DragEnterでの設定を上書きします。なおRichTextBoxではインテリセンスには表示されません。
さて、Windows標準では、そのままのドラッグは移動、Ctrlキーを押しながらのドラッグがコピー、となっています。
RichTextBoxもこの仕様に従っているようで、DragEnterおよびDragOverイベントでは、Ctrlキー無しのドラッグ中は、Effectの初期値にMoveを設定します。たとえアプリケーション側でDragEnterにてCopyを設定しても、直後に発生するDragOverでMoveに書き換えられます。
その結果、DoDragDropするときにDragDropEffects.Copyを設定した場合、AllowedEffectsがCopyなのにEffectがMoveとなって、不一致によりドロップ不可となります。
// ちなみにCtrlキー有りのドラッグ中はEffectの初期値がCopyとなるため、DragEnterなど記述しなくてもドロップできるようになったりします。
一番手っ取り早いのは、DoDragDropの第2引数に DragDropEffects.Copy | DragDropEffects.Move、と両方のEffectを許可することです。
他には、RichTextBoxのDragOverイベントでEffectを適切に設定する、でも可能です。
- 回答としてマーク ferret001 2018年10月26日 0:29