2013-02-04 10 views
12

Nel mio tavolo, ho un campo di firstname e lastname, ora quello che voglio è quello di impostare firstname e lastname come displaymember in una casella combinata, ma non so come farlo.Come per aggiungere due valori di campo a membro visualizzazione ComboBox in C#

Qualcosa di simile

cmbEmployees.DataSource = GetEmployees(); 
//something like below line which doesn't work 
cmbEmployees.DisplayMember = "lastname, first_name";  
cmbEmployees.ValueMember = "id"; 

Come posso raggiungere questo obiettivo? In modo che sia lastname e firstname verranno visualizzati nella combobox

+1

È possibile aggiungere una proprietà che combina i due nomi. – JosephHirn

+0

Per impostazione predefinita, il controllo visualizzerà ciò che viene restituito dal metodo ToString, pertanto è possibile sovrascriverlo. –

risposta

20

Diciamo che si ha una classe come questa:

class Person 
{ 
    public string FirstName 
    { 
     get; 
     set; 
    } 

    public string LastName 
    { 
     get; 
     set; 
    } 

    public string FullName 
    { 
     get 
     { 
      return LastName + ", " + FirstName; 
     } 
    } 

    public Person(string firstname, string lastname) 
    { 
     FirstName = firstname; 
     LastName = lastname; 
    } 
} 

Se non si dispone di una proprietà FullName, basta creare uno nel formato che si desidera per visualizzare il nome. Quindi impostare DisplayMember su FullName.

16

Vostri criteri dovrebbe essere come questo in GetEmployees() funzione.

"SELECT id,(lastname + ' ' + first_name) AS NAME FROM TABLE" 

cmbEmployees.DataSource = GetEmployees(); 
cmbEmployees.DisplayMember = "NAME"; 
cmbEmployees.ValueMember = "id"; 
+0

super love it – oozmac

38

Questo esempio ti guiderà come farlo senza modificare la classe base.

In primo luogo, è possibile lasciare il vostro DisplayMember con una proprietà, diciamo:

cmbEmployees.DisplayMember = "lastname"; 

Ora, vai al form in una modalità [Disegno], fare clic destro sul ComboBox -> Proprietà.

Nella parte superiore della finestra Proprietà, fare clic su Eventi (fulmini icona),

look per formato nella lista degli eventi in basso (sotto cambiato proprietà) e digitare c'è qualche nome dell'evento, diciamo: ComboBoxFormat, e premere Invio. Vedrete questo:

private void ComboBoxFormat(object sender, ListControlConvertEventArgs e) 
{ 

} 

E ora scrivere queste righe seguenti interna:

private void ComboBoxFormat(object sender, ListControlConvertEventArgs e) 
{ 
    // Assuming your class called Employee , and Firstname & Lastname are the fields 
    string lastname = ((Employee)e.ListItem).Firstname; 
    string firstname = ((Employee)e.ListItem).Lastname; 
    e.Value = lastname + " " + firstname; 
} 

Questo è tutto;)

+0

questa è una soluzione straordinaria –

+0

Soluzione molto pulita! Si noti che funziona bene anche se la classe sorgente NON è la tua. Ad esempio, ho bisogno per l'enumerazione System.IO.SerialPort, ora non ho bisogno di creare una classe ereditata "ad hoc". – tedebus

+0

Eliran, puoi spiegare come impostare questo? Dove hai ottenuto FirstName, non so cosa significhi un campo in questo caso. Collego la casella combinata utilizzando datatable e imposta Display e ValueMember sulla base dei nomi delle colonne datatable. – LuckyLuke82

2

in C# 6 creare proprietà di sola lettura nella classe Employee

public string FullName=>$"{lastname} {firstname}"; 

quindi

cmbEmployees.DataSource = GetEmployees(); 
//something like below line which doesn't work 
cmbEmployees.DisplayMember = "FullName";  
cmbEmployees.ValueMember = "id"; 
Problemi correlati