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.
În acest material
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.
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
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.