2009-01-30 35 views
12

Tôi có biểu tượng chiến thắng với hộp danh sách và số lần xem trang.C# Kéo và thả từ hộp danh sách đến số lần xem ảnh

Khi hộp danh sách của tôi được lấp đầy với các mục, tôi muốn kéo chúng (nhiều hoặc một) từ hộp danh sách và thả chúng vào nút trong treeview.

Nếu ai đó có ví dụ điển hình về C# sẽ tuyệt vời.

+1

Bạn có thể chỉnh sửa bài đăng của mình và cho chúng tôi biết chính xác phần nào bạn đang gặp sự cố không? Folks đây có xu hướng không đáp ứng tốt với "PLES gửi codz" câu hỏi kiểu –

Trả lời

23

Nó được một lúc kể từ khi tôi đã sai lầm với Kéo/Thả vì vậy tôi figured tôi sẽ viết một mẫu nhanh chóng.

Về cơ bản, tôi có một hình thức, với một ListBox bên trái, và một treeview ở bên phải. Sau đó, tôi đặt một nút trên đầu trang. Khi nút được nhấp, nó chỉ đặt ngày của mười ngày tiếp theo vào hộp danh sách. Nó cũng populates TreeView với 2 nút cha và hai nút con. Sau đó, bạn chỉ cần xử lý tất cả các sự kiện kéo/thả tiếp theo để làm cho nó hoạt động.

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

Cảm ơn bạn rất nhiều cho việc này. Tôi chỉ cần một ví dụ mã để xác nhận rằng tôi không nhận được kéo và thả "hiệu ứng" trong Mono (ít nhất là trên OSX). Ví dụ tuyệt vời và COMPLETE của bạn đã giúp tôi tiết kiệm rất nhiều công sức. –

3

Bạn muốn sử dụng hàm GetItemAt (Điểm) để dịch vị trí X, Y thành mục listview.

Đây là bài viết khá hay về nó: Drag and Drop Using C#.

Để làm cho mục này được hiển thị trong khi kéo, bạn cần sử dụng COM ImageList, được mô tả rõ trong bài viết sau Custom Drag-Drop Images Using ImageLists.

Các vấn đề liên quan