3

私は見て、見て、答えを見つけることができません。

私は持っていTreeViewます。ツリー内でノードを移動できるようにするためのドラッグアンドドロップがあります。

ドラッグアンドドロップを、アプリケーションの単一インスタンス内のその1つのコントロール内でのみ機能するように制限したいと思います(アプリケーション自体は複数のインスタンスを実行できます)。

私は次のことを試しました:

private void SubFolderTreeView_DragEnter(object sender, DragEventArgs e)
{
    TreeView source = sender as TreeView;    // also tried = (TreeView) sender;

    if (source == this.SubFolderTreeView && e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
        e.Effect = DragDropEffects.Move; // Okay, set the visual effect
    else
        e.Effect = DragDropEffects.None; // Unknown data, ignore it
}

TreeView残念ながら、同じアプリケーションの2番目のインスタンスは、そのアプリケーションから最初のTreeViewにドラッグできます(source == this.SubFolderTreeView)。true

まったく異なるツリービューが私のものにドラッグできるかどうかはテストしていませんが、疑わしいですが、上記の動作はすでに失敗しています。

他のことを試しました-フォームやコントロールのハンドルを比較しても機能しませんでした

bool isSameForm = ((MyForm) source.TopLevelControl == this);    // still true
bool isSameHandle = (((Control)source).Handle == ((Control)this.SubFolderTreeView).Handle);     // still true

私が考えることができる他の唯一のことは、TreeViewまたはFormに格納されている乱数(おそらく機能しない)と、コントロールの絶対画面位置をチェックすることです(最良の方法ではありません)。

もちろん、アプリケーションにミューテックスを貼り付けることもできるので、1つのインスタンスのみを実行できますが、実行したくありません。

誰かがこれを行うための良い方法を提案できますか?

4

2 に答える 2

2

この問題への将来の参照や他の検索者のために、Hans Passantのソリューション(Hansに感謝します)を具体化するために、私は次のコードを使用しました。

// prevents dragging from other instances of this form - thanks to Hans Passant
private bool DragDropFromThisForm = false;

private void SubFolderTreeView_ItemDrag(object sender, ItemDragEventArgs e)
{
    // Initiate drag/drop
    DragDropFromThisForm = true;
    DoDragDrop(e.Item, DragDropEffects.Move);
    DragDropFromThisForm = false;
}

private void SubFolderTreeView_DragEnter(object sender, DragEventArgs e)
{
    MyForm form = (MyForm) (sender as TreeView).TopLevelControl;

    if (form.DragDropFromThisForm && e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
        e.Effect = DragDropEffects.Move; // Okay, set the visual effect
    else
        e.Effect = DragDropEffects.None; // Unknown data, ignore it
}

DJ Krazeの答えもうまくいく可能性があり、おそらく少しエレガントですが、Hansのソリューションは軽量で効果的です。

于 2012-12-18T03:27:01.877 に答える
1

私は実際には制限に従っていません、あなたが与えた情報の欠陥のあるロジックのようです(すべて同じインスタンスですが、ドラッグアンドドロップできるのは1つだけです-何??)、しかしいくつかの提案:

  • ノードが「ドラッグアンドドロップ」できるかどうかを決定するプロパティを持ち、それを1つのインスタンスにのみ設定します。
  • 'ドラッグアンドドロップ'できるようにしたい1つのインスタンスでのみイベントをサブスクライブします。
  • ドラッグアンドドロップをサポートする別のTreeViewクラスを作成し、他のすべての場所でベースTreeViewをインスタンス化します。
于 2012-12-17T18:13:22.433 に答える