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

时间:2017-02-01 18:49:37

标签: c# .net vb.net

我在一个表单中有2个Treeview,如下所示。

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个实例吗?

提前致谢...

5 个答案:

答案 0 :(得分:1)

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

    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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

比较a = NULL返回的值 - 如果拖动和目标项目不同,则不允许丢弃。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这里我使用了控件的HASHCODE来确定控件的不同实例,如下所示,并且它有效。

在tvw1.DragDrop事件中

defaultConfig { minSdkVersion 9 targetSdkVersion 24 } productFlavors { baz { applicationId 'com.myapp.baz' versionCode 1 versionName '1.0.0' } foo { applicationId 'com.myapp.foo' versionCode 518 versionName '4.3.2' } }