1

C# でツリービューを使用してドラッグ アンド ドロップを行う必要があります。そのために、3 つのイベントが最も一般的であると聞きました。

ここでは、ツリービューからドラッグしているときにitemDragイベントが発生していますが、残りの両方のイベントが発生していません.多くのソリューションを試し、解決策を求めてここに来ました

    private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
       string[] strItem = e.Item.ToString().Split(':');
       DoDragDrop(strItem[1], DragDropEffects.Copy | DragDropEffects.Move); }

上記のメソッドが起動し、

    private void treeView1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }

上記のdragEnterイベントが発生していません.同様に、dragDropイベントも発生していません.なぜそうなのですか??

ツリービューからドラッグしていて、PowerPoint または Word に貼り付ける必要があります。(つまり) treeview は、Office ツールのアドインのようなものです。

よろしく、アルシャド

4

2 に答える 2

0

DragDrop提供されたコードから、イベントを実装したことも、関連するコントロールにプロパティを設定したこともわかりませんAllowDrop。これは、ドラッグ アンド ドロップを実行するために他の 2 つのイベントと共に必要です。

これは、2 つのツリービューを使用してノードを移動するMSDNから直接取得したサンプルです。いくつかのツリービューを追加し、いくつかのルート ノードと子ノードを追加して、これらのイベントを関連付けます。AllowDropプロパティを覚えておいてください。

Debug.WriteLine()これをテストしながら、デバッグに役立つようにいくつか追加しました。ブレークポイントを使用するのは難しい場合があります;-)

注: brewity については、イベント ワイヤリング コードも、サンプル ノードを作成するためのコードも提供していません。必要に応じて、これは参照記事で見つけることができます。それ以外の場合は、プロパティ ウィンドウを使用してそれらを追加します。

サンプルコード:

private void treeView_ItemDrag(object sender, ItemDragEventArgs e)
{
    Debug.WriteLine("ItemDrag fired!");
    DoDragDrop(e.Item, DragDropEffects.Move);
}

private void treeView_DragEnter(object sender, DragEventArgs e)
{
    Debug.WriteLine("TreeView DragEnter fired!");
    e.Effect = DragDropEffects.Move;
}

private void treeView_DragDrop(object sender, DragEventArgs e)
{
    Debug.WriteLine("TreeView DragDrop fired!");
    TreeNode NewNode;
    if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
    {
        Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
        TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
        NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
        if (DestinationNode.TreeView != NewNode.TreeView)
        {
            DestinationNode.Nodes.Add((TreeNode)NewNode.Clone());
            DestinationNode.Expand();
            //Remove Original Node
            NewNode.Remove();
        }
    }
}
于 2014-07-11T05:47:14.767 に答える
0

ドロップを許可 AND..

わかりました、すべてのイベントが Form_Load で宣言/作成されていると仮定します... ei :

tlAssemblies.DragDrop +=tlAssemblies_DragDrop;
tlAssemblies.MouseDown +=tlAssemblies_MouseDown;
tlAssemblies.MouseMove +=tlAssemblies_MouseMove;
tlAssemblies.DragEnter +=tlAssemblies_DragEnter;
tlAssemblies.DragOver += tlAssemblies_DragOver;

ドラッグ イベントは、treeView 内でドラッグ イベントを発生させるためのものです。これが機能している理由です。dragEnter は、異なる* コントロールの境界に入るときです。

つまり、ツリービュー 1 からツリービュー 2 にドラッグします。

項目を別のコントロールにドラッグしようとしていない場合、dragEnter は間違っています。

ドラッグ ドロップ イベントのサンプルを次に示します。

 private void tlAssemblies_DragDrop(object sender, DragEventArgs e)
 {
    if (sender == null)
        return;
    Point p = tlAssemblies.PointToClient(new Point(e.X, e.Y));
    TreeListNode dragNode = e.Data.GetData(typeof(TreeListNode)) as TreeListNode;
    TreeListNode targetNode = tlAssemblies.CalcHitInfo(p).Node;
    if (targetNode == null)
    {
        return;
    }

可能かどうかはわかりませんが、dragEnterコードを変更して、単にドラッグイベントで使用することをお勧めします.

  e.Effect = DragDropEffects.Move; 

前後にドラッグしている同じコントロールを離れていない場合は、ドラッグの動きを表示することもできます。

もう 1 つできることは、treeView_MouseMove イベントです。

 private void tlAssemblies_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && downHitInfo != null)
        {
            Size dragSize = SystemInformation.DragSize;
            Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X -     dragSize.Width / 2,
            downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
            if (!dragRect.Contains(new Point(e.X, e.Y)))
            {
                DataRow row = viewProduct.GetDataRow(downHitInfo.RowHandle);
                if(row != null)
                tlAssemblies.DoDragDrop(row, DragDropEffects.Move); 
                //viewProduct.GridControl.DoDragDrop(row, DragDropEffects.All); 
                downHitInfo = null;
                DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
            }
        }
    }
于 2014-07-11T05:36:55.060 に答える