我看了看,但找不到答案。
我有TreeView
。它具有拖放功能,允许在树中移动节点。
我想将拖放限制为仅在应用程序的单个实例中的一个控件内工作(应用程序本身可以运行多个实例)。
我尝试了以下内容:
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
拖到第一个TreeView:(source == this.SubFolderTreeView)
是真的
我没有测试过一个完全不同的树视图是否会拖到我的视线,虽然我对此表示怀疑,但上述行为已经失败了。
我尝试了其他一些东西 - 比较表单或控件的句柄也不起作用
bool isSameForm = ((MyForm) source.TopLevelControl == this); // still true
bool isSameHandle = (((Control)source).Handle == ((Control)this.SubFolderTreeView).Handle); // still true
我能想到的唯一其他事情,就在我的脑海中,是一个存储在TreeView或Form中的随机数(可能不起作用),并检查控件的绝对屏幕位置(不是最好的)法)。
我当然可以在应用程序中粘贴一个互斥锁,因此只允许一个实例运行,但我宁愿不这样做。
有人能建议这样做的好方法吗?
答案 0 :(得分:2)
为了充实Hans Hansant的解决方案(完美地工作,感谢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的解决方案是轻量级和有效的。
答案 1 :(得分:1)
我并没有真正遵循这些限制,看起来像你所提供的信息有缺陷的逻辑(所有相同的实例,但只有一个可以拖放 - 什么?),但有些建议: