C#: drag and drop cu tipuri și limite explicite
Acceptă un fișier prin drag and drop într-un formular C#. Verifică formatul transferului, numărul de fișiere și extensia înainte de a folosi selecția.
În acest material
Drag and drop este o altă cale de introducere a datelor, nu o scurtătură care permite ocolirea validării. Un obiect transferat poate conține text, fișiere sau alt format. Formularul acceptă numai un fișier .txt și afișează numele său. Citirea conținutului poate fi adăugată prin aceeași funcție verificată folosită de meniul Deschide.
Cum lucrezi cu exemplul
Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
AllowDrop activează primirea transferului. DragEnter anunță dacă operația este acceptabilă prin DragDropEffects.Copy sau None. DragDrop repetă validarea înainte de folosire, deoarece feedbackul vizual nu reprezintă o garanție suficientă. Funcția GetPath verifică FileDrop, tipul datelor, numărul fișierelor, existența și extensia.
Copy indică intenția transferului, nu copiază automat fișierul pe disc. Exemplul nu mută și nu șterge fișierul sursă. Dacă ulterior copiezi resursa într-un proiect, decide explicit destinația, politica pentru nume duplicate și dimensiunea permisă.
Exemplu și rezultat așteptat
Tragerea unui singur fișier note.txt produce indicatorul de acceptare și, la eliberare, numele note.txt. Două fișiere simultan, un director sau o imagine nu sunt acceptate. Textul tras dintr-un editor nu este tratat drept cale de fișier.
Transfer FileDrop → Exact un fișier .txt → DragEnter: Copy → DragDrop: verifică și afișează.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LessonForm());
}
}
class LessonForm : Form
{
readonly Label output=new Label {Dock=DockStyle.Fill,TextAlign=ContentAlignment.MiddleCenter,Text="Trage un fisier .txt aici"};
public LessonForm() {
Text="Drag and drop";ClientSize=new Size(460,220);AllowDrop=true;
output.AllowDrop=true;
DragEventHandler enter=(s,e) => {e.Effect=GetPath(e.Data)==null ? DragDropEffects.None : DragDropEffects.Copy;};
DragEventHandler drop=(s,e) => {string path=GetPath(e.Data);if(path!=null)output.Text=Path.GetFileName(path);};
DragEnter+=enter;DragDrop+=drop;output.DragEnter+=enter;output.DragDrop+=drop;Controls.Add(output);
}
static string GetPath(IDataObject data) {
if(data==null || !data.GetDataPresent(DataFormats.FileDrop))return null;
var paths=data.GetData(DataFormats.FileDrop) as string[];
if(paths==null || paths.Length!=1 || !File.Exists(paths[0]))return null;
return string.Equals(Path.GetExtension(paths[0]),".txt",StringComparison.OrdinalIgnoreCase) ? paths[0] : null;
}
}
Greșeli și limite
Nu converti direct GetData fără verificarea formatului. Nu executa fișierele primite și nu construi o comandă de shell din calea lor. Numele fișierului poate conține spații și caractere Unicode. Extensia este o condiție de alegere, nu o dovadă că datele din interior sunt valide.
Exersează
Testează un fișier valid, două fișiere, un director și text selectat dintr-un editor. Adaugă citirea prin metoda din lecția despre dialoguri, cu limită de dimensiune și tratarea erorilor. Confirmă că toate căile de intrare aplică aceleași reguli, fără o versiune mai permisivă pentru drag and drop.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: operații în fundal și anulare fără blocarea ferestrei
Lecția următoare: C#: grafice cu Chart și agregarea datelor.
Referință: documentația Microsoft.
Întrebări frecvente
DragDropEffects.Copy copiază fișierul?
Nu. Comunică tipul operației acceptate; aplicația trebuie să implementeze separat copierea dacă o dorește.
De ce validez din nou în DragDrop?
Pentru că operația finală trebuie să verifice datele, independent de feedbackul anterior.
Pot primi mai multe fișiere?
Da, dacă definești și implementezi explicit regula. Exemplul acceptă exact unul.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.