2009-06-17 4 views
21

mi piacerebbe associare un ComboBox ad un DataTable (non riesco a modificare il suo schema originale)Come si associa un ComboBox in modo che il displaymember sia concat di 2 campi di origine datatable?

cbo.DataSource = tbldata; 
cbo.DataTextField = "Name"; 
cbo.DataValueField = "GUID"; 
cbo.DataBind(); 

voglio il ComboBox mostrano tbldata.Name + tbldata.Surname.

Naturalmente l'aggiunta del nuovo nome + cognome come un campo alla tbldata poco prima vincolante è possibile, ma spero in una soluzione più elegante lungo le linee di (pseudo)

cbo.DataTextField = "Name"; 
cbo.DataTextField += "Surname"; 

risposta

25

La soluzione di colonna calcolata è probabilmente la migliore. Tuttavia, se non è possibile modificare lo schema della tabella di dati per aggiungerlo, è possibile eseguire il ciclo della tabella e popolare una nuova raccolta che fungerà da origine dati.

var dict = new Dictionary<Guid, string>(); 
foreach (DataRow row in dt.Rows) 
{ 
    dict.Add(row["GUID"], row["Name"] + " " + row["Surname"]); 
} 
cbo.DataSource = dict; 
cbo.DataTextField = "Value"; 
cbo.DataValueField = "Key"; 
cbo.DataBind(); 

Ovviamente questo non è così performante come legandosi direttamente al DataTable, ma io non mi preoccuperei che a meno che la tabella ha migliaia di righe.

+0

Proprio quello di cui avevo bisogno, grazie. – callisto

5

vorrei creare una proprietà sulla vostra oggetto dati poi la mappa che al DataTextField

Data Object

public string FullName 
{ 
    get { return Name + " " + Surname; } 
} 

Codice-dietro

cbo.DataSource = tbldata; 
cbo.DataTextField = "FullName"; 
cbo.DataValueField = "GUID"; 
cbo.DataBind(); 
2

avere una proprietà nella classe che è la concat di nome e cognome. E associare DataTextField a questa proprietà.

Nel caso di associazione a un DataTable, è possibile aggiungere una nuova colonna al DataTable i cui valori sono concat di Nome e Cognome e associarlo alla combinazione.

+0

sono d'accordo, non si può pensare ad un altro modo – AlexDrenea

+0

Dal momento che questo è solo un semplice da usare, con una classe come base per questo è eccessivo . – callisto

+0

Intendevo se una classe è già in uso. –

17

Il modo più semplice è quello di creare una nuova colonna calcolata nel DataTable, utilizzando la proprietà Expression:

tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname"); 
... 
cbo.DataTextField = "FullName"; 
+1

Mi piace molto di più dei suggerimenti che le persone continuano a fare sulla modifica dell'oggetto dati e sulla creazione di una nuova proprietà. – TheTXI

+0

soluzione elegante – Ramu

1

Dai un'occhiata alla colonne calcolate utilizzando la proprietà Expression di DataColumn.

0

È possibile registrare l'evento di rilegatura combinata e iterare gli elementi, impostando ciascun testo di elemento nei campi desiderati utilizzando l'elemento di dati dell'articolo della casella combinata.

2

o implementare evento 'Format' in questo modo:

DataRow r = ((DataRowView)e.ListItem).Row; 
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ]; 
+0

Più utile! Grazie. –