2017-02-01 25 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

相關問題