kaz-chan
@kaz-chan (kaz)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

backgroundWorkerでドラッグアンドドロップされてきたコントロール名

Q&A

Closed

解決したいこと

panel1にファイルをドラッグアンドドロップしbackgroundWorkerのDoWorkイベント内でファイル名は取得できますが、ドラッグアンドドロップされてきた元のコントロール名(この場合panel1)を取得したいのですがどのようにすればいいでしょうか。
DoWorkイベント内でドラッグアンドドロップされてきた元のコントロールによって処理を変えたいのです。
低空飛行な質問になっているかもしれませんが解決方法を教えてくだされば幸いです。

0

1Answer

BackgroundWorkerということは、Windowsフォームアプリでしょうか。
開発環境、フレームワークのバージョン、プロジェクトの種類は回答に影響する場合もあるので、記載するようにしてください。

発生元コントロールを取得するなら、単純にDragDropイベントのsenderから取得すればいいと思うのですが。

    using System.Threading.Tasks;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var panels = new[] { panel1, panel2 };
            foreach(var panel in panels)
            {
                panel.DragEnter += (sender, e) =>
                {
                    if (e.Data.GetDataPresent(DataFormats.FileDrop))
                        e.Effect = DragDropEffects.Copy;
                    else
                        e.Effect = DragDropEffects.None;
                };

                panel.DragDrop += (sender, e) =>
                {
                    _ = DragDropTask((Control)sender, (string[])e.Data.GetData(DataFormats.FileDrop, false));
                };
            }
        }

        private async Task DragDropTask(Control control, string[] dropFiles)
        {
            textBox1.AppendText($"{control.Name}{dropFiles[0]} がドロップされました\r\n");

            switch( control.Name )
            {
                case "panel1":
                    await HeavyTask_Panel1();
                    break;

                case "panel2":
                    await HeavyTask_Panel2();
                    break;
            }

            textBox1.AppendText($"DragDropTask終了\r\n");
        }

        private async Task HeavyTask_Panel1()
        {
            textBox1.AppendText($"panel1の重い処理を実行(3秒待機)\r\n");
            await Task.Delay(3000);
        }

        private async Task HeavyTask_Panel2()
        {
            textBox1.AppendText($"panel2の重い処理を実行(5秒待機)\r\n");
            await Task.Delay(5000);
        }
    }
1Like

Comments

  1. @kaz-chan

    Questioner

    情報不足大変失礼しました。
    ご指摘通りwindowsフォームアプリになります。
    MS-Studio2015で、言語はC#になり、フレームワークは.NETは4.6.1となっております。
  2. 簡単なサンプルを追記しました。
  3. @kaz-chan

    Questioner

    ありがとうございました。参考にさせていただきます。

Your answer might help someone💌