C# 如何区分.net中同一表单控件的两个实例

C# 如何区分.net中同一表单控件的两个实例,c#,.net,vb.net,C#,.net,Vb.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 在这里,我们可以拖放左侧树节点到右侧进行映射 现在用户已经打开了同一表单的两个实例,他正在从第一个实例拖动左树

我有两个树状视图在一个表格如下

left_treeview_node1  | right_treeview_node1 
left_treeview_node2  | right_treeview_node2 
left_treeview_node3  | right_treeview_node3
left_treeview_node4  | right_treeview_node4
在这里,我们可以拖放左侧树节点到右侧进行映射

现在用户已经打开了同一表单的两个实例,他正在从第一个实例拖动
左树视图节点1
,并将其拖放到同一表单的另一个实例的
右树视图节点4

所以,如何区分另一个实例并停止支持从一个实例到另一个实例的拖放

同一表单的每个实例是否有不同的GUID

我们可以使用互斥来区分相同形式的两个实例吗


提前感谢…

使用Control.Handle属性,该属性在您的案例中唯一标识控件或窗体。

比较
控件返回的值。FindForm
-如果拖动的项目和目标项目的值不同,则不允许拖放。

您也可以在拖动事件中进行测试,以查看窗体是否聚焦。如果不是,那么你知道其余的。或者,如果您确实想确定,请在窗体失去/获得焦点时禁用/启用对控件的拖放

我假设您将树节点作为要拖动的对象传递:

    private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) {
        treeView1.DoDragDrop(e.Item, DragDropEffects.Move);
    }
然后,您需要在第二个TreeView上编写DragEnter事件处理程序,以验证您确实获得了一个TreeNode,并且它来自您期望的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)

来编写,这里我使用了控件的HASHCODE来确定控件的不同实例,如下所示,它工作正常

在tvw1.DragDrop事件中

Dim draggedNode As TreeNode=无
draggedNode=DirectCast(e.Data.GetData(GetType(TreeNode)),TreeNode)
如果draggedNode为Nothing,则退出Sub
如果不是(draggedNode.TreeView.GetHashCode=tvsttagingarea.GetHashCode),则
“你想干什么就干什么
出口接头

如果设置name属性,则结束。此外,事件参数包含指向控件的链接,并使用该参数获取控件。在DragDrop事件中,您可以将sender.Parent与此表单进行比较。如果sender.Parent==此,则它是表单的同一实例。在事件上设置断点并查看发送方的属性以查找表单引用您可以始终添加
public Guid WindowId{get;}=Guid.NewGuid()控件。句柄
属性值。我建议改为使用简单的对象引用等式。