2009-06-17 3 views
21

chciałabym związać ComboBox Do DataTable (nie mogę zmieniać swój pierwotny schemat)Jak powiązać składnik ComboBox, aby wywołanie było konkatantem 2 pól źródłowych datatable?

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

chcę ComboBox pokazać tbldata.Name + tbldata.Surname.

Oczywiście dodanie nowego imię + nazwisko jako pole do tbldata tuż przed wiążący jest możliwe, ale mam nadzieję na bardziej eleganckie rozwiązanie wzdłuż linii (Pseudokod)

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

Odpowiedz

25

Obliczone rozwiązanie dla kolumny jest prawdopodobnie najlepsze. Ale jeśli nie możesz zmienić schematu tabeli danych, aby go dodać, możesz przechodzić przez tabelę i wypełniać nową kolekcję, która będzie służyć jako źródło danych.

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(); 

Oczywiście to nie jest tak wydajnych jak wiązanie bezpośrednio do DataTable, ale nie będę się o to martwić, chyba że tabela ma tysiące wierszy.

+0

Właśnie to, czego potrzebowałem dzięki. – callisto

5

Chciałbym utworzyć właściwość na obiekt danych map, które następnie do DataTextField

Data Object

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

Code-za

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

Masz nieruchomość w swojej klasie, który jest concat imienia i nazwiska. I przywiąż DataTextField do tej właściwości.

W przypadku, gdy wiążesz go z DataTable, możesz dodać nową kolumnę do DataTable, którego wartości są konkat Nazwa i Nazwisko i wiążą go do combo.

+0

Zgadzam się, nie mogę myśleć o innej drodze – AlexDrenea

+0

Ponieważ jest to tylko prosta wykorzystania przy użyciu klasę jako podstawa do tego jest przesadą . – callisto

+0

Miałem na myśli, jeśli klasa jest już używana. –

17

Najprostszym sposobem jest stworzenie nowej kolumna obliczeniowa w DataTable, używając właściwości Expression:

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

Podoba mi się to znacznie lepiej niż sugestie, które ludzie ciągle robią na temat modyfikowania obiektu danych i tworzenia nowej właściwości. – TheTXI

+0

eleganckie rozwiązanie – Ramu

1

Wystarczy popatrzeć na kolumnach obliczeniowych wykorzystujących właściwości DataColumn Expression.

0

Można zarejestrować zdarzenie wiązania kombi i powtórzyć elementy, ustawiając każdy tekst elementu na żądane pola za pomocą elementu danych elementu combobox.

2

lub wdrożenia „Format” zdarzenie tak:

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

Najbardziej przydatne! Dzięki. –

Powiązane problemy