2011-06-20 18 views
54

Używam .NET 2.0 i próbuję powiązać źródło danych combobox z posortowanym słownikiem.Wiązanie Combobox Używanie słownika jako źródła danych

Błąd, który otrzymuję, to "właściwość DataMember" Klucz "nie można znaleźć w źródle danych".

 SortedDictionary<string, int> userCache = UserCache.getSortedUserValueCache(); 
     userListComboBox.DataSource = new BindingSource(userCache, "Key"); //This line is causing the error 
     userListComboBox.DisplayMember = "Key"; 
     userListComboBox.ValueMember = "Value"; 

Odpowiedz

105
SortedDictionary<string, int> userCache = new SortedDictionary<string, int> 
{ 
    {"a", 1}, 
    {"b", 2}, 
    {"c", 3} 
}; 
comboBox1.DataSource = new BindingSource(userCache, null); 
comboBox1.DisplayMember = "Key"; 
comboBox1.ValueMember = "Value"; 

Ale dlaczego ustawienie ValueMember do "Value", nie powinny być zobowiązane do "Key" (i DisplayMember do "Value", jak również)?

+0

Cóż, nie powinno to mieć znaczenia w żaden sposób. Ale może być sensownym przełączanie tych dwóch.Jednak problem, który mam, jest z "comboBox1.DataSource = new BindingSource (userCache, null);" Nie mogę tam wyciągnąć nic, ponieważ daje mi błąd. – user803952

+1

Jaki błąd, który faktycznie działa dla mnie? –

+1

"ArgumentException: Nie można powiązać nowego elementu wyświetlania. Nazwa parametru: newDisplayMember." Nie wiem, jaki błąd uzyskał user803952, ale jest to błąd * otrzymałem, gdy próbowałem to zrobić z 'IDictionary '. –

0

Jeśli to nie działa, dlaczego nie po prostu zrobić pętlę foreach nad słowniku dodaniu wszystkich przedmiotów do combobox?

foreach(var item in userCache) 
{ 
    userListComboBox.Items.Add(new ListItem(item.Key, item.Value)); 
} 
+0

oprawy i dodawanie elementów nie jest to samo. Cóż, może tego właśnie potrzebuje OP, kto wie? ;) – jv42

+0

Wiem, ale nie widzę żadnego kodu, który jest zależny od samego wiązania danych. – thekip

+0

Dobrze, co zasugerowałeś, ale działa "nowy ListItem" w przestrzeni nazw System.Web.UIWebControls i nie zaimportowałbym tego dla aplikacji formularza Windows. – user803952

2

Słownik nie może być bezpośrednio używany jako źródło danych, powinieneś zrobić więcej.

SortedDictionary<string, int> userCache = UserCache.getSortedUserValueCache(); 
KeyValuePair<string, int> [] ar= new KeyValuePair<string,int>[userCache.Count]; 
userCache.CopyTo(ar, 0); 
comboBox1.DataSource = ar; new BindingSource(ar, "Key"); //This line is causing the error 
comboBox1.DisplayMember = "Value"; 
comboBox1.ValueMember = "Key"; 
18

Użyłem rozwiązania Sorin Comanescu, ale trafiłem na problem, próbując uzyskać wybraną wartość. Mój combobox był comboboxem z toolstripem. Użyłem właściwości "combobox", która eksponuje zwykły combobox.

miałem kod

Dictionary<Control, string> controls = new Dictionary<Control, string>(); 

wiązania (rozwiązanie Sorin Comănescu za - działa jak czar):

controls.Add(pictureBox1, "Image"); 
controls.Add(dgvText, "Text"); 
cbFocusedControl.ComboBox.DataSource = new BindingSource(controls, null); 
cbFocusedControl.ComboBox.ValueMember = "Key"; 
cbFocusedControl.ComboBox.DisplayMember = "Value"; 

Problem polegał na tym, że gdy próbowałem się dostać wybraną wartość, ja nie zrobił” t sobie sprawę, jak go odzyskać. Po kilku próbach dostałem to:

var control = ((KeyValuePair<Control, string>) cbFocusedControl.ComboBox.SelectedItem).Key 

Mam nadzieję, że pomaga komuś innemu!

+0

Działa to, użyłem następujących w moim własnym kodem, aby go uruchomić. https://gist.github.com/psykzz/5374823 – PsyKzz

+0

Możesz także zrobić to w następujący sposób (otrzymując wybraną wartość): var value = comboBox.SelectedItem; var someItem = value.GetType(). GetProperty ("Key"). GetValue (wartość, null); –

+1

Ostatni wiersz można również zredukować do: var control = ((KeyValuePair ) cbFocusedControl.ComboBox.SelectedItem) .Key; 1) niepotrzebne nawiasy zewnętrzne, 2) kompilator wie, że klucz jest formantem, ponieważ odlewa się do KeyValuePair , więc rzutowanie na Sterowanie nie jest potrzebne. –

3
userListComboBox.DataSource = userCache.ToList(); 
userListComboBox.DisplayMember = "Key"; 
6
 var colors = new Dictionary < string, string >(); 
     colors["10"] = "Red"; 

Binding do ComboBox

 comboBox1.DataSource = new BindingSource(colors, null); 
     comboBox1.DisplayMember = "Value"; 
     comboBox1.ValueMember = "Key"; 

pełne źródła ... Dictionary as a Combobox Datasource

Jeryy

0

Zastosowanie ->

comboBox1.DataSource = colors.ToList(); 

Jeśli słownik nie jest konwertowany na listę, pole kombi nie może rozpoznać jego członków.

0

prostu staram się robić tak ....

SortedDictionary<string, int> userCache = UserCache.getSortedUserValueCache(); 

    // Add this code 
    if(userCache != null) 
    { 
     userListComboBox.DataSource = new BindingSource(userCache, null); // Key => null 
     userListComboBox.DisplayMember = "Key"; 
     userListComboBox.ValueMember = "Value"; 
    } 
Powiązane problemy