2017-02-01 23 views
0

我在下面的一种形式中有2个Treeview。如何区分.net中的两个相同表单控件的实例

left_treeview_node1 | right_treeview_node1 
left_treeview_node2 | right_treeview_node2 
left_treeview_node3 | right_treeview_node3 
left_treeview_node4 | right_treeview_node4 

这里我们可以拖放左侧treenode进行映射。

现在用户已打开2个相同表单的实例,并且他将第一个实例的left_treeview_node1拖放到另一个同一表单实例的right_treeview_node4

因此如何区分另一个实例并停止支持从一个实例拖放到另一个实例。

对于同一个表单的每个实例,有不同的GUID吗?

我们可以使用Mutex来区分2个相同形式的实例吗?

在此先感谢...

+0

设置名称属性。此外,事件参数包含指向控件的链接并使用该参数来获取控件。 – jdweng

+2

在DragDrop事件https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(v=vs.110).aspx中,您可以将sender.Parent与此表单进行比较。如果sender.Parent ==这个,它就是这个表单的同一个实例。设置事件的断点并查看发件人的属性以查找表单参考 – Mangist

+0

您可以随时在窗体中添加'public guid WindowId {get;} = Guid.NewGuid();'并将其用于区分。 –

回答

0

使用Control.Handle属性唯一标识一个控件或你的情况的一种形式。

+0

请小心,因为可以在运行时重新创建Control的hWnd状态,导致不同的'Control.Handle'属性值。我建议做简单的对象引用相等。 – Dai

0

比较Control.FindForm返回的值 - 如果它们对于拖动项和目标项不同,则不允许丢弃。

0

您还可以在拖动事件中进行测试,以查看表单是否为焦点。如果不是那么你就知道其余的。或者,如果您确实想确定,请在表单丢失/获得焦点时禁用/启用拖放操作。

1

我假设你通过TreeNode作为对象拖动:

private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) { 
     treeView1.DoDragDrop(e.Item, DragDropEffects.Move); 
    } 

然后你想写DragEnter事件处理程序的第二TreeView控件来验证您确实获得了树节点,它来了从您预期的TreeView:

private void treeView2_DragEnter(object sender, DragEventArgs e) { 
     if (!e.Data.GetDataPresent(typeof(TreeNode))) return; 
     var node = (TreeNode)e.Data.GetData(typeof(TreeNode)); 
     if (node.TreeView == this.treeView1) { 
      e.Effect = DragDropEffects.Move; 
     } 
    } 

对象身份检查将不匹配它节点来自另一个窗体。如果你想检查它是来自预期的形式而不是预期的TreeView(这里看起来不太可能),那么把测试写为if (node.TreeView.FindForm() == this)

0

在这里,我已经使用控件的HASHCODE来确定控件的不同实例,如下所示,它工作。

在tvw1.DragDrop事件

Dim draggedNode As TreeNode = Nothing draggedNode = DirectCast(e.Data.GetData(GetType(TreeNode)), TreeNode) If draggedNode Is Nothing Then Exit Sub If Not (draggedNode.TreeView.GetHashCode = tvwStagingArea.GetHashCode) Then 'do whatever you want Exit Sub End If

相关问题