none
RichTextBox でDragDropのデータを受け取る RRS feed

  • 質問

  • お世話になります。

    表題の通りなのですが、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

    2018年10月25日 5:45

回答

  • DoDragDropメソッドを実行していないからだと思います。詳しくは以下を参照下さい。

    Drag&Dropを行う
    https://dobon.net/vb/dotnet/control/draganddrop.html


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク ferret001 2018年10月26日 0:29
    2018年10月25日 7:12
    モデレータ
  • まず、ドロップされる側におけるドラッグ中に発生するイベントは、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
    2018年10月25日 7:50

すべての返信

  • DoDragDropメソッドを実行していないからだと思います。詳しくは以下を参照下さい。

    Drag&Dropを行う
    https://dobon.net/vb/dotnet/control/draganddrop.html


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク ferret001 2018年10月26日 0:29
    2018年10月25日 7:12
    モデレータ
  • まず、ドロップされる側におけるドラッグ中に発生するイベントは、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
    2018年10月25日 7:50
  • trapemiya様、Hongliang様、お世話になります。

    > AllowedEffectsがCopyなのにEffectがMoveとなって、不一致によりドロップ不可となります。

    そうなんですね、そんなことググっても出てきませんでした。

    おかげさまで、うまく行きました。

    ありがとうございました。

    2018年10月26日 0:29