C#: atestat și pregătire ONTI

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.

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.

Schemă pentru lecția 24: Transfer FileDrop; Exact un fișier .txt; DragEnter: Copy; DragDrop: verifică și afișează.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

Bazele C#

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.

Exersează cu o problemă →