2009-06-17 15 views
10

Mam listę plików z ich nazwiskami w polu listy i ich zawartością przechowywanych w tabeli SQL i chcę, aby użytkownik mojej aplikacji mógł wybrać jedną lub więcej nazw plików w polu listy i przeciągnąć je na pulpit, plonujące rzeczywiste pliki na pulpicie. Nie mogę znaleźć żadnej dokumentacji, jak to zrobić. Czy ktoś może wyjaśnić lub wskazać wyjaśnienie?Plik narzędzia przeciągnij do pulpitu z aplikacji WinForm .net?

Dodano później: Udało mi się wykonać tę pracę poprzez obsługę zdarzenia DragLeave. W nim utworzę plik w katalogu tymczasowym o wybranej nazwie i zawartości wyciągniętej z SQL Server. I następnie umieścić ścieżkę do pliku do obiektu:

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); 

Ale to wydaje się bardzo nieefektywne i niezdarny, a ja jeszcze nie zorientowali się, to dobry sposób, aby pozbyć się nagromadzonych plików tymczasowych.

Odpowiedz

10

Mogę ci w czymś pomóc. Oto kod, który pozwoli ci wyciągnąć coś z listbox, a po upuszczeniu na pulpicie utworzy kopię pliku, który istnieje na twoim komputerze na pulpicie.

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

Rozumiem to, ale nie rozumiem, gdzie foo.txt jest tworzone i wypełniane jego zawartością z tabeli SQL. – mlo

+0

Czy można dodać "c: /foo.txt", ale po przeciągnięciu upuść plik z nową nazwą pliku, np. "Nowy foo.txt"? – Nooneelse

3

Oto niektóre z płyty kotła, które pomogą Ci określić, kiedy należy rozpocząć przeciągania operacji:

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 
} 
Powiązane problemy