DataGridView este controlul principal pentru afișarea datelor tabulare în WinForms. Afișează o colecție de obiecte ca un tabel cu rânduri și coloane, similar cu un Excel simplificat. Este mult mai potrivit decât ListBox atunci când ai mai multe proprietăți de afișat simultan.
DataSource și BindingList<T>
Cel mai simplu și mai practic mod de a popula un DataGridView este prin proprietatea DataSource. Când atribui o colecție ca DataSource, grila generează automat câte o coloană pentru fiecare proprietate publică a tipului.
BindingList<T> este tipul preferat față de List<T> pentru că notifică automat DataGridView-ul când se adaugă sau se șterg elemente — grila se actualizează fără să apelezi manual Refresh():
publicpartialclassForm1:Form{ // BindingList in loc de List — actualizari automate in DataGridViewprivateBindingList<Angajat>angajati=newBindingList<Angajat>();privatevoidForm1_Load(objectsender,EventArgse){ // Atribuim DataSource o singura data, in LoaddgvAngajati.DataSource=angajati; // Adaugam cateva date de testangajati.Add(newAngajat{Nume="Popescu",Prenume="Ion",Departament="IT",Salariu=5000});angajati.Add(newAngajat{Nume="Ionescu",Prenume="Maria",Departament="HR",Salariu=4200}); // Grila se actualizeaza automat}}
📸 SCREENSHOT:DataGridView populat cu câteva rânduri de angajați, arătând că fiecare proprietate a clasei Angajat a generat automat o coloană. Evidențiați antetele coloanelor.
Coloane auto-generate vs. configurate manual
Când setezi DataSource, DataGridView-ul generează o coloană pentru fiecare proprietate publică, inclusiv cele pe care nu vrei să le afișezi. Poți controla asta în două moduri.
Varianta simplă — ascunderea coloanelor după generare:
Varianta controlată — dezactivezi auto-generarea și adaugi coloane manual:
Pentru exercițiu, varianta simplă cu ascunderea coloanelor nedorite este suficientă.
Proprietăți esențiale de configurare
📸 SCREENSHOT: Același DataGridView cu și fără RowHeadersVisible = false și AllowUserToAddRows = false, arătând cum arată grila cu și fără rândul de adăugare și fără antetul de rânduri.
Obținerea elementului selectat
Când DataSource este o BindingList<T>, indexul rândului selectat corespunde direct indexului în colecție:
Alternativ, poți folosi CurrentRow:
📸 SCREENSHOT:DataGridView cu un rând selectat (evidențiat în albastru pe toată lățimea). Arată că SelectionMode = FullRowSelect selectează întreaga linie, nu doar o celulă.
Evenimentul SelectionChanged
Util pentru a activa sau dezactiva butoanele de editare și ștergere în funcție de dacă ceva este selectat:
Apelează această metodă și în Form1_Load pentru a seta starea inițială corectă (butoanele dezactivate când lista e goală).
Evenimentul CellDoubleClick
O îmbunătățire de UX: dublu-click pe un rând deschide direct formularul de editare:
dgvAngajati.ReadOnly = true;
// Celulele nu pot fi editate direct in grid — editarea se face prin FormAngajat
dgvAngajati.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
// Selectia unui rand selecteaza intreaga linie, nu doar o celula
dgvAngajati.MultiSelect = false;
// Permite selectarea unui singur rand la un moment dat
dgvAngajati.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
// Coloanele se intind sa umple latimea disponibila a controlului
dgvAngajati.AllowUserToAddRows = false;
// Ascunde randul gol de la final (randul de adaugare rapida)
dgvAngajati.AllowUserToDeleteRows = false;
// Impiedica stergerea randurilor cu tasta Delete direct in grid
dgvAngajati.RowHeadersVisible = false;
// Ascunde coloana gri cu sagetile din stanga
if (dgvAngajati.SelectedRows.Count == 0)
{
MessageBox.Show("Selecteaza un angajat.");
return;
}
// Indexul randului selectat in grid = indexul in BindingList
int index = dgvAngajati.SelectedRows[0].Index;
Angajat selectat = angajati[index];
if (dgvAngajati.CurrentRow == null) return;
int index = dgvAngajati.CurrentRow.Index;