2009-01-30 100 views
12

我有一個帶有列表框和樹視圖的winform。C#從列表框拖放到樹視圖

一旦我的列表框中充滿了項目,我想從列表框中拖拽它們(多個或單個)並將它們放入樹視圖中的一個節點中。

如果有人在C#中有一個很好的例子,那將會很棒。

+1

你能編輯你的文章,並告訴我們你到底有什麼問題嗎?這裏的人們往往不會對「ples發送codz」類型的問題做出很好的反應 – 2009-01-30 14:36:53

回答

23

這已經有一段時間了,因爲我已經搞砸了,所以我想我會寫一個快速樣本。

基本上,我有一個窗體,左邊是一個列表框,右邊是一個樹形視圖。然後我在上面放一個按鈕。當按鈕被點擊時,它只是將下一個十天的日期放入列表框中。它還使用2個父節點和兩個子節點填充TreeView。然後,您只需處理所有後續的拖放事件即可使其工作。

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.treeView1.AllowDrop = true; 
      this.listBox1.AllowDrop = true; 
      this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
      this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver); 

      this.treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter); 
      this.treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop); 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      this.PopulateListBox(); 
      this.PopulateTreeView(); 
     } 

     private void PopulateListBox() 
     { 
      for (int i = 0; i <= 10; i++) 
      { 
       this.listBox1.Items.Add(DateTime.Now.AddDays(i)); 
      } 
     } 

     private void PopulateTreeView() 
     { 
      for (int i = 1; i <= 2; i++) 
      { 
       TreeNode node = new TreeNode("Node" + i); 
       for (int j = 1; j <= 2; j++) 
       { 
        node.Nodes.Add("SubNode" + j); 
       } 
       this.treeView1.Nodes.Add(node); 
      } 
     } 

     private void treeView1_DragDrop(object sender, DragEventArgs e) 
     { 

      TreeNode nodeToDropIn = this.treeView1.GetNodeAt(this.treeView1.PointToClient(new Point(e.X, e.Y))); 
      if (nodeToDropIn == null) { return; } 
      if(nodeToDropIn.Level > 0) 
      { 
       nodeToDropIn = nodeToDropIn.Parent; 
      } 

      object data = e.Data.GetData(typeof(DateTime)); 
      if (data == null) { return; } 
      nodeToDropIn.Nodes.Add(data.ToString()); 
      this.listBox1.Items.Remove(data); 
     } 

     private void listBox1_DragOver(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

     private void treeView1_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

     private void listBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move); 
     } 


    } 
+0

非常感謝你。我只需要一個代碼示例來確認我沒有在Mono中拖放「效果」(至少在OSX上)。你偉大而完整的例子爲我節省了大量的工作。 – 2009-07-31 08:59:12