W C # WinApp, jak mogę dodać zarówno tekst, jak i wartość do elementów mojego ComboBox? Przeprowadziłem wyszukiwanie i zwykle odpowiedzi używają „Powiązania ze źródłem” .. ale w moim przypadku nie mam gotowego źródła powiązania w moim programie ... Jak mogę zrobić coś takiego:
combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"
źródło
Możesz użyć anonimowej klasy w następujący sposób:
AKTUALIZACJA: Chociaż powyższy kod będzie poprawnie wyświetlany w polu kombi, nie będziesz mógł używać
SelectedValue
aniSelectedText
właściwościComboBox
. Aby móc z nich skorzystać, powiąż pole kombi, jak poniżej:źródło
List<Object> items = new List<Object>();
Następnie mogłem użyć metodyitems.Add( new { Text = "report A", Value = "reportA" } );
w pętli.comboBox.SelectedItem.GetType().GetProperty("Value").GetValue(comboBox.SelectedItem, null)
DataSource
, możesz użyć właściwościSelectedValue
lubSelectedText
właściwości combobox, więc nie musisz wykonywać żadnych specjalnych rzutów.Należy użyć
dynamic
obiektu do rozwiązania elementu combobox w czasie wykonywania.źródło
Możesz użyć
Dictionary
Object zamiast tworzyć niestandardową klasę do dodawania tekstu i wartości wCombobox
.Dodaj klucze i wartości w
Dictionary
obiekcie:Powiąż źródłowy obiekt Dictionary z
Combobox
:Pobierz klucz i wartość:
Pełne źródło: Combobox Text nd Value
źródło
Oto jeden ze sposobów, który właśnie przyszedł mi do głowy:
combo1.Items.Add(new ListItem("Text", "Value"))
Aby zmienić tekst lub wartość przedmiotu, możesz to zrobić w następujący sposób:
W formularzach Windows nie ma klasy o nazwie ListItem . Istnieje tylko w ASP.NET , więc przed użyciem musisz napisać własną klasę, tak samo jak @Adam Markowitz w swojej odpowiedzi .
Sprawdź również te strony, mogą one pomóc:
Jak dodać element do combobox
Instrukcje: dodawanie i usuwanie elementów z kontrolki ComboBox, ListBox lub CheckedListBox formularzy Windows Forms
źródło
Nie wiem, czy to zadziała w sytuacji podanej w oryginalnym poście (nie wspominając o tym, że to dwa lata później), ale ten przykład działa dla mnie:
Aby ponownie odczytać wartość, musisz rzutować właściwość SelectedItem na obiekt DictionaryEntry, a następnie możesz ocenić jej właściwości Key i Value. Na przykład:
źródło
źródło
Jeśli ktoś nadal jest tym zainteresowany, oto prosta i elastyczna klasa dla elementu combobox z tekstem i wartością dowolnego typu (bardzo podobny do przykładu Adama Markowitza):
Używanie
<T>
jest lepsze niż zadeklarowanievalue
jakoobject
, ponieważobject
wtedy będziesz musiał śledzić typ użyty dla każdego elementu i rzucić go w kodzie, aby użyć go poprawnie.Używam go od dłuższego czasu. To jest naprawdę przydatne.
źródło
Podobało mi się odpowiedź Fab, ale nie chciałem używać słownika dla mojej sytuacji, więc zastąpiłem listę krotek.
źródło
Przykład użycia DataTable:
źródło
Możesz użyć tego kodu, aby wstawić niektóre elementy do pola kombi z tekstem i wartością.
DO#
XAML
źródło
Oprócz odpowiedzi Adama Markowitza, tutaj jest ogólny sposób (względnie) po prostu ustawiania
ItemSource
wartości comboboxaenums
, przy jednoczesnym pokazywaniu użytkownikowi atrybutu „Opis”. (Można by pomyśleć, że każdy chciałby to zrobić, aby był to .NET jeden liner, ale tak po prostu nie jest i jest to najbardziej elegancki sposób, jaki znalazłem).Najpierw utwórz tę prostą klasę do konwersji dowolnej wartości Enum na element ComboBox:
Po drugie w swojej
OnLoad
obsługi zdarzeń, trzeba ustawić źródło swojego pola kombi będzie wykazComboEnumItems
na podstawie każdyEnum
w swoimEnum
rodzaju. Można to osiągnąć za pomocą Linq. Następnie ustawDisplayMemberPath
:Teraz użytkownik wybierze z listy przyjaznych dla użytkownika
Descriptions
, ale wybierzeenum
wartość, której można użyć w kodzie. Aby uzyskać dostęp do wyboru użytkownika w kodzie,comboBoxUserReadable.SelectedItem
będzieComboEnumItem
icomboBoxUserReadable.SelectedValue
będzieEMyEnum
.źródło
Możesz użyć ogólnego typu:
Przykład użycia prostej int-Type:
źródło
Miałem ten sam problem, dodałem nowy
ComboBox
z wartością tylko w tym samym indeksie, co pierwszy, a potem, gdy zmieniam główną kombinację, indeks w drugim zmienia się w tym samym czasie, a następnie biorę wartość drugiego zestawu i użyj go.To jest kod:
źródło
Kreacja klasowa:
Kody Form1:
źródło
Tak to robi Visual Studio 2013:
Pojedynczy przedmiot:
Wiele przedmiotów:
Nie trzeba wykonywać przesłonięć klas ani uwzględniać niczego innego. I tak, połączenia
comboBox1->SelectedItem
icomboBox1->SelectedIndex
nadal działają.źródło
Jest to podobne do niektórych innych odpowiedzi, ale jest kompaktowe i pozwala uniknąć konwersji na słownik, jeśli masz już listę.
Biorąc pod uwagę
ComboBox
„combobox” w formularzu systemu Windows i klasęSomeClass
zstring
właściwością typeName
,Co oznacza, że SelectedItem jest
SomeClass
obiektem odlist
, a każdy element wcombobox
będzie wyświetlany przy użyciu jego nazwy.źródło
DisplayMember
wcześniej ... Zawsze zapominam, że istnieje. Przyzwyczaiłem się do rozwiązania, które znalazłem, zanim zwróciłem uwagę na tę właściwość, również nie zawsze pomoże. Nie wszystkie klasy mająName
lubTag
mienia, lub mają własności ciągów, które mogą być stosowane arbitralnie jako wyświetlanego tekstu.base.Method();
), a także musiałbyś stworzyć klasę pochodną dla każdego innego typu, który chcesz dodać do pól kombi lub pól listy. Klasa, którą stworzyłem, jest elastyczna, można jej używać z każdym rodzajem bez dodatkowego wysiłku. Spójrz poniżej na moją odpowiedź i powiedz mi, co myślisz :)Jest to bardzo proste rozwiązanie dla formularzy Windows, jeśli wszystko jest potrzebne, to końcowa wartość jako (ciąg). Nazwy przedmiotów zostaną wyświetlone w polu kombi, a wybraną wartość można łatwo porównać.
a na module obsługi zdarzeń pobierz wartość (ciąg) wybranej wartości
źródło
Lepsze rozwiązanie tutaj;
Odzyskaj dane
źródło