【问题标题】:How to differentiate two instances of same form control in .net如何区分.net中相同表单控件的两个实例
【发布时间】:2017-02-01 18:49:37
【问题描述】:

我有 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

这里我们可以将左边的树节点拖放到右边进行映射。

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

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

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

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

提前谢谢...

【问题讨论】:

  • 设置名称属性。此外,事件参数包含指向控件的链接,并使用该参数获取控件。
  • 在 DragDrop 事件msdn.microsoft.com/en-us/library/… 中,您可以将 sender.Parent 与此表单进行比较。如果 sender.Parent == this,它是表单的同一个实例。在事件上设置断点,查看Sender的属性找到表单引用
  • 您可以随时将public Guid WindowId {get;} = Guid.NewGuid(); 添加到表单中并用它来区分它们。

标签: c# .net vb.net


【解决方案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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 小心,因为控件的 hWnd 状态可以在运行时重新创建,从而导致不同的Control.Handle 属性值。我建议改为使用简单的对象引用相等。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您也可以只测试拖动事件以查看表单是否获得焦点。如果不是,那么你就知道其余的了。或者,如果您真的想确定,请在表单失去/获得焦点时禁用/启用控件上的拖放。

      【讨论】:

        【解决方案5】:

        在这里,我使用了控件的 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

        【讨论】:

          猜你喜欢
          • 2018-12-02
          • 1970-01-01
          • 1970-01-01
          • 2021-07-13
          • 2013-10-21
          • 1970-01-01
          • 2014-12-14
          • 2011-07-25
          • 2021-06-20
          相关资源
          最近更新 更多