Rezumat
Structura unui proiect WinForms
Un proiect WinForms este organizat în trei fișiere cu roluri distincte și fixe.
Program.cs este punctul de intrare al aplicației. Conține metoda Main care pornește sistemul de afișare Windows și lansează formularul principal prin Application.Run(new Form1()). Nu se modifică în mod obișnuit.
Form1.cs este fișierul pe care îl editezi tu. Conține logica formularului: lista de date din memorie, event handlerii și metodele care implementează funcționalitățile aplicației.
Form1.Designer.cs este generat automat de Designer-ul vizual și conține metoda InitializeComponent() care creează și configurează toate controalele. Nu se editează manual, orice modificare directă în el va fi suprascrisă sau va produce erori.
Cele două fișiere Form1.cs și Form1.Designer.cs definesc aceeași clasă prin mecanismul partial. Compilatorul le unește la compilare.
Program.cs
Punctul de intrare, lanseaza formularul
Rar, de tine
Form1.cs
Logica formularului, event handlers, metode
Tu
Form1.Designer.cs
Codul generat pentru controale
Automat de Designer
Formularul (Form) - proprietăți si evenimente
Form) - proprietăți si evenimenteProprietățile statice se setează în Designer; proprietățile care depind de date se setează în cod, după InitializeComponent().
Text
Textul din bara de titlu
Size
Dimensiunea ferestrei in pixeli
StartPosition
Unde apare fereastra la lansare (CenterScreen cel mai folosit)
FormBorderStyle
Tipul bordurii: Sizable, FixedSingle, FixedDialog, None
MaximizeBox / MinimizeBox
Afiseaza sau ascunde butoanele de maximize si minimize
Load
Inainte de afisare, dupa initializare - pentru setup initial
Shown
La prima afisare pe ecran - pentru Focus() si animatii
FormClosing
La tentativa de inchidere - e.Cancel = true anuleaza inchiderea
FormClosed
Dupa inchiderea efectivă - pentru cleanup
Controale de bază
Convenția de denumire cu prefix scurt se aplică imediat la adăugarea fiecărui control:
Label
Text, AutoSize, ForeColor
nu are
TextBox
Text, PlaceholderText, MaxLength
TextChanged
Button
Text, Enabled
Click
sender în event handlers este controlul care a declanșat evenimentul, transmis ca object. Dacă ai nevoie de proprietăți specifice, faci cast: Button btn = sender as Button.
ListBox
ListBox-ul și lista din memorie sunt două lucruri separate. Lista din memorie (List<Contact>) este sursa de adevăr. ListBox-ul este oglinda ei vizuală. RefreshLista() este metoda care le ține sincronizate.
ListBox-ul afișează rezultatul ToString() al fiecărui obiect. Suprascrierea ToString() pe clasa Contact controlează ce text apare în listă.
Items.Add(obiect)
Adauga un element
Items.Clear()
Goleste lista vizuala
SelectedItem
Elementul selectat ca object; null daca nimic selectat
SelectedIndex
Indexul elementului selectat; -1 daca nimic selectat
SelectionMode
One (implicit), MultiSimple, MultiExtended
SelectedIndexChanged
La orice schimbare a selectiei
La accesul la elementul selectat, foloseste SelectedItem as Contact, nu SelectedIndex pentru a indexa lista din memorie. Aceasta evita inconsistente in prezenta filtrarii.
GroupBox, CheckBox, MessageBox
GroupBox
Text, Enabled (dezactiveaza tot grupul)
nu are
CheckBox
Text, Checked
CheckedChanged
MessageBox
apel static Show(...)
returneaza DialogResult
MessageBox.Show în forma completa cu captarea raspunsului:
MessageBoxButtons
Butoane afisate
OK
Un singur buton
OKCancel
OK si Cancel
YesNo
Yes si No
YesNoCancel
Yes, No si Cancel
Bune practici
Nu scrie logica in event handlers
Codul devine greu de citit si de testat
Redenumeste controalele imediat
button1 nu comunica nimic dupa o saptamana
Proprietati statice in Designer, dinamice in cod
Separare clara intre fix si variabil
Validare cu MessageBox, nu exceptii
Exceptiile in handlers afecteaza utilizatorul
.Trim() la citirea textului
Elimina spatii accidentale din TextBox-uri
Focus() dupa erori de validare
Utilizatorul stie exact unde sa corecteze
Actualizeaza UI dupa date, nu inainte
Consistenta intre memorie si ce vede utilizatorul
Last updated