2009-06-17 3 views
10

Tôi có danh sách tệp có tên trong hộp danh sách và nội dung được lưu trữ trong bảng SQL và muốn người dùng ứng dụng của tôi có thể chọn một hoặc nhiều tên tệp trong hộp danh sách và kéo chúng vào màn hình, tạo các tệp thực sự trên màn hình. Tôi không thể tìm thấy bất kỳ tài liệu nào về cách thực hiện việc này. Bất cứ ai có thể giải thích hoặc chỉ ra một lời giải thích?Triển khai tệp kéo vào màn hình từ ứng dụng winforms .net?

Đã thêm sau: Tôi đã có thể thực hiện công việc này bằng cách xử lý sự kiện DragLeave. Trong đó tôi tạo một tập tin trong một thư mục tạm thời với tên được chọn và nội dung được lấy từ SQL Server. sau đó tôi đặt đường dẫn đến tập tin vào đối tượng:

var files = new string[1]; 
files[0] = "full path to temporary file"; 
var dob = new DataObject();  
dob.SetData(DataFormats.FileDrop, files); 
DoDragDrop(dob, DragDropEffects.Copy); 

Nhưng điều này có vẻ rất không hiệu quả và vụng về, và tôi vẫn chưa tìm ra một cách tốt để thoát khỏi các tập tin tạm thời tích lũy.

Trả lời

10

Tôi có thể giúp bạn một chút. Dưới đây là một số mã sẽ cho phép bạn kéo một cái gì đó ra khỏi hộp danh sách, và khi thả trên máy tính để bàn, nó sẽ tạo một bản sao của một tập tin tồn tại trên máy tính của bạn với máy tính để bàn.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.listBox1.Items.Add("foo.txt"); 
     this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
     this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver); 
    } 

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

    void listBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     string[] filesToDrag = 
     { 
      "c:/foo.txt" 
     }; 
     this.listBox1.DoDragDrop(new DataObject(DataFormats.FileDrop, filesToDrag), DragDropEffects.Copy); 
    } 
} 
+0

Tôi hiểu điều này, nhưng những gì tôi không hiểu là nơi foo.txt được tạo ra và điền vào với nội dung của nó từ bảng SQL. – mlo

+0

Có thể thêm "c: /foo.txt" nhưng khi kéo xong, thả tệp có tên tệp mới như "foo.txt mới"? – Nooneelse

3

Dưới đây là một số trong những tấm nồi hơi để giúp bạn xác định khi nào bắt đầu kéo tác:

private Rectangle _DragRect; 

private void MyDragSource_MouseDown(object sender, MouseEventArgs e) { 
    Size dragsize = SystemInformation.DragSize; 
    _DragRect = new Rectangle(new Point(e.X - (dragsize.Width/2), e.Y - (dragsize.Height/2)), dragsize); 
} 

private void MyDragSource_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     if (_DragRect != Rectangle.Empty && !_DragRect.Contains(e.X, e.Y)) { 
     // the mouse has moved outside of the drag-rectangle. Start drag operation 

     MyDragSource.DoDragDrop(.....) 
     } 
    } 
} 

private void MyDragSource_MouseUp(object sender, MouseEventArgs e) { 
    _DragRect = Rectangle.Empty; // reset 
}