1

データベースに保存されているブロブ (ファイル PDF/JPG/など) を含むデータベースからのレコードを表示する Form 上の GridView を備えた C# WinForms アプリケーションがあります。

グリッド内の行をダブルクリックして、ブロブをディスクに書き込み、ファイルを開くことができます。行をシングルクリックして 1 つまたは複数の行を選択できます (ctrl+shift を使用) ファイルをグリッドにドラッグして、ファイルを行としてグリッド (およびデータベース) に追加できます

ここで、ユーザーが 1 つ以上の行をグリッドから、たとえばデスクトップやメールクライアントにドラッグできるようにしたいのですが、どのイベントで「ドラッグ」操作を開始するかわかりません。

ユーザーがマウスの左ボタンを使用して 1 つ以上のファイルを選択すると、ドラッグは同じマウスの左ボタンを使用し、両方のイベントがマウスダウン イベントをトリガーします。ユーザーがこれから何をしようとしているのかをどのように判断しますか?

マウスダウンイベントでドラッグ操作を開始しようとしましたが、複数の行を選択したい場合、行をクリックするたびにドラッグ操作が開始されます...

たとえば、Windowsエクスプローラーではどのように処理されますか? ユーザーが何をしようとしているのかをどのように検出しますか?

4

3 に答える 3

8

私は今それを働かせました。ただし、提案されているようにタイマーを使用しませんでした。

マウスダウンでは、フラグを設定して X、Y ポイントを保存し、マウスアップではフラグをリセットし、マウス移動では、移動が X または Y で 10 ピクセルを超える場合、保存された X、Y ポイントに基づいて移動を計算します。方向ドラッグ操作を開始します。

これがコードです。

'

    private bool DraggingFromGrid = false;
    private System.Drawing.Point DraggingStartPoint = new System.Drawing.Point(  );

    void GridControlBrowser_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            DraggingFromGrid = true;
            DraggingStartPoint = new System.Drawing.Point(e.X, e.Y);
        }
    }

    void GridControlBrowser_MouseUp(object sender, MouseEventArgs e)
    {
        if (DraggingFromGrid)
        {
            DraggingFromGrid = false;
        }
    }

    void GridControlBrowser_MouseMove(object sender, MouseEventArgs e)
    {
        if (DraggingFromGrid)
        {
            if (System.Math.Abs(e.X - DraggingStartPoint.X) > 10 ||
                System.Math.Abs(e.Y - DraggingStartPoint.Y) > 10)
            {
                StartDragging();
            }
        }
    }

    private void StartDragging()
    {
        DraggingFromGrid = false;

        // create files
        var _criteria = this.GetSelectionFromGrid();
        var _files = new List<string>();

        ... retrieve filenames and store in _files List ...

        var _data = new DataObject(DataFormats.FileDrop, _files.ToArray());

        DoDragDrop(_data, DragDropEffects.Copy);
    }

'

于 2013-06-25T09:15:06.813 に答える