文章編號: 307968 - 上次校閱: 2008年7月21日 - 版次: 4.0

如何在 Visual C# 應用程式中加入樹狀檢視拖曳並放功能

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
本文章的有 Microsoft Visual Basic.NET] 版本請參閱 307967? (http://support.microsoft.com/kb/307967/ )
本文章的有 Microsoft Visual C++.NET] 版本請參閱 815675? (http://support.microsoft.com/kb/815675/ )

在此頁中

全部展開 | 全部摺疊

結論

本文將逐步說明如何執行拖曳並放操作,與在 Visual C# 應用程式中的兩個 樹狀檢視 控制項之間的樹狀節點。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Visual C#
本文假設您已熟悉下列主題:
  • Windows Form 樹狀檢視 控制項
  • Windows Form 事件處理

該技巧的描述

樹狀檢視 控制項提供您必須處理的三個和拖事件:
  • ItemDrag: 只要在使用者開始拖曳樹狀節點,此事件從來源 樹狀檢視 控制項引發。發生這種情況時呼叫 DoDragDrop 方法來啟始及拖程序。
  • DragEnter: 您啟始拖曳並放作業之後您必須處理 DragEnter 事件,在 樹狀檢視 控制項的目的地。此事件發生於使用者從來源 樹狀檢視 控制項拖曳 TreeNode 物件到目的 樹狀檢視 控制項中界限的點。DragEnter 事件可讓目的來指定拖曳作業是否適用於此控制項的 樹狀檢視 控制項。本文中的程式碼範例可讓移動作業。
  • DragDrop: 若要處理的最後一個事件是目的地 樹狀檢視 控制項的 DragDrop 事件。此事件發生於拖曳出 TreeNode 物件已經卸除目的 樹狀檢視 控制項]。若要處理這個事件,擷取 TreeNode] 物件,並將物件加入至目的地 樹狀檢視 控制項]。程式碼範例會使用 資料 物件擷取資料。
本文中的程式碼範例可保證為 TreeNode 物件已拖放到目的地 樹狀檢視 控制項。資料 物件的 GetData 方法擷取拖曳從原始檔控制的節點。GetNodeAt 方法會判斷這個節點放在目的地控制項上的位置。決定位置之後新增來源節點為目的地節點的子系。因為這個範例會執行移動作業,最後一個步驟就是從原始的 樹狀檢視 控制項中移除來源節點。

建立範例的步驟

  1. 建立新的 Windows 應用程式在 Visual C# 中。預設情況下,會建立名為 Form1 的表單。
  2. 使用 [若要將兩個 樹狀檢視 控制項新增到 Form1 的 [工具箱]。預設情況下,會建立 TreeView1TreeView2
  3. 若要以便 樹狀檢視 控制項,以拖曳且卸除變更 [為 True 在 [屬性] 視窗中的 [同時 TreeView1TreeView2AllowDrop 屬性]。
  4. 連按兩下 [Form1],以產生 Form1 的 Load 事件方法處理常式。 Add the following code to populate the two TreeView controls with TreeNode objects and to define the event handlers:
    private void Form1_Load(object sender, System.EventArgs e)
    		{
    			TreeNode ParentNode1;
    			TreeNode ParentNode2;
    
    			ParentNode1 = treeView1.Nodes.Add("tv1");
    			ParentNode1.Nodes.Add("tv1FirstChild");
    			ParentNode1.Nodes.Add("tv1SecondChild");
    			ParentNode1.Nodes.Add("tv1ThirdChild");
    			ParentNode1.Nodes.Add("tv1FourthChild");
    			ParentNode1.Expand();
    
    			ParentNode2 = treeView2.Nodes.Add("tv2");
    			ParentNode2.Nodes.Add("tv2FirstChild");
    			ParentNode2.Nodes.Add("tv2SecondChild");
    			ParentNode2.Expand();
    			this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
    			this.treeView2.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
    			this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
    			this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
    			this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
    			this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);	
    		}
  5. 加入下列的方法處理常式處理的 TreeView1TreeView2ItemDrag 事件拖曳作業的方向而定。這個程式碼啟始被拖曳項目上的移動作業
    private void treeView_ItemDrag(object sender,
    			System.Windows.Forms.ItemDragEventArgs e)
    		{
    			DoDragDrop(e.Item, DragDropEffects.Move);
    		}
  6. 加入下列的方法處理常式處理的 TreeView1TreeView2DragEnter 事件拖曳作業的方向而定:
    private void treeView_DragEnter(object sender,
    			System.Windows.Forms.DragEventArgs e)
    		{
    			e.Effect = DragDropEffects.Move;
    		}
  7. 將下列方法加入 Form1 類別,以便它緊接之方法的前一個步驟中加入:
    private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    		{
    			TreeNode NewNode;
    
    			if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
    			{
    				Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
    				TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
    				NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
    				if(DestinationNode.TreeView != NewNode.TreeView)
    				{     
    					DestinationNode.Nodes.Add((TreeNode) NewNode.Clone());
    					DestinationNode.Expand();
    					//Remove Original Node
    					NewNode.Remove();
    				}
    			}
    		}
  8. 建置並執行專案。將節點從一個 樹狀檢視 控制項拖曳到其他。請注意,該節點從原始檔控制中移除,並加入做為目的控制項中的子節點。

備忘稿

本文所提供的範例被為了只示範之用。因此,範例只會說明如何在簡化的案例中使用 樹狀檢視 控制項。要保留範例小,不考慮幾個案例。比方說程式碼不允許您在相同的 樹狀檢視 控制項中執行拖曳並放操作與節點。

程式碼也不會處理在其中一個使用者不會不刪除物件目的地 樹狀檢視 控制項中的特定節點的案例。若要處理這種情況下,測試是否 DestinationNode 是空值 ; 如果它是,您可以新增根目錄的 樹狀檢視] 控制項拖曳至的物件等等。

?考

如需詳細資訊請參閱下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
DragEnter 事件
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(VS.71).aspx (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(VS.71).aspx)

DragDrop 事件
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(vs.71).aspx)

這篇文章中的資訊適用於:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
關鍵字:?
kbmt kbsweptvs2008 kbhowtomaster kbsample KB307968 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:307968? (http://support.microsoft.com/kb/307968/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。