C#: atestat și pregătire ONTI

C#: alegeri cu ComboBox și identitatea selecției

Leagă un ComboBox C# la obiecte cu ID și nume. Folosește selecția pentru identitate și tratează lipsa alegerii fără a depinde de textul afișat.

Două categorii pot avea nume apropiate sau chiar identice. Interfața arată un nume, dar operația trebuie să folosească identitatea categoriei. ComboBox poate fi legat la o listă de obiecte: DisplayMember definește textul, iar ValueMember definește valoarea. Astfel nu mai reconstruim ID-ul dintr-un șir afișat utilizatorului.

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

Alegem DropDownList pentru ca utilizatorul să selecteze dintre opțiunile existente, fără text liber. După legarea sursei punem SelectedIndex la minus unu, cerând o alegere explicită. În handler verificăm SelectedItem înainte de conversie. Obiectul selectat conține atât numele, cât și ID-ul.

Legarea datelor poate declanșa evenimente de selecție în timpul inițializării. Handlerii trebuie să tolereze starea fără alegere. Dacă interoghezi o bază de date la fiecare eveniment, separă inițializarea de acțiunea explicită a utilizatorului și evită cererile duplicate.

Exemplu și rezultat așteptat

Lista conține Programare cu ID 10 și Literatură cu ID 20. Înainte de selecție, butonul cere alegerea categoriei. Alegerea Programare produce ID selectat: 10. Dacă schimbi textul afișat în „Programare C#”, ID-ul rămâne 10; identitatea nu depinde de traducere.

Schemă pentru lecția 14: Programare → ID 10; Literatură → ID 20; Selectezi Programare; Operația primește ID 10.Programare → ID 10 → Literatură → ID 20 → Selectezi Programare → Operația primește ID 10.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 Category { public int Id { get; set; } public string Name { get; set; } }
class LessonForm : Form
{
public LessonForm() {
        Text="Alegerea categoriei"; ClientSize=new Size(400,170);
        var combo=new ComboBox { Left=20,Top=20,Width=300,DropDownStyle=ComboBoxStyle.DropDownList };
        combo.DisplayMember="Name"; combo.ValueMember="Id";
        combo.DataSource=new List<Category> { new Category {Id=10,Name="Programare"},new Category {Id=20,Name="Literatura"} };
        combo.SelectedIndex=-1;
        var result=new Label {Left=20,Top=110,Width=340};
        var choose=new Button {Left=20,Top=65,Width=150,Text="Foloseste selectia"};
        choose.Click += (sender,e) => {
            var selected=combo.SelectedItem as Category;
            result.Text=selected==null ? "Alege o categorie." : "ID selectat: " + selected.Id;
        };
        Controls.AddRange(new Control[] {combo,choose,result});
    }
}

Greșeli și limite

Nu folosi SelectedIndex drept ID de bază de date. Indexul zero indică prima opțiune, nu neapărat entitatea cu ID zero. Nu presupune că SelectedValue este întotdeauna un int valid în timpul binding-ului. Pentru liste refiltrate, păstrează ID-ul dorit și verifică dacă mai există înainte de restaurarea selecției.

Exersează

Adaugă două categorii cu același nume și ID-uri diferite. Selectează-le pe rând și verifică mesajele: ID-urile trebuie să fie diferite. Schimbă ordinea listei și repetă. Explică de ce o comparație după Text ar fi ambiguă, iar folosirea SelectedIndex ar schimba identitatea după reordonare.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: layout adaptabil cu Dock, Anchor și panouri

Lecția următoare: C#: DataGridView și actualizarea unei liste de obiecte.

Referință: documentația Microsoft.

Întrebări frecvente

De ce aleg DropDownList?

Pentru o alegere din valori cunoscute, fără introducerea unui text care nu există în listă.

SelectedIndex este ID-ul?

Nu. Este poziția în lista afișată și se schimbă când ordinea se schimbă.

Cum tratez lipsa selecției?

Verific SelectedItem sau SelectedIndex înainte de a folosi valoarea.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →